@with-logic/elwood 0.1.3 → 0.2.1
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 +389 -2
- package/CONTRIBUTING.md +29 -18
- package/README.md +34 -7
- package/dist/bridge/parse.d.ts.map +1 -1
- package/dist/bridge/parse.js +2 -1
- package/dist/bridge/parse.js.map +1 -1
- package/dist/bridge/server.d.ts.map +1 -1
- package/dist/bridge/server.js +6 -2
- package/dist/bridge/server.js.map +1 -1
- package/dist/claude/attach-images.d.ts +3 -1
- package/dist/claude/attach-images.d.ts.map +1 -1
- package/dist/claude/attach-images.js +11 -10
- package/dist/claude/attach-images.js.map +1 -1
- package/dist/claude/composer/empty-input.d.ts +4 -0
- package/dist/claude/composer/empty-input.d.ts.map +1 -0
- package/dist/claude/composer/empty-input.js +28 -0
- package/dist/claude/composer/empty-input.js.map +1 -0
- package/dist/claude/composer/footer.d.ts +3 -0
- package/dist/claude/composer/footer.d.ts.map +1 -0
- package/dist/claude/composer/footer.js +3 -0
- package/dist/claude/composer/footer.js.map +1 -0
- package/dist/claude/composer/staged-input.d.ts +7 -0
- package/dist/claude/composer/staged-input.d.ts.map +1 -0
- package/dist/claude/composer/staged-input.js +18 -0
- package/dist/claude/composer/staged-input.js.map +1 -0
- package/dist/claude/hooks/common-result.d.ts +5 -0
- package/dist/claude/hooks/common-result.d.ts.map +1 -0
- package/dist/claude/hooks/common-result.js +3 -0
- package/dist/claude/hooks/common-result.js.map +1 -0
- package/dist/claude/hooks/dispatch.d.ts +2 -1
- package/dist/claude/hooks/dispatch.d.ts.map +1 -1
- package/dist/claude/hooks/dispatch.js +3 -1
- package/dist/claude/hooks/dispatch.js.map +1 -1
- package/dist/claude/hooks/events-extra.d.ts +5 -4
- package/dist/claude/hooks/events-extra.d.ts.map +1 -1
- package/dist/claude/hooks/index.d.ts +10 -10
- package/dist/claude/hooks/index.d.ts.map +1 -1
- package/dist/claude/hooks/index.js +1 -4
- package/dist/claude/hooks/index.js.map +1 -1
- package/dist/claude/hooks/inputs/control.d.ts +25 -0
- package/dist/claude/hooks/inputs/control.d.ts.map +1 -0
- package/dist/claude/hooks/inputs/control.js +3 -0
- package/dist/claude/hooks/inputs/control.js.map +1 -0
- package/dist/claude/hooks/stop-failure.d.ts +10 -0
- package/dist/claude/hooks/stop-failure.d.ts.map +1 -0
- package/dist/claude/hooks/stop-failure.js +18 -0
- package/dist/claude/hooks/stop-failure.js.map +1 -0
- package/dist/claude/hooks/tool-types.d.ts +12 -10
- package/dist/claude/hooks/tool-types.d.ts.map +1 -1
- package/dist/claude/login/notice.d.ts +3 -0
- package/dist/claude/login/notice.d.ts.map +1 -0
- package/dist/claude/login/notice.js +3 -0
- package/dist/claude/login/notice.js.map +1 -0
- package/dist/claude/login/renewal.d.ts +13 -0
- package/dist/claude/login/renewal.d.ts.map +1 -0
- package/dist/claude/login/renewal.js +97 -0
- package/dist/claude/login/renewal.js.map +1 -0
- package/dist/claude/model-composer.d.ts +2 -0
- package/dist/claude/model-composer.d.ts.map +1 -0
- package/dist/claude/model-composer.js +12 -0
- package/dist/claude/model-composer.js.map +1 -0
- package/dist/claude/model-picker.d.ts.map +1 -1
- package/dist/claude/model-picker.js +42 -8
- package/dist/claude/model-picker.js.map +1 -1
- package/dist/claude/model-switch-confirmation.d.ts +6 -0
- package/dist/claude/model-switch-confirmation.d.ts.map +1 -1
- package/dist/claude/model-switch-confirmation.js +77 -4
- package/dist/claude/model-switch-confirmation.js.map +1 -1
- package/dist/claude/preflight.d.ts.map +1 -1
- package/dist/claude/preflight.js +2 -4
- package/dist/claude/preflight.js.map +1 -1
- package/dist/claude/questions/answer.d.ts +9 -0
- package/dist/claude/questions/answer.d.ts.map +1 -0
- package/dist/claude/questions/answer.js +84 -0
- package/dist/claude/questions/answer.js.map +1 -0
- package/dist/claude/questions/bind-answers.d.ts +14 -0
- package/dist/claude/questions/bind-answers.d.ts.map +1 -0
- package/dist/claude/questions/bind-answers.js +36 -0
- package/dist/claude/questions/bind-answers.js.map +1 -0
- package/dist/claude/questions/candidate.d.ts +23 -0
- package/dist/claude/questions/candidate.d.ts.map +1 -0
- package/dist/claude/questions/candidate.js +47 -0
- package/dist/claude/questions/candidate.js.map +1 -0
- package/dist/claude/questions/correlation.d.ts +15 -0
- package/dist/claude/questions/correlation.d.ts.map +1 -0
- package/dist/claude/questions/correlation.js +23 -0
- package/dist/claude/questions/correlation.js.map +1 -0
- package/dist/claude/questions/hook-decisions.d.ts +19 -0
- package/dist/claude/questions/hook-decisions.d.ts.map +1 -0
- package/dist/claude/questions/hook-decisions.js +52 -0
- package/dist/claude/questions/hook-decisions.js.map +1 -0
- package/dist/claude/questions/index.d.ts +27 -0
- package/dist/claude/questions/index.d.ts.map +1 -0
- package/dist/claude/questions/index.js +161 -0
- package/dist/claude/questions/index.js.map +1 -0
- package/dist/claude/questions/navigation.d.ts +24 -0
- package/dist/claude/questions/navigation.d.ts.map +1 -0
- package/dist/claude/questions/navigation.js +37 -0
- package/dist/claude/questions/navigation.js.map +1 -0
- package/dist/claude/questions/rows.d.ts +19 -0
- package/dist/claude/questions/rows.d.ts.map +1 -0
- package/dist/claude/questions/rows.js +64 -0
- package/dist/claude/questions/rows.js.map +1 -0
- package/dist/claude/questions/screen.d.ts +29 -0
- package/dist/claude/questions/screen.d.ts.map +1 -0
- package/dist/claude/questions/screen.js +103 -0
- package/dist/claude/questions/screen.js.map +1 -0
- package/dist/claude/screen-table.d.ts +19 -2
- package/dist/claude/screen-table.d.ts.map +1 -1
- package/dist/claude/screen-table.js +48 -4
- package/dist/claude/screen-table.js.map +1 -1
- package/dist/claude/serialize.d.ts.map +1 -1
- package/dist/claude/serialize.js +22 -6
- package/dist/claude/serialize.js.map +1 -1
- package/dist/claude/session/build.d.ts +1 -12
- package/dist/claude/session/build.d.ts.map +1 -1
- package/dist/claude/session/build.js +42 -55
- package/dist/claude/session/build.js.map +1 -1
- package/dist/claude/session/hook-handler.d.ts +3 -2
- package/dist/claude/session/hook-handler.d.ts.map +1 -1
- package/dist/claude/session/hook-handler.js +44 -18
- package/dist/claude/session/hook-handler.js.map +1 -1
- package/dist/claude/session/index.d.ts +2 -1
- package/dist/claude/session/index.d.ts.map +1 -1
- package/dist/claude/session/index.js +23 -8
- package/dist/claude/session/index.js.map +1 -1
- package/dist/claude/session/instance.d.ts +17 -5
- package/dist/claude/session/instance.d.ts.map +1 -1
- package/dist/claude/session/instance.js +25 -12
- package/dist/claude/session/instance.js.map +1 -1
- package/dist/claude/session/interface.d.ts +2 -1
- package/dist/claude/session/interface.d.ts.map +1 -1
- package/dist/claude/session/questions.d.ts +9 -0
- package/dist/claude/session/questions.d.ts.map +1 -0
- package/dist/claude/session/questions.js +19 -0
- package/dist/claude/session/questions.js.map +1 -0
- package/dist/claude/session/resume.d.ts.map +1 -1
- package/dist/claude/session/resume.js +35 -26
- package/dist/claude/session/resume.js.map +1 -1
- package/dist/claude/session/runtime.d.ts +10 -0
- package/dist/claude/session/runtime.d.ts.map +1 -1
- package/dist/claude/session/runtime.js +8 -5
- package/dist/claude/session/runtime.js.map +1 -1
- package/dist/claude/session/startup-warnings.d.ts +5 -0
- package/dist/claude/session/startup-warnings.d.ts.map +1 -0
- package/dist/claude/session/startup-warnings.js +7 -0
- package/dist/claude/session/startup-warnings.js.map +1 -0
- package/dist/claude/session/transcript.d.ts +2 -0
- package/dist/claude/session/transcript.d.ts.map +1 -1
- package/dist/claude/session/transcript.js +21 -3
- package/dist/claude/session/transcript.js.map +1 -1
- package/dist/claude/startup-prompts.d.ts +35 -3
- package/dist/claude/startup-prompts.d.ts.map +1 -1
- package/dist/claude/startup-prompts.js +81 -15
- package/dist/claude/startup-prompts.js.map +1 -1
- package/dist/claude/transcript/index.d.ts.map +1 -1
- package/dist/claude/transcript/index.js +3 -2
- package/dist/claude/transcript/index.js.map +1 -1
- package/dist/claude/validate/event-fields.d.ts +6 -0
- package/dist/claude/validate/event-fields.d.ts.map +1 -0
- package/dist/claude/validate/event-fields.js +103 -0
- package/dist/claude/validate/event-fields.js.map +1 -0
- package/dist/claude/validate/input.d.ts.map +1 -1
- package/dist/claude/validate/input.js +12 -41
- package/dist/claude/validate/input.js.map +1 -1
- package/dist/claude/validate/shapes.d.ts +1 -1
- package/dist/claude/validate/shapes.d.ts.map +1 -1
- package/dist/claude/validate/shapes.js +1 -1
- package/dist/claude/validate/shapes.js.map +1 -1
- package/dist/claude/validate/tool-shapes.d.ts +102 -0
- package/dist/claude/validate/tool-shapes.d.ts.map +1 -0
- package/dist/claude/validate/tool-shapes.js +83 -0
- package/dist/claude/validate/tool-shapes.js.map +1 -0
- package/dist/claude/validate/tool-update.d.ts +2 -11
- package/dist/claude/validate/tool-update.d.ts.map +1 -1
- package/dist/claude/validate/tool-update.js +11 -112
- package/dist/claude/validate/tool-update.js.map +1 -1
- package/dist/claude/validate/tool-values.d.ts +7 -0
- package/dist/claude/validate/tool-values.d.ts.map +1 -0
- package/dist/claude/validate/tool-values.js +30 -0
- package/dist/claude/validate/tool-values.js.map +1 -0
- package/dist/cli/args/options.d.ts.map +1 -1
- package/dist/cli/args/options.js +1 -0
- package/dist/cli/args/options.js.map +1 -1
- package/dist/cli/args-commands.d.ts.map +1 -1
- package/dist/cli/args-commands.js +3 -0
- package/dist/cli/args-commands.js.map +1 -1
- package/dist/cli/config/store.d.ts.map +1 -1
- package/dist/cli/config/store.js +2 -1
- package/dist/cli/config/store.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/interactive/effort.d.ts +5 -0
- package/dist/cli/interactive/effort.d.ts.map +1 -0
- package/dist/cli/interactive/effort.js +13 -0
- package/dist/cli/interactive/effort.js.map +1 -0
- package/dist/cli/interactive/launch.d.ts.map +1 -1
- package/dist/cli/interactive/launch.js +1 -1
- package/dist/cli/interactive/launch.js.map +1 -1
- package/dist/cli/lifecycle/index.d.ts +3 -6
- package/dist/cli/lifecycle/index.d.ts.map +1 -1
- package/dist/cli/lifecycle/index.js +6 -13
- package/dist/cli/lifecycle/index.js.map +1 -1
- package/dist/cli/models/settings.d.ts +2 -0
- package/dist/cli/models/settings.d.ts.map +1 -1
- package/dist/cli/request/index.d.ts.map +1 -1
- package/dist/cli/request/index.js +1 -0
- package/dist/cli/request/index.js.map +1 -1
- package/dist/cli/run/index.d.ts.map +1 -1
- package/dist/cli/run/index.js +3 -1
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/run/output.d.ts.map +1 -1
- package/dist/cli/run/output.js +1 -0
- package/dist/cli/run/output.js.map +1 -1
- package/dist/cli/run/subscribe.js +1 -1
- package/dist/cli/run/subscribe.js.map +1 -1
- package/dist/cli/session/index.d.ts +2 -0
- package/dist/cli/session/index.d.ts.map +1 -1
- package/dist/cli/session/index.js +3 -0
- package/dist/cli/session/index.js.map +1 -1
- package/dist/cli/session/launch.d.ts +0 -3
- package/dist/cli/session/launch.d.ts.map +1 -1
- package/dist/cli/session/launch.js +0 -11
- package/dist/cli/session/launch.js.map +1 -1
- package/dist/cli/sessions/list.d.ts.map +1 -1
- package/dist/cli/sessions/list.js +5 -4
- package/dist/cli/sessions/list.js.map +1 -1
- package/dist/cli/types.d.ts +2 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/update-attention.d.ts +2 -1
- package/dist/cli/update-attention.d.ts.map +1 -1
- package/dist/cli/update-attention.js +11 -2
- package/dist/cli/update-attention.js.map +1 -1
- package/dist/codex/accepted-turn.d.ts +4 -0
- package/dist/codex/accepted-turn.d.ts.map +1 -0
- package/dist/codex/accepted-turn.js +17 -0
- package/dist/codex/accepted-turn.js.map +1 -0
- package/dist/codex/config/transaction.d.ts +22 -0
- package/dist/codex/config/transaction.d.ts.map +1 -1
- package/dist/codex/config/transaction.js +61 -31
- package/dist/codex/config/transaction.js.map +1 -1
- package/dist/codex/hooks/index.d.ts +6 -1
- package/dist/codex/hooks/index.d.ts.map +1 -1
- package/dist/codex/hooks/validate-result.d.ts.map +1 -1
- package/dist/codex/hooks/validate-result.js +2 -1
- package/dist/codex/hooks/validate-result.js.map +1 -1
- package/dist/codex/hooks/validate.d.ts.map +1 -1
- package/dist/codex/hooks/validate.js +1 -3
- package/dist/codex/hooks/validate.js.map +1 -1
- package/dist/codex/hooks/values.d.ts +3 -0
- package/dist/codex/hooks/values.d.ts.map +1 -0
- package/dist/codex/hooks/values.js +5 -0
- package/dist/codex/hooks/values.js.map +1 -0
- package/dist/codex/images/attach.d.ts +3 -1
- package/dist/codex/images/attach.d.ts.map +1 -1
- package/dist/codex/images/attach.js +10 -11
- package/dist/codex/images/attach.js.map +1 -1
- package/dist/codex/images/clipboard.d.ts.map +1 -1
- package/dist/codex/images/clipboard.js +11 -3
- package/dist/codex/images/clipboard.js.map +1 -1
- package/dist/codex/model-picker.d.ts.map +1 -1
- package/dist/codex/model-picker.js +23 -5
- package/dist/codex/model-picker.js.map +1 -1
- package/dist/codex/preflight.d.ts.map +1 -1
- package/dist/codex/preflight.js +2 -2
- package/dist/codex/preflight.js.map +1 -1
- package/dist/codex/questions/acceptance.d.ts +18 -0
- package/dist/codex/questions/acceptance.d.ts.map +1 -0
- package/dist/codex/questions/acceptance.js +70 -0
- package/dist/codex/questions/acceptance.js.map +1 -0
- package/dist/codex/questions/adapter.d.ts +26 -0
- package/dist/codex/questions/adapter.d.ts.map +1 -0
- package/dist/codex/questions/adapter.js +163 -0
- package/dist/codex/questions/adapter.js.map +1 -0
- package/dist/codex/questions/candidate-acceptance.d.ts +5 -0
- package/dist/codex/questions/candidate-acceptance.d.ts.map +1 -0
- package/dist/codex/questions/candidate-acceptance.js +8 -0
- package/dist/codex/questions/candidate-acceptance.js.map +1 -0
- package/dist/codex/questions/candidate-authority.d.ts +10 -0
- package/dist/codex/questions/candidate-authority.d.ts.map +1 -0
- package/dist/codex/questions/candidate-authority.js +25 -0
- package/dist/codex/questions/candidate-authority.js.map +1 -0
- package/dist/codex/questions/candidate-disable.d.ts +5 -0
- package/dist/codex/questions/candidate-disable.d.ts.map +1 -0
- package/dist/codex/questions/candidate-disable.js +14 -0
- package/dist/codex/questions/candidate-disable.js.map +1 -0
- package/dist/codex/questions/candidate-publication.d.ts +7 -0
- package/dist/codex/questions/candidate-publication.d.ts.map +1 -0
- package/dist/codex/questions/candidate-publication.js +8 -0
- package/dist/codex/questions/candidate-publication.js.map +1 -0
- package/dist/codex/questions/candidate-reservation.d.ts +6 -0
- package/dist/codex/questions/candidate-reservation.d.ts.map +1 -0
- package/dist/codex/questions/candidate-reservation.js +7 -0
- package/dist/codex/questions/candidate-reservation.js.map +1 -0
- package/dist/codex/questions/candidate-store.d.ts +53 -0
- package/dist/codex/questions/candidate-store.d.ts.map +1 -0
- package/dist/codex/questions/candidate-store.js +188 -0
- package/dist/codex/questions/candidate-store.js.map +1 -0
- package/dist/codex/questions/candidate.d.ts +40 -0
- package/dist/codex/questions/candidate.d.ts.map +1 -0
- package/dist/codex/questions/candidate.js +39 -0
- package/dist/codex/questions/candidate.js.map +1 -0
- package/dist/codex/questions/candidates.d.ts +16 -0
- package/dist/codex/questions/candidates.d.ts.map +1 -0
- package/dist/codex/questions/candidates.js +113 -0
- package/dist/codex/questions/candidates.js.map +1 -0
- package/dist/codex/questions/chrome.d.ts +10 -0
- package/dist/codex/questions/chrome.d.ts.map +1 -0
- package/dist/codex/questions/chrome.js +21 -0
- package/dist/codex/questions/chrome.js.map +1 -0
- package/dist/codex/questions/definitions.d.ts +19 -0
- package/dist/codex/questions/definitions.d.ts.map +1 -0
- package/dist/codex/questions/definitions.js +86 -0
- package/dist/codex/questions/definitions.js.map +1 -0
- package/dist/codex/questions/draft.d.ts +25 -0
- package/dist/codex/questions/draft.d.ts.map +1 -0
- package/dist/codex/questions/draft.js +76 -0
- package/dist/codex/questions/draft.js.map +1 -0
- package/dist/codex/questions/driver-support.d.ts +6 -0
- package/dist/codex/questions/driver-support.d.ts.map +1 -0
- package/dist/codex/questions/driver-support.js +7 -0
- package/dist/codex/questions/driver-support.js.map +1 -0
- package/dist/codex/questions/driver.d.ts +10 -0
- package/dist/codex/questions/driver.d.ts.map +1 -0
- package/dist/codex/questions/driver.js +139 -0
- package/dist/codex/questions/driver.js.map +1 -0
- package/dist/codex/questions/frame.d.ts +36 -0
- package/dist/codex/questions/frame.d.ts.map +1 -0
- package/dist/codex/questions/frame.js +138 -0
- package/dist/codex/questions/frame.js.map +1 -0
- package/dist/codex/questions/labels.d.ts +6 -0
- package/dist/codex/questions/labels.d.ts.map +1 -0
- package/dist/codex/questions/labels.js +6 -0
- package/dist/codex/questions/labels.js.map +1 -0
- package/dist/codex/questions/limits.d.ts +18 -0
- package/dist/codex/questions/limits.d.ts.map +1 -0
- package/dist/codex/questions/limits.js +61 -0
- package/dist/codex/questions/limits.js.map +1 -0
- package/dist/codex/questions/native-pending.d.ts +7 -0
- package/dist/codex/questions/native-pending.d.ts.map +1 -0
- package/dist/codex/questions/native-pending.js +37 -0
- package/dist/codex/questions/native-pending.js.map +1 -0
- package/dist/codex/questions/owned-editor.d.ts +12 -0
- package/dist/codex/questions/owned-editor.d.ts.map +1 -0
- package/dist/codex/questions/owned-editor.js +37 -0
- package/dist/codex/questions/owned-editor.js.map +1 -0
- package/dist/codex/questions/pending-submissions.d.ts +12 -0
- package/dist/codex/questions/pending-submissions.d.ts.map +1 -0
- package/dist/codex/questions/pending-submissions.js +42 -0
- package/dist/codex/questions/pending-submissions.js.map +1 -0
- package/dist/codex/questions/records.d.ts +29 -0
- package/dist/codex/questions/records.d.ts.map +1 -0
- package/dist/codex/questions/records.js +113 -0
- package/dist/codex/questions/records.js.map +1 -0
- package/dist/codex/questions/selection.d.ts +3 -0
- package/dist/codex/questions/selection.d.ts.map +1 -0
- package/dist/codex/questions/selection.js +18 -0
- package/dist/codex/questions/selection.js.map +1 -0
- package/dist/codex/questions/session.d.ts +6 -0
- package/dist/codex/questions/session.d.ts.map +1 -0
- package/dist/codex/questions/session.js +21 -0
- package/dist/codex/questions/session.js.map +1 -0
- package/dist/codex/screen/clearance.d.ts +17 -0
- package/dist/codex/screen/clearance.d.ts.map +1 -0
- package/dist/codex/screen/clearance.js +170 -0
- package/dist/codex/screen/clearance.js.map +1 -0
- package/dist/codex/screen/empty-input.d.ts +4 -0
- package/dist/codex/screen/empty-input.d.ts.map +1 -0
- package/dist/codex/screen/empty-input.js +10 -0
- package/dist/codex/screen/empty-input.js.map +1 -0
- package/dist/codex/screen/live-clearance.d.ts +6 -0
- package/dist/codex/screen/live-clearance.d.ts.map +1 -0
- package/dist/codex/screen/live-clearance.js +34 -0
- package/dist/codex/screen/live-clearance.js.map +1 -0
- package/dist/codex/screen/retained-clearance.d.ts +19 -0
- package/dist/codex/screen/retained-clearance.d.ts.map +1 -0
- package/dist/codex/screen/retained-clearance.js +67 -0
- package/dist/codex/screen/retained-clearance.js.map +1 -0
- package/dist/codex/screen/staged-input.d.ts +7 -0
- package/dist/codex/screen/staged-input.d.ts.map +1 -0
- package/dist/codex/screen/staged-input.js +40 -0
- package/dist/codex/screen/staged-input.js.map +1 -0
- package/dist/codex/screen/working.d.ts +4 -0
- package/dist/codex/screen/working.d.ts.map +1 -0
- package/dist/codex/screen/working.js +5 -0
- package/dist/codex/screen/working.js.map +1 -0
- package/dist/codex/screen-table.d.ts +4 -1
- package/dist/codex/screen-table.d.ts.map +1 -1
- package/dist/codex/screen-table.js +44 -11
- package/dist/codex/screen-table.js.map +1 -1
- package/dist/codex/session/build.d.ts +1 -0
- package/dist/codex/session/build.d.ts.map +1 -1
- package/dist/codex/session/build.js +62 -68
- package/dist/codex/session/build.js.map +1 -1
- package/dist/codex/session/caller-input.d.ts +18 -0
- package/dist/codex/session/caller-input.d.ts.map +1 -0
- package/dist/codex/session/caller-input.js +50 -0
- package/dist/codex/session/caller-input.js.map +1 -0
- package/dist/codex/session/cleanup.d.ts +2 -1
- package/dist/codex/session/cleanup.d.ts.map +1 -1
- package/dist/codex/session/cleanup.js +3 -2
- package/dist/codex/session/cleanup.js.map +1 -1
- package/dist/codex/session/cli-exit.d.ts +24 -0
- package/dist/codex/session/cli-exit.d.ts.map +1 -0
- package/dist/codex/session/cli-exit.js +43 -0
- package/dist/codex/session/cli-exit.js.map +1 -0
- package/dist/codex/session/hooks.d.ts +3 -0
- package/dist/codex/session/hooks.d.ts.map +1 -1
- package/dist/codex/session/hooks.js +66 -13
- package/dist/codex/session/hooks.js.map +1 -1
- package/dist/codex/session/index.d.ts +2 -1
- package/dist/codex/session/index.d.ts.map +1 -1
- package/dist/codex/session/index.js +23 -8
- package/dist/codex/session/index.js.map +1 -1
- package/dist/codex/session/initial-ready.d.ts +6 -0
- package/dist/codex/session/initial-ready.d.ts.map +1 -0
- package/dist/codex/session/initial-ready.js +9 -0
- package/dist/codex/session/initial-ready.js.map +1 -0
- package/dist/codex/session/instance.d.ts +19 -4
- package/dist/codex/session/instance.d.ts.map +1 -1
- package/dist/codex/session/instance.js +60 -30
- package/dist/codex/session/instance.js.map +1 -1
- package/dist/codex/session/resume.d.ts.map +1 -1
- package/dist/codex/session/resume.js +35 -26
- package/dist/codex/session/resume.js.map +1 -1
- package/dist/codex/session/runtime.d.ts.map +1 -1
- package/dist/codex/session/runtime.js +1 -2
- package/dist/codex/session/runtime.js.map +1 -1
- package/dist/codex/session/startup-warnings.d.ts +11 -0
- package/dist/codex/session/startup-warnings.d.ts.map +1 -0
- package/dist/codex/session/startup-warnings.js +9 -0
- package/dist/codex/session/startup-warnings.js.map +1 -0
- package/dist/codex/session/transcript.d.ts +3 -1
- package/dist/codex/session/transcript.d.ts.map +1 -1
- package/dist/codex/session/transcript.js +51 -8
- package/dist/codex/session/transcript.js.map +1 -1
- package/dist/codex/session/types.d.ts +4 -3
- package/dist/codex/session/types.d.ts.map +1 -1
- package/dist/codex/session/update-attention.d.ts +4 -0
- package/dist/codex/session/update-attention.d.ts.map +1 -0
- package/dist/codex/session/update-attention.js +18 -0
- package/dist/codex/session/update-attention.js.map +1 -0
- package/dist/codex/session/warnings.d.ts +2 -1
- package/dist/codex/session/warnings.d.ts.map +1 -1
- package/dist/codex/session/warnings.js +2 -1
- package/dist/codex/session/warnings.js.map +1 -1
- package/dist/codex/simple.d.ts +1 -0
- package/dist/codex/simple.d.ts.map +1 -1
- package/dist/codex/simple.js +2 -0
- package/dist/codex/simple.js.map +1 -1
- package/dist/codex/startup-prompts.d.ts +29 -14
- package/dist/codex/startup-prompts.d.ts.map +1 -1
- package/dist/codex/startup-prompts.js +113 -93
- package/dist/codex/startup-prompts.js.map +1 -1
- package/dist/codex/startup-warnings.d.ts +10 -0
- package/dist/codex/startup-warnings.d.ts.map +1 -0
- package/dist/codex/startup-warnings.js +65 -0
- package/dist/codex/startup-warnings.js.map +1 -0
- package/dist/codex/transcript/summary.d.ts +1 -1
- package/dist/codex/transcript/summary.d.ts.map +1 -1
- package/dist/codex/transcript/summary.js +18 -7
- package/dist/codex/transcript/summary.js.map +1 -1
- package/dist/codex/transcript/types.d.ts +23 -12
- package/dist/codex/transcript/types.d.ts.map +1 -1
- package/dist/codex/transcript/watcher.d.ts.map +1 -1
- package/dist/codex/transcript/watcher.js +2 -1
- package/dist/codex/transcript/watcher.js.map +1 -1
- package/dist/codex/update/classification.d.ts +27 -0
- package/dist/codex/update/classification.d.ts.map +1 -0
- package/dist/codex/update/classification.js +28 -0
- package/dist/codex/update/classification.js.map +1 -0
- package/dist/codex/update/evidence.d.ts +22 -0
- package/dist/codex/update/evidence.d.ts.map +1 -0
- package/dist/codex/update/evidence.js +69 -0
- package/dist/codex/update/evidence.js.map +1 -0
- package/dist/codex/update/layout.d.ts +7 -0
- package/dist/codex/update/layout.d.ts.map +1 -0
- package/dist/codex/update/layout.js +65 -0
- package/dist/codex/update/layout.js.map +1 -0
- package/dist/codex/update/recognition.d.ts +3 -0
- package/dist/codex/update/recognition.d.ts.map +1 -0
- package/dist/codex/update/recognition.js +7 -0
- package/dist/codex/update/recognition.js.map +1 -0
- package/dist/codex/update/selection.d.ts +7 -0
- package/dist/codex/update/selection.d.ts.map +1 -0
- package/dist/codex/update/selection.js +10 -0
- package/dist/codex/update/selection.js.map +1 -0
- package/dist/codex/update/skip-attempt.d.ts +25 -0
- package/dist/codex/update/skip-attempt.d.ts.map +1 -0
- package/dist/codex/update/skip-attempt.js +64 -0
- package/dist/codex/update/skip-attempt.js.map +1 -0
- package/dist/codex/update/tracker.d.ts +37 -0
- package/dist/codex/update/tracker.d.ts.map +1 -0
- package/dist/codex/update/tracker.js +156 -0
- package/dist/codex/update/tracker.js.map +1 -0
- package/dist/codex/update-identity.d.ts +23 -0
- package/dist/codex/update-identity.d.ts.map +1 -0
- package/dist/codex/update-identity.js +46 -0
- package/dist/codex/update-identity.js.map +1 -0
- package/dist/codex/update-prompt.d.ts +26 -17
- package/dist/codex/update-prompt.d.ts.map +1 -1
- package/dist/codex/update-prompt.js +65 -62
- package/dist/codex/update-prompt.js.map +1 -1
- package/dist/core/activity/index.d.ts +24 -3
- package/dist/core/activity/index.d.ts.map +1 -1
- package/dist/core/activity/index.js.map +1 -1
- package/dist/core/activity/meta.d.ts +6 -1
- package/dist/core/activity/meta.d.ts.map +1 -1
- package/dist/core/activity/meta.js.map +1 -1
- package/dist/core/activity/transcript.d.ts +4 -1
- package/dist/core/activity/transcript.d.ts.map +1 -1
- package/dist/core/activity/transcript.js +28 -18
- package/dist/core/activity/transcript.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/async-mutex.d.ts +14 -8
- package/dist/core/async-mutex.d.ts.map +1 -1
- package/dist/core/async-mutex.js +48 -12
- package/dist/core/async-mutex.js.map +1 -1
- package/dist/core/attention.d.ts +6 -2
- package/dist/core/attention.d.ts.map +1 -1
- package/dist/core/attention.js +23 -9
- package/dist/core/attention.js.map +1 -1
- package/dist/core/control-queue/admission-scan.d.ts +10 -0
- package/dist/core/control-queue/admission-scan.d.ts.map +1 -0
- package/dist/core/control-queue/admission-scan.js +28 -0
- package/dist/core/control-queue/admission-scan.js.map +1 -0
- package/dist/core/control-queue/admission.d.ts +15 -0
- package/dist/core/control-queue/admission.d.ts.map +1 -0
- package/dist/core/control-queue/admission.js +70 -0
- package/dist/core/control-queue/admission.js.map +1 -0
- package/dist/core/control-queue/budget.d.ts +15 -0
- package/dist/core/control-queue/budget.d.ts.map +1 -0
- package/dist/core/control-queue/budget.js +33 -0
- package/dist/core/control-queue/budget.js.map +1 -0
- package/dist/core/control-queue/index.d.ts +6 -3
- package/dist/core/control-queue/index.d.ts.map +1 -1
- package/dist/core/control-queue/index.js +52 -28
- package/dist/core/control-queue/index.js.map +1 -1
- package/dist/core/control-queue/scan.d.ts +10 -0
- package/dist/core/control-queue/scan.d.ts.map +1 -0
- package/dist/core/control-queue/scan.js +24 -0
- package/dist/core/control-queue/scan.js.map +1 -0
- package/dist/core/control-queue/state.d.ts +19 -3
- package/dist/core/control-queue/state.d.ts.map +1 -1
- package/dist/core/control-queue/state.js +87 -15
- package/dist/core/control-queue/state.js.map +1 -1
- package/dist/core/control-queue/submission.d.ts +8 -0
- package/dist/core/control-queue/submission.d.ts.map +1 -0
- package/dist/core/control-queue/submission.js +41 -0
- package/dist/core/control-queue/submission.js.map +1 -0
- package/dist/core/control-queue/traits.d.ts +6 -9
- package/dist/core/control-queue/traits.d.ts.map +1 -1
- package/dist/core/control-queue/traits.js +2 -15
- package/dist/core/control-queue/traits.js.map +1 -1
- package/dist/core/control-queue/types.d.ts +28 -2
- package/dist/core/control-queue/types.d.ts.map +1 -1
- package/dist/core/errors.d.ts +7 -2
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +7 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/freeze-hook-event.d.ts +6 -0
- package/dist/core/freeze-hook-event.d.ts.map +1 -0
- package/dist/core/freeze-hook-event.js +16 -0
- package/dist/core/freeze-hook-event.js.map +1 -0
- package/dist/core/hook-dispatch.d.ts +3 -2
- package/dist/core/hook-dispatch.d.ts.map +1 -1
- package/dist/core/hook-dispatch.js +14 -6
- package/dist/core/hook-dispatch.js.map +1 -1
- package/dist/core/hook-observation.d.ts +24 -0
- package/dist/core/hook-observation.d.ts.map +1 -0
- package/dist/core/hook-observation.js +68 -0
- package/dist/core/hook-observation.js.map +1 -0
- package/dist/core/hook-result.d.ts +12 -2
- package/dist/core/hook-result.d.ts.map +1 -1
- package/dist/core/hook-result.js +10 -9
- package/dist/core/hook-result.js.map +1 -1
- package/dist/core/hook-timeout.d.ts.map +1 -1
- package/dist/core/hook-timeout.js +3 -2
- package/dist/core/hook-timeout.js.map +1 -1
- package/dist/core/images/capture.d.ts +14 -0
- package/dist/core/images/capture.d.ts.map +1 -0
- package/dist/core/images/capture.js +35 -0
- package/dist/core/images/capture.js.map +1 -0
- package/dist/core/images/chip-wait.d.ts +14 -16
- package/dist/core/images/chip-wait.d.ts.map +1 -1
- package/dist/core/images/chip-wait.js +31 -34
- package/dist/core/images/chip-wait.js.map +1 -1
- package/dist/core/images/queued-budget.d.ts +18 -0
- package/dist/core/images/queued-budget.d.ts.map +1 -0
- package/dist/core/images/queued-budget.js +41 -0
- package/dist/core/images/queued-budget.js.map +1 -0
- package/dist/core/inert-record.d.ts +3 -0
- package/dist/core/inert-record.d.ts.map +1 -0
- package/dist/core/inert-record.js +6 -0
- package/dist/core/inert-record.js.map +1 -0
- package/dist/core/input/abort.d.ts +33 -2
- package/dist/core/input/abort.d.ts.map +1 -1
- package/dist/core/input/abort.js +42 -2
- package/dist/core/input/abort.js.map +1 -1
- package/dist/core/input/clear-ack.d.ts +10 -0
- package/dist/core/input/clear-ack.d.ts.map +1 -0
- package/dist/core/input/clear-ack.js +26 -0
- package/dist/core/input/clear-ack.js.map +1 -0
- package/dist/core/input/composer-cleanup.d.ts +33 -0
- package/dist/core/input/composer-cleanup.d.ts.map +1 -0
- package/dist/core/input/composer-cleanup.js +127 -0
- package/dist/core/input/composer-cleanup.js.map +1 -0
- package/dist/core/input/constants.d.ts +12 -0
- package/dist/core/input/constants.d.ts.map +1 -0
- package/dist/core/input/constants.js +12 -0
- package/dist/core/input/constants.js.map +1 -0
- package/dist/core/input/empty-frame.d.ts +4 -0
- package/dist/core/input/empty-frame.d.ts.map +1 -0
- package/dist/core/input/empty-frame.js +15 -0
- package/dist/core/input/empty-frame.js.map +1 -0
- package/dist/core/input/index.d.ts +8 -25
- package/dist/core/input/index.d.ts.map +1 -1
- package/dist/core/input/index.js +67 -102
- package/dist/core/input/index.js.map +1 -1
- package/dist/core/input/paste-guard.d.ts +34 -0
- package/dist/core/input/paste-guard.d.ts.map +1 -0
- package/dist/core/input/paste-guard.js +2 -0
- package/dist/core/input/paste-guard.js.map +1 -0
- package/dist/core/input/paste-nudge.d.ts +10 -0
- package/dist/core/input/paste-nudge.d.ts.map +1 -0
- package/dist/core/input/paste-nudge.js +91 -0
- package/dist/core/input/paste-nudge.js.map +1 -0
- package/dist/core/input/render-observation.d.ts +3 -0
- package/dist/core/input/render-observation.d.ts.map +1 -0
- package/dist/core/input/render-observation.js +38 -0
- package/dist/core/input/render-observation.js.map +1 -0
- package/dist/core/input/render-wakeup.d.ts +10 -0
- package/dist/core/input/render-wakeup.d.ts.map +1 -0
- package/dist/core/input/render-wakeup.js +45 -0
- package/dist/core/input/render-wakeup.js.map +1 -0
- package/dist/core/input/sanitize.d.ts +11 -0
- package/dist/core/input/sanitize.d.ts.map +1 -0
- package/dist/core/input/sanitize.js +19 -0
- package/dist/core/input/sanitize.js.map +1 -0
- package/dist/core/input/staged-composer.d.ts +12 -0
- package/dist/core/input/staged-composer.d.ts.map +1 -0
- package/dist/core/input/staged-composer.js +56 -0
- package/dist/core/input/staged-composer.js.map +1 -0
- package/dist/core/input/submission-cancel.d.ts +6 -0
- package/dist/core/input/submission-cancel.d.ts.map +1 -0
- package/dist/core/input/submission-cancel.js +18 -0
- package/dist/core/input/submission-cancel.js.map +1 -0
- package/dist/core/json-shape.d.ts +2 -0
- package/dist/core/json-shape.d.ts.map +1 -0
- package/dist/core/json-shape.js +6 -0
- package/dist/core/json-shape.js.map +1 -0
- package/dist/core/json-snapshot.d.ts +10 -0
- package/dist/core/json-snapshot.d.ts.map +1 -0
- package/dist/core/json-snapshot.js +84 -0
- package/dist/core/json-snapshot.js.map +1 -0
- package/dist/core/loops/scheduler.d.ts +1 -1
- package/dist/core/loops/scheduler.d.ts.map +1 -1
- package/dist/core/loops/scheduler.js +1 -2
- package/dist/core/loops/scheduler.js.map +1 -1
- package/dist/core/models/dialog-region.d.ts +16 -0
- package/dist/core/models/dialog-region.d.ts.map +1 -0
- package/dist/core/models/dialog-region.js +133 -0
- package/dist/core/models/dialog-region.js.map +1 -0
- package/dist/core/models/input.d.ts +1 -1
- package/dist/core/models/input.d.ts.map +1 -1
- package/dist/core/models/input.js.map +1 -1
- package/dist/core/models/intervention.d.ts +3 -0
- package/dist/core/models/intervention.d.ts.map +1 -0
- package/dist/core/models/intervention.js +12 -0
- package/dist/core/models/intervention.js.map +1 -0
- package/dist/core/models/picker.d.ts +14 -1
- package/dist/core/models/picker.d.ts.map +1 -1
- package/dist/core/models/picker.js +27 -6
- package/dist/core/models/picker.js.map +1 -1
- package/dist/core/models/rows.d.ts +42 -2
- package/dist/core/models/rows.d.ts.map +1 -1
- package/dist/core/models/rows.js +30 -3
- package/dist/core/models/rows.js.map +1 -1
- package/dist/core/models/tui-screen.d.ts +11 -1
- package/dist/core/models/tui-screen.d.ts.map +1 -1
- package/dist/core/models/tui-screen.js +22 -4
- package/dist/core/models/tui-screen.js.map +1 -1
- package/dist/core/module-require.d.ts +1 -1
- package/dist/core/module-require.js +1 -1
- package/dist/core/persona.d.ts +5 -4
- package/dist/core/persona.d.ts.map +1 -1
- package/dist/core/persona.js +18 -3
- package/dist/core/persona.js.map +1 -1
- package/dist/core/predicates.d.ts +9 -1
- package/dist/core/predicates.d.ts.map +1 -1
- package/dist/core/predicates.js +12 -2
- package/dist/core/predicates.js.map +1 -1
- package/dist/core/questions/abort.d.ts +2 -0
- package/dist/core/questions/abort.d.ts.map +1 -0
- package/dist/core/questions/abort.js +21 -0
- package/dist/core/questions/abort.js.map +1 -0
- package/dist/core/questions/activity-fields.d.ts +5 -0
- package/dist/core/questions/activity-fields.d.ts.map +1 -0
- package/dist/core/questions/activity-fields.js +15 -0
- package/dist/core/questions/activity-fields.js.map +1 -0
- package/dist/core/questions/activity.d.ts +6 -0
- package/dist/core/questions/activity.d.ts.map +1 -0
- package/dist/core/questions/activity.js +2 -0
- package/dist/core/questions/activity.js.map +1 -0
- package/dist/core/questions/adapter.d.ts +15 -0
- package/dist/core/questions/adapter.d.ts.map +1 -0
- package/dist/core/questions/adapter.js +2 -0
- package/dist/core/questions/adapter.js.map +1 -0
- package/dist/core/questions/attempt.d.ts +26 -0
- package/dist/core/questions/attempt.d.ts.map +1 -0
- package/dist/core/questions/attempt.js +85 -0
- package/dist/core/questions/attempt.js.map +1 -0
- package/dist/core/questions/controller.d.ts +24 -0
- package/dist/core/questions/controller.d.ts.map +1 -0
- package/dist/core/questions/controller.js +83 -0
- package/dist/core/questions/controller.js.map +1 -0
- package/dist/core/questions/correlation.d.ts +8 -0
- package/dist/core/questions/correlation.d.ts.map +1 -0
- package/dist/core/questions/correlation.js +11 -0
- package/dist/core/questions/correlation.js.map +1 -0
- package/dist/core/questions/cursor-provenance.d.ts +12 -0
- package/dist/core/questions/cursor-provenance.d.ts.map +1 -0
- package/dist/core/questions/cursor-provenance.js +19 -0
- package/dist/core/questions/cursor-provenance.js.map +1 -0
- package/dist/core/questions/deadline.d.ts +2 -0
- package/dist/core/questions/deadline.d.ts.map +1 -0
- package/dist/core/questions/deadline.js +11 -0
- package/dist/core/questions/deadline.js.map +1 -0
- package/dist/core/questions/dispatch.d.ts +17 -0
- package/dist/core/questions/dispatch.d.ts.map +1 -0
- package/dist/core/questions/dispatch.js +46 -0
- package/dist/core/questions/dispatch.js.map +1 -0
- package/dist/core/questions/errors.d.ts +8 -0
- package/dist/core/questions/errors.d.ts.map +1 -0
- package/dist/core/questions/errors.js +10 -0
- package/dist/core/questions/errors.js.map +1 -0
- package/dist/core/questions/input.d.ts +13 -0
- package/dist/core/questions/input.d.ts.map +1 -0
- package/dist/core/questions/input.js +93 -0
- package/dist/core/questions/input.js.map +1 -0
- package/dist/core/questions/io.d.ts +23 -0
- package/dist/core/questions/io.d.ts.map +1 -0
- package/dist/core/questions/io.js +2 -0
- package/dist/core/questions/io.js.map +1 -0
- package/dist/core/questions/notification-errors.d.ts +14 -0
- package/dist/core/questions/notification-errors.d.ts.map +1 -0
- package/dist/core/questions/notification-errors.js +45 -0
- package/dist/core/questions/notification-errors.js.map +1 -0
- package/dist/core/questions/observers.d.ts +17 -0
- package/dist/core/questions/observers.d.ts.map +1 -0
- package/dist/core/questions/observers.js +57 -0
- package/dist/core/questions/observers.js.map +1 -0
- package/dist/core/questions/registry.d.ts +35 -0
- package/dist/core/questions/registry.d.ts.map +1 -0
- package/dist/core/questions/registry.js +158 -0
- package/dist/core/questions/registry.js.map +1 -0
- package/dist/core/questions/transaction.d.ts +23 -0
- package/dist/core/questions/transaction.d.ts.map +1 -0
- package/dist/core/questions/transaction.js +97 -0
- package/dist/core/questions/transaction.js.map +1 -0
- package/dist/core/questions/types.d.ts +62 -0
- package/dist/core/questions/types.d.ts.map +1 -0
- package/dist/core/questions/types.js +2 -0
- package/dist/core/questions/types.js.map +1 -0
- package/dist/core/questions/validate.d.ts +16 -0
- package/dist/core/questions/validate.d.ts.map +1 -0
- package/dist/core/questions/validate.js +95 -0
- package/dist/core/questions/validate.js.map +1 -0
- package/dist/core/rendered-observers.d.ts +7 -2
- package/dist/core/rendered-observers.d.ts.map +1 -1
- package/dist/core/rendered-observers.js +44 -10
- package/dist/core/rendered-observers.js.map +1 -1
- package/dist/core/screen-facts.d.ts +8 -3
- package/dist/core/screen-facts.d.ts.map +1 -1
- package/dist/core/screen-facts.js +6 -3
- package/dist/core/screen-facts.js.map +1 -1
- package/dist/core/simple/boundary-observer.d.ts +30 -0
- package/dist/core/simple/boundary-observer.d.ts.map +1 -0
- package/dist/core/simple/boundary-observer.js +111 -0
- package/dist/core/simple/boundary-observer.js.map +1 -0
- package/dist/core/simple/boundary-signal.d.ts +31 -0
- package/dist/core/simple/boundary-signal.d.ts.map +1 -0
- package/dist/core/simple/boundary-signal.js +19 -0
- package/dist/core/simple/boundary-signal.js.map +1 -0
- package/dist/core/simple/captured-input.d.ts +19 -0
- package/dist/core/simple/captured-input.d.ts.map +1 -0
- package/dist/core/simple/captured-input.js +78 -0
- package/dist/core/simple/captured-input.js.map +1 -0
- package/dist/core/simple/close.d.ts +6 -0
- package/dist/core/simple/close.d.ts.map +1 -0
- package/dist/core/simple/close.js +20 -0
- package/dist/core/simple/close.js.map +1 -0
- package/dist/core/simple/events.d.ts +2 -2
- package/dist/core/simple/events.js +2 -2
- package/dist/core/simple/loop-boundary.d.ts +12 -0
- package/dist/core/simple/loop-boundary.d.ts.map +1 -0
- package/dist/core/simple/loop-boundary.js +68 -0
- package/dist/core/simple/loop-boundary.js.map +1 -0
- package/dist/core/simple/loop-hold.d.ts +7 -0
- package/dist/core/simple/loop-hold.d.ts.map +1 -0
- package/dist/core/simple/loop-hold.js +9 -0
- package/dist/core/simple/loop-hold.js.map +1 -0
- package/dist/core/simple/native-boundary.d.ts +15 -0
- package/dist/core/simple/native-boundary.d.ts.map +1 -0
- package/dist/core/simple/native-boundary.js +18 -0
- package/dist/core/simple/native-boundary.js.map +1 -0
- package/dist/core/simple/native-idle.d.ts +17 -0
- package/dist/core/simple/native-idle.d.ts.map +1 -0
- package/dist/core/simple/native-idle.js +25 -0
- package/dist/core/simple/native-idle.js.map +1 -0
- package/dist/core/simple/observe-boundary.d.ts +28 -0
- package/dist/core/simple/observe-boundary.d.ts.map +1 -0
- package/dist/core/simple/observe-boundary.js +13 -0
- package/dist/core/simple/observe-boundary.js.map +1 -0
- package/dist/core/simple/owned-loop.d.ts +8 -0
- package/dist/core/simple/owned-loop.d.ts.map +1 -0
- package/dist/core/simple/owned-loop.js +42 -0
- package/dist/core/simple/owned-loop.js.map +1 -0
- package/dist/core/simple/session.d.ts +7 -7
- package/dist/core/simple/session.d.ts.map +1 -1
- package/dist/core/simple/session.js +20 -33
- package/dist/core/simple/session.js.map +1 -1
- package/dist/core/simple/submission-context.d.ts +13 -0
- package/dist/core/simple/submission-context.d.ts.map +1 -0
- package/dist/core/simple/submission-context.js +35 -0
- package/dist/core/simple/submission-context.js.map +1 -0
- package/dist/core/simple/turn/bounds.d.ts +22 -0
- package/dist/core/simple/turn/bounds.d.ts.map +1 -0
- package/dist/core/simple/turn/bounds.js +22 -0
- package/dist/core/simple/turn/bounds.js.map +1 -0
- package/dist/core/simple/turn/defaults.d.ts +24 -0
- package/dist/core/simple/turn/defaults.d.ts.map +1 -0
- package/dist/core/simple/turn/defaults.js +34 -0
- package/dist/core/simple/turn/defaults.js.map +1 -0
- package/dist/core/simple/turn-acceptance.d.ts +20 -3
- package/dist/core/simple/turn-acceptance.d.ts.map +1 -1
- package/dist/core/simple/turn-acceptance.js +55 -5
- package/dist/core/simple/turn-acceptance.js.map +1 -1
- package/dist/core/simple/turn-boundary.d.ts +7 -2
- package/dist/core/simple/turn-boundary.d.ts.map +1 -1
- package/dist/core/simple/turn-boundary.js +17 -5
- package/dist/core/simple/turn-boundary.js.map +1 -1
- package/dist/core/simple/turn-gate.d.ts.map +1 -1
- package/dist/core/simple/turn-gate.js +1 -11
- package/dist/core/simple/turn-gate.js.map +1 -1
- package/dist/core/simple/turn-identity.d.ts +28 -0
- package/dist/core/simple/turn-identity.d.ts.map +1 -0
- package/dist/core/simple/turn-identity.js +74 -0
- package/dist/core/simple/turn-identity.js.map +1 -0
- package/dist/core/simple/turn-types.d.ts +11 -4
- package/dist/core/simple/turn-types.d.ts.map +1 -1
- package/dist/core/simple/turn-types.js +1 -6
- package/dist/core/simple/turn-types.js.map +1 -1
- package/dist/core/simple/turn.d.ts +7 -30
- package/dist/core/simple/turn.d.ts.map +1 -1
- package/dist/core/simple/turn.js +75 -75
- package/dist/core/simple/turn.js.map +1 -1
- package/dist/core/startup/barrier.d.ts +37 -0
- package/dist/core/startup/barrier.d.ts.map +1 -0
- package/dist/core/startup/barrier.js +59 -0
- package/dist/core/startup/barrier.js.map +1 -0
- package/dist/core/startup/frame.d.ts +2 -0
- package/dist/core/startup/frame.d.ts.map +1 -1
- package/dist/core/startup/frame.js +12 -0
- package/dist/core/startup/frame.js.map +1 -1
- package/dist/core/startup/warnings.d.ts +5 -0
- package/dist/core/startup/warnings.d.ts.map +1 -0
- package/dist/core/startup/warnings.js +14 -0
- package/dist/core/startup/warnings.js.map +1 -0
- package/dist/core/startup/write.d.ts +13 -11
- package/dist/core/startup/write.d.ts.map +1 -1
- package/dist/core/startup/write.js +12 -5
- package/dist/core/startup/write.js.map +1 -1
- package/dist/core/stop-input.d.ts +19 -0
- package/dist/core/stop-input.d.ts.map +1 -0
- package/dist/core/stop-input.js +47 -0
- package/dist/core/stop-input.js.map +1 -0
- package/dist/core/terminal-options.d.ts +13 -3
- package/dist/core/terminal-options.d.ts.map +1 -1
- package/dist/core/terminal-options.js +17 -7
- package/dist/core/terminal-options.js.map +1 -1
- package/dist/core/terminal-replay.d.ts +1 -0
- package/dist/core/terminal-replay.d.ts.map +1 -1
- package/dist/core/terminal-replay.js +6 -0
- package/dist/core/terminal-replay.js.map +1 -1
- package/dist/core/timers.d.ts +15 -0
- package/dist/core/timers.d.ts.map +1 -0
- package/dist/core/timers.js +17 -0
- package/dist/core/timers.js.map +1 -0
- package/dist/core/trust/allowlist.d.ts +24 -1
- package/dist/core/trust/allowlist.d.ts.map +1 -1
- package/dist/core/trust/allowlist.js +39 -12
- package/dist/core/trust/allowlist.js.map +1 -1
- package/dist/core/trust/blocking.d.ts +21 -10
- package/dist/core/trust/blocking.d.ts.map +1 -1
- package/dist/core/trust/blocking.js +64 -18
- package/dist/core/trust/blocking.js.map +1 -1
- package/dist/core/trust/clearance.d.ts +20 -0
- package/dist/core/trust/clearance.d.ts.map +1 -0
- package/dist/core/trust/clearance.js +25 -0
- package/dist/core/trust/clearance.js.map +1 -0
- package/dist/core/trust/copy.d.ts +19 -0
- package/dist/core/trust/copy.d.ts.map +1 -0
- package/dist/core/trust/copy.js +23 -0
- package/dist/core/trust/copy.js.map +1 -0
- package/dist/core/trust/dialog.d.ts +28 -0
- package/dist/core/trust/dialog.d.ts.map +1 -0
- package/dist/core/trust/dialog.js +96 -0
- package/dist/core/trust/dialog.js.map +1 -0
- package/dist/core/trust/options.d.ts +9 -0
- package/dist/core/trust/options.d.ts.map +1 -0
- package/dist/core/trust/options.js +9 -0
- package/dist/core/trust/options.js.map +1 -0
- package/dist/core/trust/prompts.d.ts +16 -37
- package/dist/core/trust/prompts.d.ts.map +1 -1
- package/dist/core/trust/prompts.js +10 -18
- package/dist/core/trust/prompts.js.map +1 -1
- package/dist/core/trust/responder.d.ts +27 -45
- package/dist/core/trust/responder.d.ts.map +1 -1
- package/dist/core/trust/responder.js +178 -108
- package/dist/core/trust/responder.js.map +1 -1
- package/dist/core/trust/types.d.ts +36 -0
- package/dist/core/trust/types.d.ts.map +1 -0
- package/dist/core/trust/types.js +17 -0
- package/dist/core/trust/types.js.map +1 -0
- package/dist/core/trust/view.d.ts +31 -0
- package/dist/core/trust/view.d.ts.map +1 -0
- package/dist/core/trust/view.js +52 -0
- package/dist/core/trust/view.js.map +1 -0
- package/dist/core/trust/write.d.ts +31 -0
- package/dist/core/trust/write.d.ts.map +1 -0
- package/dist/core/trust/write.js +148 -0
- package/dist/core/trust/write.js.map +1 -0
- package/dist/core/turn-state.d.ts +6 -0
- package/dist/core/turn-state.d.ts.map +1 -1
- package/dist/core/turn-state.js +31 -1
- package/dist/core/turn-state.js.map +1 -1
- package/dist/core/types.d.ts +4 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/warnings/auth.d.ts +25 -0
- package/dist/core/warnings/auth.d.ts.map +1 -0
- package/dist/core/warnings/auth.js +2 -0
- package/dist/core/warnings/auth.js.map +1 -0
- package/dist/core/warnings/index.d.ts +9 -16
- package/dist/core/warnings/index.d.ts.map +1 -1
- package/dist/core/warnings/index.js +2 -3
- package/dist/core/warnings/index.js.map +1 -1
- package/dist/core/warnings/lifecycle.d.ts +25 -1
- package/dist/core/warnings/lifecycle.d.ts.map +1 -1
- package/dist/core/warnings/lifecycle.js +1 -1
- package/dist/core/warnings/questions.d.ts +23 -0
- package/dist/core/warnings/questions.d.ts.map +1 -0
- package/dist/core/warnings/questions.js +2 -0
- package/dist/core/warnings/questions.js.map +1 -0
- package/dist/core/warnings/session.d.ts +3 -2
- package/dist/core/warnings/session.d.ts.map +1 -1
- package/dist/core/warnings/session.js +3 -2
- package/dist/core/warnings/session.js.map +1 -1
- package/dist/core/warnings/transcript.d.ts +12 -0
- package/dist/core/warnings/transcript.d.ts.map +1 -0
- package/dist/core/warnings/transcript.js +2 -0
- package/dist/core/warnings/transcript.js.map +1 -0
- package/dist/core/warnings/update.d.ts +11 -2
- package/dist/core/warnings/update.d.ts.map +1 -1
- package/dist/core/warnings/update.js +27 -4
- package/dist/core/warnings/update.js.map +1 -1
- package/dist/events/emitter.d.ts +18 -2
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +61 -14
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/observer-errors.d.ts +9 -0
- package/dist/events/observer-errors.d.ts.map +1 -0
- package/dist/events/observer-errors.js +68 -0
- package/dist/events/observer-errors.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/pty/node.d.ts.map +1 -1
- package/dist/pty/node.js +4 -0
- package/dist/pty/node.js.map +1 -1
- package/dist/pty/types.d.ts +5 -0
- package/dist/pty/types.d.ts.map +1 -1
- package/dist/runtime/probe-cleanup.d.ts +34 -0
- package/dist/runtime/probe-cleanup.d.ts.map +1 -0
- package/dist/runtime/probe-cleanup.js +139 -0
- package/dist/runtime/probe-cleanup.js.map +1 -0
- package/dist/runtime/probe.d.ts.map +1 -1
- package/dist/runtime/probe.js +18 -25
- package/dist/runtime/probe.js.map +1 -1
- package/dist/runtime/readiness/initial-ready.d.ts +13 -11
- package/dist/runtime/readiness/initial-ready.d.ts.map +1 -1
- package/dist/runtime/readiness/initial-ready.js +23 -18
- package/dist/runtime/readiness/initial-ready.js.map +1 -1
- package/dist/runtime/seams.d.ts +2 -1
- package/dist/runtime/seams.d.ts.map +1 -1
- package/dist/runtime/seams.js.map +1 -1
- package/dist/runtime/session/attention-clearance.d.ts +5 -0
- package/dist/runtime/session/attention-clearance.d.ts.map +1 -0
- package/dist/runtime/session/attention-clearance.js +20 -0
- package/dist/runtime/session/attention-clearance.js.map +1 -0
- package/dist/runtime/session/base.d.ts +17 -4
- package/dist/runtime/session/base.d.ts.map +1 -1
- package/dist/runtime/session/base.js +70 -14
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +17 -3
- package/dist/runtime/session/commands.d.ts.map +1 -1
- package/dist/runtime/session/commands.js +60 -13
- package/dist/runtime/session/commands.js.map +1 -1
- package/dist/runtime/session/foreign-picker.d.ts +8 -0
- package/dist/runtime/session/foreign-picker.d.ts.map +1 -0
- package/dist/runtime/session/foreign-picker.js +18 -0
- package/dist/runtime/session/foreign-picker.js.map +1 -0
- package/dist/runtime/session/frames.d.ts +27 -0
- package/dist/runtime/session/frames.d.ts.map +1 -0
- package/dist/runtime/session/frames.js +80 -0
- package/dist/runtime/session/frames.js.map +1 -0
- package/dist/runtime/session/image-attach.d.ts +3 -15
- package/dist/runtime/session/image-attach.d.ts.map +1 -1
- package/dist/runtime/session/image-attach.js +9 -27
- package/dist/runtime/session/image-attach.js.map +1 -1
- package/dist/runtime/session/lifecycle.d.ts +20 -14
- package/dist/runtime/session/lifecycle.d.ts.map +1 -1
- package/dist/runtime/session/lifecycle.js +49 -47
- package/dist/runtime/session/lifecycle.js.map +1 -1
- package/dist/runtime/session/loops.d.ts +10 -1
- package/dist/runtime/session/loops.d.ts.map +1 -1
- package/dist/runtime/session/loops.js +61 -19
- package/dist/runtime/session/loops.js.map +1 -1
- package/dist/runtime/session/native-submission.d.ts +10 -0
- package/dist/runtime/session/native-submission.d.ts.map +1 -0
- package/dist/runtime/session/native-submission.js +62 -0
- package/dist/runtime/session/native-submission.js.map +1 -0
- package/dist/runtime/session/not-running.d.ts +13 -0
- package/dist/runtime/session/not-running.d.ts.map +1 -0
- package/dist/runtime/session/not-running.js +28 -0
- package/dist/runtime/session/not-running.js.map +1 -0
- package/dist/runtime/session/paste-recovery.d.ts +15 -0
- package/dist/runtime/session/paste-recovery.d.ts.map +1 -0
- package/dist/runtime/session/paste-recovery.js +30 -0
- package/dist/runtime/session/paste-recovery.js.map +1 -0
- package/dist/runtime/session/picker-cleanup.d.ts +56 -0
- package/dist/runtime/session/picker-cleanup.d.ts.map +1 -0
- package/dist/runtime/session/picker-cleanup.js +126 -0
- package/dist/runtime/session/picker-cleanup.js.map +1 -0
- package/dist/runtime/session/picker-input.d.ts +17 -0
- package/dist/runtime/session/picker-input.d.ts.map +1 -0
- package/dist/runtime/session/picker-input.js +74 -0
- package/dist/runtime/session/picker-input.js.map +1 -0
- package/dist/runtime/session/picker.d.ts +56 -0
- package/dist/runtime/session/picker.d.ts.map +1 -0
- package/dist/runtime/session/picker.js +143 -0
- package/dist/runtime/session/picker.js.map +1 -0
- package/dist/runtime/session/questions.d.ts +23 -0
- package/dist/runtime/session/questions.d.ts.map +1 -0
- package/dist/runtime/session/questions.js +25 -0
- package/dist/runtime/session/questions.js.map +1 -0
- package/dist/runtime/session/readiness.d.ts +6 -3
- package/dist/runtime/session/readiness.d.ts.map +1 -1
- package/dist/runtime/session/readiness.js +19 -8
- package/dist/runtime/session/readiness.js.map +1 -1
- package/dist/runtime/session/shutdown-binding.d.ts +9 -0
- package/dist/runtime/session/shutdown-binding.d.ts.map +1 -1
- package/dist/runtime/session/shutdown-binding.js +57 -8
- package/dist/runtime/session/shutdown-binding.js.map +1 -1
- package/dist/runtime/session/shutdown.d.ts +2 -5
- package/dist/runtime/session/shutdown.d.ts.map +1 -1
- package/dist/runtime/session/shutdown.js +12 -13
- package/dist/runtime/session/shutdown.js.map +1 -1
- package/dist/runtime/session/status-wiring.d.ts +9 -4
- package/dist/runtime/session/status-wiring.d.ts.map +1 -1
- package/dist/runtime/session/status-wiring.js +8 -5
- package/dist/runtime/session/status-wiring.js.map +1 -1
- package/dist/runtime/session/stop-completion.d.ts +23 -0
- package/dist/runtime/session/stop-completion.d.ts.map +1 -0
- package/dist/runtime/session/stop-completion.js +32 -0
- package/dist/runtime/session/stop-completion.js.map +1 -0
- package/dist/runtime/session/turn-submission.d.ts +9 -0
- package/dist/runtime/session/turn-submission.d.ts.map +1 -0
- package/dist/runtime/session/turn-submission.js +19 -0
- package/dist/runtime/session/turn-submission.js.map +1 -0
- package/dist/runtime/shutdown/terminal.d.ts +10 -0
- package/dist/runtime/shutdown/terminal.d.ts.map +1 -0
- package/dist/runtime/shutdown/terminal.js +38 -0
- package/dist/runtime/shutdown/terminal.js.map +1 -0
- package/dist/runtime/startup/buffer.d.ts +1 -1
- package/dist/runtime/startup/buffer.d.ts.map +1 -1
- package/dist/runtime/startup/buffer.js +14 -8
- package/dist/runtime/startup/buffer.js.map +1 -1
- package/dist/runtime/status-evidence.d.ts +7 -3
- package/dist/runtime/status-evidence.d.ts.map +1 -1
- package/dist/runtime/status-evidence.js +12 -10
- package/dist/runtime/status-evidence.js.map +1 -1
- package/dist/runtime/update/lock.d.ts +7 -0
- package/dist/runtime/update/lock.d.ts.map +1 -1
- package/dist/runtime/update/lock.js +102 -121
- package/dist/runtime/update/lock.js.map +1 -1
- package/dist/runtime/update/owner.d.ts +54 -0
- package/dist/runtime/update/owner.d.ts.map +1 -0
- package/dist/runtime/update/owner.js +131 -0
- package/dist/runtime/update/owner.js.map +1 -0
- package/dist/runtime/update/retained-lease.d.ts +13 -0
- package/dist/runtime/update/retained-lease.d.ts.map +1 -0
- package/dist/runtime/update/retained-lease.js +40 -0
- package/dist/runtime/update/retained-lease.js.map +1 -0
- package/dist/runtime/update/waiting.d.ts +4 -0
- package/dist/runtime/update/waiting.d.ts.map +1 -0
- package/dist/runtime/update/waiting.js +95 -0
- package/dist/runtime/update/waiting.js.map +1 -0
- package/dist/state/canonical-path.d.ts +2 -0
- package/dist/state/canonical-path.d.ts.map +1 -0
- package/dist/state/canonical-path.js +22 -0
- package/dist/state/canonical-path.js.map +1 -0
- package/dist/state/launch-ownership.d.ts +21 -0
- package/dist/state/launch-ownership.d.ts.map +1 -0
- package/dist/state/launch-ownership.js +154 -0
- package/dist/state/launch-ownership.js.map +1 -0
- package/dist/state/launch-publication.d.ts +7 -0
- package/dist/state/launch-publication.d.ts.map +1 -0
- package/dist/state/launch-publication.js +53 -0
- package/dist/state/launch-publication.js.map +1 -0
- package/dist/state/private-read.js +2 -1
- package/dist/state/private-read.js.map +1 -1
- package/dist/state/private-session.d.ts +1 -1
- package/dist/state/private-session.d.ts.map +1 -1
- package/dist/state/private-session.js +4 -1
- package/dist/state/private-session.js.map +1 -1
- package/dist/state/runtime-paths.d.ts +10 -9
- package/dist/state/runtime-paths.d.ts.map +1 -1
- package/dist/state/runtime-paths.js +14 -12
- package/dist/state/runtime-paths.js.map +1 -1
- package/dist/state/socket-home.d.ts +8 -4
- package/dist/state/socket-home.d.ts.map +1 -1
- package/dist/state/socket-home.js +31 -7
- package/dist/state/socket-home.js.map +1 -1
- package/dist/state/startup-ownership.d.ts +4 -0
- package/dist/state/startup-ownership.d.ts.map +1 -0
- package/dist/state/startup-ownership.js +14 -0
- package/dist/state/startup-ownership.js.map +1 -0
- package/dist/state/store.d.ts +1 -1
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +2 -2
- package/dist/state/store.js.map +1 -1
- package/dist/terminal/coordinates.d.ts +7 -0
- package/dist/terminal/coordinates.d.ts.map +1 -0
- package/dist/terminal/coordinates.js +6 -0
- package/dist/terminal/coordinates.js.map +1 -0
- package/dist/terminal/cursor.d.ts +40 -0
- package/dist/terminal/cursor.d.ts.map +1 -0
- package/dist/terminal/cursor.js +151 -0
- package/dist/terminal/cursor.js.map +1 -0
- package/dist/terminal/headless.d.ts +7 -5
- package/dist/terminal/headless.d.ts.map +1 -1
- package/dist/terminal/headless.js +47 -35
- package/dist/terminal/headless.js.map +1 -1
- package/dist/terminal/pty-output.d.ts +37 -0
- package/dist/terminal/pty-output.d.ts.map +1 -0
- package/dist/terminal/pty-output.js +109 -0
- package/dist/terminal/pty-output.js.map +1 -0
- package/dist/terminal/render-queue.d.ts +30 -0
- package/dist/terminal/render-queue.d.ts.map +1 -0
- package/dist/terminal/render-queue.js +105 -0
- package/dist/terminal/render-queue.js.map +1 -0
- package/dist/terminal/snapshot.d.ts +5 -0
- package/dist/terminal/snapshot.d.ts.map +1 -0
- package/dist/terminal/snapshot.js +13 -0
- package/dist/terminal/snapshot.js.map +1 -0
- package/docs/api.md +8 -1
- package/docs/cli-behavior.md +930 -43
- package/docs/cli-output.md +4 -0
- package/docs/cli.md +15 -9
- package/docs/codex/cli.md +44 -0
- package/docs/embedding.md +7 -0
- package/docs/login-recovery.md +24 -0
- package/docs/native-question-proofs.md +57 -0
- package/docs/performance/terminal-engines.md +88 -0
- package/docs/performance.md +193 -0
- package/docs/questions.md +181 -0
- package/package.json +1 -1
- package/prd/04-architecture.md +15 -0
- package/prd/05-api/5.1-starting-claude.md +11 -1
- package/prd/05-api/5.10-questions.md +117 -0
- package/prd/05-api/5.3-claude-session-api.md +293 -24
- package/prd/05-api/5.4-events.md +159 -32
- package/prd/05-api/5.5-starting-codex.md +85 -18
- package/prd/05-api/5.7-codex-session-api.md +143 -5
- package/prd/05-api/5.8-session-api.md +58 -6
- package/prd/05-api/5.9-loops.md +11 -1
- package/prd/05-api/README.md +2 -0
- package/prd/06-claude-hook-bridge.md +115 -0
- package/prd/07-claude-policy.md +2 -0
- package/prd/07a-codex-hook-bridge.md +90 -0
- package/prd/08-state.md +51 -10
- package/prd/09-lifecycle.md +79 -3
- package/prd/10-errors.md +9 -2
- package/prd/12a-cli.md +13 -7
- package/prd/13-latitude.md +89 -0
- package/prd/14-conformance.md +84 -30
- package/prd/16-maintainer-review.md +75 -0
- package/prd/README.md +1 -0
package/docs/cli-behavior.md
CHANGED
|
@@ -20,8 +20,34 @@ When a fact drives an implementation decision, the code and the matching PRD
|
|
|
20
20
|
conformance criterion are cited. If you change behavior here, update `prd/`
|
|
21
21
|
first (see `CLAUDE.md` / `AGENTS.md`), then this file.
|
|
22
22
|
|
|
23
|
+
## Approval policy compatibility
|
|
24
|
+
|
|
25
|
+
Codex 0.155.1 rejects `--ask-for-approval untrusted`; its accepted values are
|
|
26
|
+
`on-request` and `never`. Real approval-flow tests on this version use `on-request`
|
|
27
|
+
with a read-only sandbox and a tool that needs to write, then approve the native
|
|
28
|
+
escalation dialog. An `untrusted` fixture exits before readiness and cannot test
|
|
29
|
+
working-dialog clearance. Verified from the installed CLI's argument error on
|
|
30
|
+
2026-09-19 while exercising C-ATTN-02.
|
|
31
|
+
|
|
23
32
|
## Readiness
|
|
24
33
|
|
|
34
|
+
**Codex 0.159.2 adds a warning counter to its shortcuts footer.** A bounded
|
|
35
|
+
invalid-model cold-start probe on 2026-10-01 captured `? for shortcuts` followed
|
|
36
|
+
on the same row by `⚠ 3 warnings · f2 to view`, below the model footer and empty
|
|
37
|
+
`› Ask Codex to do anything` composer. Its animated welcome said “Follow the
|
|
38
|
+
white cursor.” The existing footer grammar rejects this captured row. The trace separately
|
|
39
|
+
showed a retained trust episode and a held 10-second readiness deadline; it did
|
|
40
|
+
not capture each observed frame, so it cannot attribute the original gate or
|
|
41
|
+
prove that this final snapshot was the frame at that deadline. No submission Enter or UserPromptSubmit occurred,
|
|
42
|
+
so the probe establishes startup layout/readiness evidence, not hook/transcript
|
|
43
|
+
ordering. Clearance accepts the bounded native warning-count suffix while still
|
|
44
|
+
requiring current settled frame, visible input cursor, native model chrome, and
|
|
45
|
+
absence of active dialogs or work. A follow-up probe with this grammar recorded
|
|
46
|
+
folder trust followed by the warning-bearing composer: the trust hold cleared,
|
|
47
|
+
and both cold and resumed sessions reached ready and delivered exactly one
|
|
48
|
+
invalid-model submission with one `UserPromptSubmit` each. No valid model was
|
|
49
|
+
used. C-API-28, C-TRUST-01.
|
|
50
|
+
|
|
25
51
|
**Codex fires its `SessionStart` hook lazily — on the first turn, not at boot.**
|
|
26
52
|
Any experiment that waits for a boot-time Codex hook *without running a turn* is
|
|
27
53
|
invalid and will conclude the hook "never fires". (This once produced a false
|
|
@@ -106,6 +132,17 @@ misattributed to a CLI regression.)
|
|
|
106
132
|
|
|
107
133
|
## Turn boundaries (rendered TUI)
|
|
108
134
|
|
|
135
|
+
- **Claude 2.1.281 can use `◐ Claude Code` as its OSC working title.** A native
|
|
136
|
+
173×35 capture on 2026-09-23 showed `✻ Wandering… (0s)` above a fenced empty
|
|
137
|
+
composer, with a visible cursor at column 2, row 15 (zero-based), and no
|
|
138
|
+
`esc to interrupt` footer. The preceding frame showed a running
|
|
139
|
+
`UserPromptSubmit` hook with the same title. The session later reached a usage
|
|
140
|
+
limit; this capture proves working-title geometry, not a successful answer.
|
|
141
|
+
`tests/fixtures/claude-2.1.281/working.txt` retains the nonempty captured rows
|
|
142
|
+
with the temporary directory normalized. The title matcher accepts the
|
|
143
|
+
observed `◐ ` prefix alongside the existing braille range; both screen facts
|
|
144
|
+
and live trust clearance share it. No other new spinner glyph is inferred.
|
|
145
|
+
C-TURN-05, C-TRUST-01.
|
|
109
146
|
- Both CLIs render the literal `esc to interrupt` only while a turn is running
|
|
110
147
|
(Claude footer, Codex "Working" spinner). Elwood's `TurnStateWatcher` keys off
|
|
111
148
|
this, and **arms only after initial readiness** because the Codex MCP boot
|
|
@@ -132,11 +169,95 @@ array of `{ type: "output_text", text }` entries. Only the assistant record with
|
|
|
132
169
|
progress narration, and user/developer message records are inputs. Current
|
|
133
170
|
sessions emit no legacy `agent_message` duplicate, so treating `content` as a
|
|
134
171
|
plain string silently drops the reply text. The transcript adapter therefore
|
|
135
|
-
extracts
|
|
136
|
-
|
|
172
|
+
extracts assistant `final_answer` records as `assistant_message` and
|
|
173
|
+
`commentary` records as `assistant_progress`, while retaining legacy
|
|
174
|
+
string/final `agent_message` support. Explicit non-final legacy mirrors keep
|
|
175
|
+
only their raw observation. C-CODEX-16, C-CODEX-22.
|
|
137
176
|
|
|
138
177
|
## Model selection persistence
|
|
139
178
|
|
|
179
|
+
- **A configured legacy Codex model may be absent from `/model`.** On Codex
|
|
180
|
+
0.154.0, `gpt-5.1-codex` still appeared in the session header but not in the
|
|
181
|
+
visible catalog; every returned row correctly had `isCurrent: false`.
|
|
182
|
+
Real picker tests should let the installed CLI choose its launch default,
|
|
183
|
+
rather than pinning a model that can disappear from the catalog.
|
|
184
|
+
- **A model dialog replaces the composer; nothing renders below it.** Full-viewport
|
|
185
|
+
captures from Claude 2.1.274 and Codex 0.154.0 (2026-09-17,
|
|
186
|
+
`tests/helpers/model-dialog-viewports.ts`) show the picker, Codex's reasoning
|
|
187
|
+
level, and Claude's cache warning each ending the viewport, while the closed
|
|
188
|
+
state puts the composer back (`❯` between rules; `› Ask Codex to do anything`).
|
|
189
|
+
Rows ABOVE the dialog are ordinary transcript: Claude keeps `❯ /model` and reply
|
|
190
|
+
rows (`⏺` on 2.1.274, `●` earlier) there, so provenance is "no conversation or
|
|
191
|
+
composer row BELOW the header", never "none above". Picker text quoted in a reply
|
|
192
|
+
always has the working row and composer beneath it, so it is not a live dialog
|
|
193
|
+
and must never receive an Escape, which would interrupt the running turn. Claude
|
|
194
|
+
2.1.274's picker also carries an effort row (`◉ xHigh effort ←/→ to adjust`)
|
|
195
|
+
between its rows and footer. A closed Claude picker leaves only `❯ /model` /
|
|
196
|
+
`⎿ Kept model as …` behind, no header. Two more things are never a dialog: the
|
|
197
|
+
phrase on a reply or composer row itself (`❯ Select model` is staged input), and
|
|
198
|
+
a quoted picker above another dialog. Below its header a native dialog holds
|
|
199
|
+
exactly one contiguous block of picker rows (description column, numbered from 1,
|
|
200
|
+
at most one cursor); any other caret or numbered row (`❯ 1. Yes`, ` 1. Yes`, a
|
|
201
|
+
staged `❯ 1. fix this then that`) restarts the numbering, follows the blank or
|
|
202
|
+
rule that separates the composer, or lacks the column, and marks the region as
|
|
203
|
+
someone else's. The block must also be COMPLETE before Elwood treats it as live:
|
|
204
|
+
every captured picker and reasoning screen carries at least two numbered rows and
|
|
205
|
+
a closing hint row (`Esc to cancel`, `esc to go back`). A header with neither —
|
|
206
|
+
a transcript quoting `Select model` above a trust or hook prompt, or above a
|
|
207
|
+
reply's own numbered list — is a fragment, and Escaping it would dismiss the live
|
|
208
|
+
prompt underneath. The CURSOR is deliberately not required: a complete picker
|
|
209
|
+
still painting its cursor is live and must keep holding input, and `setPickerModel`
|
|
210
|
+
rejects the missing cursor on its own.
|
|
211
|
+
- **A live switch dialog is never hung directly off an agent reply row.** The warning
|
|
212
|
+
screen carries no closing hint row, so completeness cannot be judged the way the
|
|
213
|
+
picker's is. Indentation cannot judge it either — the title itself may sit at column
|
|
214
|
+
zero, so a column test passes a staged draft straight through. Nor can option ORDER:
|
|
215
|
+
`Yes` normally precedes `No`, but a real reordered layout exists where the cursor starts
|
|
216
|
+
on `No` above `Yes` (`claudeModelCacheConfirmationYesBelow`), so an affirmative-first
|
|
217
|
+
rule rejects a live dialog. What does hold is the separator: Claude replaces the composer
|
|
218
|
+
with the dialog, so a live one is preceded by its rule (or the blank line before it),
|
|
219
|
+
never by an agent reply bullet. `parseClaudeSwitchConfirmation` therefore rejects a title
|
|
220
|
+
sitting DIRECTLY under a reply row, and reads options only from the dialog's own
|
|
221
|
+
contiguous run of action rows, so a staged `❯ Yes, switch to Fable` below a quoted
|
|
222
|
+
warning cannot pair with a quoted `No, go back`. C-API-24, C-ATTN-04.
|
|
223
|
+
- **A picker's closing hint row TERMINATES its region.** Only blank lines and rules may
|
|
224
|
+
follow it. Otherwise a transcript quoting a complete picker — footer and all — above a
|
|
225
|
+
live trust or hook prompt still reads as a live picker, and Escaping it would dismiss
|
|
226
|
+
the human's prompt instead. For the same reason the header must be prose: a numbered
|
|
227
|
+
composer draft (`❯ 1. Select model draft` / `2. next text` / `Esc to cancel`)
|
|
228
|
+
otherwise satisfies the row and footer grammar entirely on its own. C-API-24.
|
|
229
|
+
- **A picker mid-repaint is briefly unrecognizable, so one clear frame proves nothing.**
|
|
230
|
+
This is the same shape as the resume-replay settling above, and the picker hold reuses
|
|
231
|
+
that measured value (5 frames) rather than inventing a smaller one: the replay's quiet
|
|
232
|
+
gaps were measured at one frame and 5 clears them with margin, while the picker's gap
|
|
233
|
+
length is NOT measured. The failure directions are asymmetric — too high delays
|
|
234
|
+
releasing the input hold, too low releases queued input into a repainting dialog where
|
|
235
|
+
Enter applies the highlighted model — so the conservative measured precedent wins until
|
|
236
|
+
someone captures real picker repaint frames. Cleanup uses a shorter streak on purpose
|
|
237
|
+
because it is bounded at one second and must send its Escapes inside that budget; it
|
|
238
|
+
hands off to the survivor hold, which applies the full streak, so nothing is released
|
|
239
|
+
early. `src/runtime/session/picker-cleanup.ts`, C-API-55.
|
|
240
|
+
- **Escape on a follow-up stage returns to the picker, not the composer.** On both
|
|
241
|
+
Claude 2.1.274 (cache warning) and Codex 0.154.0 (reasoning level) one Escape
|
|
242
|
+
reopens `Select model` / `Select Model and Effort`; a second closes it. Failure
|
|
243
|
+
cleanup therefore sends one Escape per stage and never repeats one: a second
|
|
244
|
+
Escape during a slow repaint would land on the composer. C-API-55.
|
|
245
|
+
- **Claude paints its cache warning over the picker, with one partial frame.** A
|
|
246
|
+
5 ms frame capture on Claude 2.1.274 (2026-09-17) shows no idle composer between
|
|
247
|
+
the `s` key and the warning: 28 ms after the key one frame has `Switch model?`
|
|
248
|
+
and the cache copy above STALE picker rows (`❯ 1. Fable …`), with neither
|
|
249
|
+
`Select model` nor the Yes/No options; 7 ms later the dialog is complete
|
|
250
|
+
(numbered, cursor on `1. Yes, switch to …`). In that frame the title-only shell
|
|
251
|
+
cannot be told from a `PreModelSwitch` hook confirmation, so Elwood holds input on
|
|
252
|
+
it and never writes to it, and `setModel` does not treat a caret-only row
|
|
253
|
+
elsewhere in the viewport (a reply quoting the prompt) as the returned composer
|
|
254
|
+
while the shell is up. Before this, `setModel` resolved on that frame without
|
|
255
|
+
ever confirming the switch. C-API-24, C-API-55.
|
|
256
|
+
- **Picker text visible before `/model` is submitted is not Elwood's.** A closed
|
|
257
|
+
picker leaves no header behind, so `Select model` / `Select Model and Effort` /
|
|
258
|
+
`Select Reasoning Level` text that precedes the command is a human's dialog or a
|
|
259
|
+
transcript quote (which the unanchored open check would otherwise parse and
|
|
260
|
+
drive). The operation rejects without writing. C-API-55.
|
|
140
261
|
- **Codex persists `/model` picker selections into the user `config.toml`.**
|
|
141
262
|
`setModel` restores the prior default via compare-and-swap after switching
|
|
142
263
|
(C-CODEX-14), skipping with a `codex_default_model_persisted` warning on a
|
|
@@ -191,6 +312,236 @@ select a destructive-rider affirmative, and never answer a specific-affirmative
|
|
|
191
312
|
prompt (e.g. hook trust) with a generic "Yes". `src/core/trust/responder.ts`,
|
|
192
313
|
`src/core/trust/prompts.ts`, verified by `tests/e2e/trust-prompt-claude.e2e.ts`.
|
|
193
314
|
|
|
315
|
+
**Codex 0.156.1 uses a new folder-access dialog.** A native PTY capture on
|
|
316
|
+
2026-09-23 showed `Folder access`, the working directory, `Trust this folder?`,
|
|
317
|
+
the explanation beginning `Codex can read, edit, and run files here`, numbered
|
|
318
|
+
`Trust and continue` / `Quit` choices, and `enter continue · esc quit`. The question
|
|
319
|
+
and explanation share a row and wrap together. The previous grammar missed both
|
|
320
|
+
the question and footer, let startup report ready, and sent an image paste into
|
|
321
|
+
the unanswered dialog. Keep this layout as a separate exact-copy allowlist entry:
|
|
322
|
+
`autotrust` may select only `Trust and continue`; partial or changed copy must hold
|
|
323
|
+
input without approving it. The sanitized capture is
|
|
324
|
+
`tests/fixtures/codex-0.156.1/folder-access.txt`; parser and session regressions
|
|
325
|
+
cover both `autotrust` settings. A native rerun with this grammar answered the gate
|
|
326
|
+
and attached the first image; its later cancelled-draft cleanup failed separately,
|
|
327
|
+
so this is trust/attachment evidence, not a passing successor-cleanup run. C-TRUST-01.
|
|
328
|
+
|
|
329
|
+
### Where the clearance grammar lives
|
|
330
|
+
|
|
331
|
+
"This frame is the CLI's own idle composer, so the gate cleared" is a per-CLI layout
|
|
332
|
+
fact, and both CLIs change their chrome independently. It therefore lives with each
|
|
333
|
+
adapter's other verified screen facts — `claudeTrustClearance` in
|
|
334
|
+
`src/claude/screen-table.ts`, `codexTrustClearance` in `src/codex/screen-table.ts` —
|
|
335
|
+
and is injected into the shared coordinator (`TrustPromptResponder`/`trustView`).
|
|
336
|
+
When a CLI's banner, status row, or composer placeholder changes, update that adapter's
|
|
337
|
+
predicate. Codex's text grammar lives in `src/codex/screen/clearance.ts` and checks
|
|
338
|
+
known placeholders plus a native model footer or complete welcome box. Text-only
|
|
339
|
+
callers conservatively reject approval-like rows; the live session additionally
|
|
340
|
+
uses the actual visible input cursor to identify the composer, so transcript
|
|
341
|
+
caret/numbered rows above that input remain legitimate history. Dialogs hide the
|
|
342
|
+
cursor or leave it outside the composer. A bare caret never proves clearance.
|
|
343
|
+
Controlled post-settlement fixtures show that indented approval/trust headers or
|
|
344
|
+
cursor-option blocks can coexist with a stale visible composer cursor. Clearance
|
|
345
|
+
shares native trust-header classification without expanding C-ATTN-03 reporting.
|
|
346
|
+
The captured 0.156.1 `Folder access` prelude holds before copy/choices finish;
|
|
347
|
+
a selected numbered choice still holds after the prelude erases. Fresh composer
|
|
348
|
+
replacement clears the gate. These fragments veto staged recovery and empty ACK.
|
|
349
|
+
Assistant quotations require a native non-working assistant row and contiguous
|
|
350
|
+
indentation; blank/column-zero rows end them. Wrapped user history requires a
|
|
351
|
+
column-zero prompt, indented/blank continuation, then a non-working assistant
|
|
352
|
+
reply as its next column-zero row. Unknown rows and native numbered-choice blocks
|
|
353
|
+
cannot establish provenance. Bounded completed numbered user history remains
|
|
354
|
+
valid regardless of its number or label. Selected numbered rows outside that
|
|
355
|
+
completed history or an assistant quotation hold even without siblings. Generic
|
|
356
|
+
quoted menus and caret prompts retain live-cursor history treatment; unquoted option
|
|
357
|
+
blocks hold regardless of labels. Arbitrary identical dialog/transcript text is
|
|
358
|
+
not claimed distinguishable from one frame.
|
|
359
|
+
Native working rows and the live OSC working title retain the hold; prose that
|
|
360
|
+
merely quotes `esc to interrupt` is not a native working row. The title, cursor,
|
|
361
|
+
and text are read synchronously from the same completed render, including during
|
|
362
|
+
trust-attempt polling. Raw PTY receipt invalidates the proof before batching.
|
|
363
|
+
Both adapters now apply the same received/rendered boundary to human trust
|
|
364
|
+
clearance and every retry read. A render failure permanently invalidates that
|
|
365
|
+
terminal view; an unavailable view withholds automation within its existing
|
|
366
|
+
deadline. This guards bytes already received, not future output the CLI has yet
|
|
367
|
+
to send. A completed snapshot is reused until its render or viewport changes.
|
|
368
|
+
That includes an oversized receipt's staged tail: completion of its first 64-KiB
|
|
369
|
+
batch alone is not a complete render. The native working row includes elapsed
|
|
370
|
+
time before the interrupt hint (seconds, minutes/seconds, or hours/minutes/seconds),
|
|
371
|
+
as rendered by [Codex 0.142.5's status widget](https://github.com/openai/codex/blob/rust-v0.142.5/codex-rs/tui/src/status_indicator_widget.rs).
|
|
372
|
+
Parenthesized transcript prose without that native status grammar is not work.
|
|
373
|
+
An exact-shaped quotation such as `• Thinking (3s • esc to interrupt)` is ambiguous
|
|
374
|
+
and retains the hold. A real Codex 0.155.1 rejected-model probe showed a visible
|
|
375
|
+
column-two input cursor throughout native working frames; typing remains possible
|
|
376
|
+
while a turn runs. The title spinner is configurable, and status location varies
|
|
377
|
+
with preview rows, so neither missing title animation nor editable input disproves
|
|
378
|
+
that exact native status. We do not promise to distinguish identical transcript
|
|
379
|
+
and status rows from text/cursor evidence alone.
|
|
380
|
+
Real 0.142.5 and 0.155.1 trust/model dialog captures start DEC2026 before painting,
|
|
381
|
+
then hide the cursor with DEC25l before ending DEC2026. A 0.155.1 command approval
|
|
382
|
+
under `read-only`/`on-request` uses the same ordering: its selected Yes row ends
|
|
383
|
+
with the cursor hidden, not left visible on an old composer. Replaying all 1,078
|
|
384
|
+
character prefixes of that actual approval paint retains the hold; Escape restores
|
|
385
|
+
the visible composer afterward. The raw capture is preserved in
|
|
386
|
+
`tests/fixtures/codex-command-approval-render.ts`. These observations apply to the
|
|
387
|
+
captured versions and dialog types; a new CLI renderer needs new verification.
|
|
388
|
+
Those native partial frames cannot combine settled rendering with a stale visible
|
|
389
|
+
composer cursor. Captured protocol regressions replay the native bytes through trust clearance,
|
|
390
|
+
staged recovery, and empty-input guards. They establish the synchronized/hidden
|
|
391
|
+
cursor barriers, not an observed settled-visible partial dialog. Controlled
|
|
392
|
+
actual-session fixtures separately exercise that post-settlement policy.
|
|
393
|
+
The Claude predicate uses `src/core/trust/clearance.ts` for its separate grammar.
|
|
394
|
+
A real Claude 2.1.278 classic-renderer capture hides the cursor during trust and
|
|
395
|
+
restores it at column two on the composer only at the end of its idle paint.
|
|
396
|
+
Unlike the captured Codex renderer, that Claude paint has no DEC2026 envelope.
|
|
397
|
+
Splitting its bytes immediately before the final DEC25h leaves complete-looking
|
|
398
|
+
composer chrome while native cursor restoration is still pending. Live Claude
|
|
399
|
+
clearance therefore also verifies the visible native cursor on its composer row;
|
|
400
|
+
receipt settlement alone cannot identify that native paint boundary.
|
|
401
|
+
The same Claude 2.1.278 capture hides its cursor with DEC25l before repainting
|
|
402
|
+
its model menu. After that complete control, all 1,241 remaining character prefixes
|
|
403
|
+
retain the live hold, including prefixes where old composer chrome still passes the
|
|
404
|
+
text-only grammar. `tests/fixtures/claude-model-dialog-render.ts` preserves that
|
|
405
|
+
menu repaint without user paths or conversation content, and
|
|
406
|
+
`tests/unit/claude-model-dialog-render.test.ts` replays every prefix. This evidence
|
|
407
|
+
covers the captured model dialog; it does not establish behavior for arbitrary
|
|
408
|
+
replacement prompts or future Claude renderers.
|
|
409
|
+
|
|
410
|
+
Claude 2.1.278 can paint the complete folder-trust dialog before accepting keyboard
|
|
411
|
+
navigation. In the real human-trust test, immediate Down/Enter writes left the
|
|
412
|
+
selection on "No, exit". Waiting for the selected "Yes, I trust this folder" repaint
|
|
413
|
+
before Enter cleared the dialog. The test records physical PTY writes and confirms
|
|
414
|
+
that queued caller input follows native cursor clearance; it does not require a
|
|
415
|
+
model response or available turn quota.
|
|
416
|
+
|
|
417
|
+
`tests/e2e/codex-live-clearance.e2e.ts` also exercises production `startCodex`
|
|
418
|
+
with a fresh isolated configuration: queued input stays held at the human-owned
|
|
419
|
+
directory gate, then one benign prompt reaches `UserPromptSubmit` after manual
|
|
420
|
+
trust and visible native cursor clearance. Verified against installed Codex
|
|
421
|
+
0.155.1; the test cleans up the real session rather than waiting for model output.
|
|
422
|
+
|
|
423
|
+
A startup-only real PTY probe of Codex 0.142.5 on 2026-09-19 confirmed the
|
|
424
|
+
model-only `gpt-5.5 high` footer with `tui.status_line = ["model-with-reasoning"]`.
|
|
425
|
+
Its placeholder is randomized: observed `Use /skills to list available skills`,
|
|
426
|
+
`Find and fix a bug in @filename`, and `Implement {feature}` across launches.
|
|
427
|
+
The predicate recognizes the eight fixed placeholders in the version-tagged upstream
|
|
428
|
+
`chatwidget.rs` as well as the captured 0.154.0 default. It still requires native
|
|
429
|
+
footer or welcome-box evidence. The sanitized 100×30 capture and provenance are
|
|
430
|
+
in `tests/fixtures/codex-0.142.5/`; no model prompt was submitted.
|
|
431
|
+
|
|
432
|
+
### Native regions and live confirmation
|
|
433
|
+
|
|
434
|
+
Claude 2.1.252 places `Accessing workspace:` and the workspace path **before**
|
|
435
|
+
the trust question. The question may wrap; its explanatory copy is:
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
(Like your own code, a well-known open source project, or work from your team). If not,
|
|
439
|
+
take a moment to review what's in this folder first.
|
|
440
|
+
Claude Code'll be able to read, edit, and execute files here.
|
|
441
|
+
Security guide
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
The 2.1.206 capture omits `, or work from your team`. Blank rows and wrapping
|
|
445
|
+
remain part of one dialog. Unknown explanatory text, titles, or option rows do
|
|
446
|
+
not authorize an answer. Conversation prefixes (`●`, `•`, user/composer markers)
|
|
447
|
+
remain provenance even when they precede an exact quoted trust question; slicing
|
|
448
|
+
at the question must not discard them.
|
|
449
|
+
|
|
450
|
+
Native Codex 0.154.0 captures at 100 columns (2026-09-16) place
|
|
451
|
+
`> You are in /absolute/project/path` before the directory question. The question
|
|
452
|
+
and explanation begin on the same row and wrap:
|
|
453
|
+
|
|
454
|
+
```
|
|
455
|
+
Do you trust the contents of this directory? Working with untrusted contents comes with higher
|
|
456
|
+
risk of prompt injection. Trusting the directory allows project-local config, hooks, and exec
|
|
457
|
+
policies to load.
|
|
458
|
+
› 1. Yes, continue
|
|
459
|
+
2. No, quit
|
|
460
|
+
Press enter to continue
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
Its hook gate renders `Hooks need review`, `1 hook is new or changed.`, and
|
|
464
|
+
`Hooks can run outside the sandbox after you trust them.`, followed by
|
|
465
|
+
`Review hooks`, `Trust all and continue`, and
|
|
466
|
+
`Continue without trusting (hooks won't run)` as numbered choices. Its footer is
|
|
467
|
+
`Press enter to confirm or esc to go back` — accepting only `esc to cancel`
|
|
468
|
+
incorrectly rejects this real dialog. These PTY captures supersede the earlier
|
|
469
|
+
0.144.4 binary-string evidence for those layouts. No captured path follows the
|
|
470
|
+
trust header; do not add generic path/prose acceptance based on that assumption.
|
|
471
|
+
|
|
472
|
+
The native Codex 0.154.0 input loop can swallow the first numbered confirmation:
|
|
473
|
+
the PTY write fulfills while the directory gate stays visible. In the 2026-09-16
|
|
474
|
+
high-trust probe, a manual repeat at eight seconds cleared that same gate; the
|
|
475
|
+
first write had already produced premature startup activity at roughly one second.
|
|
476
|
+
Numbered automation therefore retries every 250 ms for at most five seconds,
|
|
477
|
+
revalidates the same header and exact option identity before each write, and
|
|
478
|
+
reports answered only after the gate clears. A native directory-to-hook transition
|
|
479
|
+
confirms directory clearance without sending an old answer to the hook gate.
|
|
480
|
+
An observed clear-and-reappear generation cancels the old attempt.
|
|
481
|
+
|
|
482
|
+
Cursor navigation rereads between individual arrows and Enter. Both navigation
|
|
483
|
+
styles now belong to one session-owned coordinator: each observed dialog
|
|
484
|
+
generation owns its reservation, deadline, exact affirmative, and completion.
|
|
485
|
+
An old cancelled attempt cannot release or settle a reappeared gate. The five-
|
|
486
|
+
second bound starts at the first native-header candidate, including partial
|
|
487
|
+
painting. Candidate recognition holds input; only the stricter native-dialog
|
|
488
|
+
recognizer authorizes writes, and it requires the native explanatory copy above:
|
|
489
|
+
a bare header with affirmative rows (a forged or half-painted frame) is held and
|
|
490
|
+
never typed into. Every captured layout (Claude 2.1.206/2.1.252, the 2.1.274
|
|
491
|
+
binary's component, Codex 0.154.0) renders that copy with its header. Unknown replacement text is not clearance. Native
|
|
492
|
+
composer chrome or a verified successor gate confirms clearance; a bare caret
|
|
493
|
+
alone cannot distinguish a composer from a one-option dialog.
|
|
494
|
+
|
|
495
|
+
A stable unsupported or exhausted gate becomes recoverable `blocked` with the
|
|
496
|
+
existing attention rule id after five seconds, even when the terminal emits no
|
|
497
|
+
new data. This is the deliberate fallback approved for autotrust. A later valid
|
|
498
|
+
layout or new generation re-arms safe automation; an unchanged redraw does not
|
|
499
|
+
restart an expired loop. Once fallback is visible, the block remains until
|
|
500
|
+
verified clearance. Raw human keys remain available, while queued persona,
|
|
501
|
+
paste, and command input stays held. Stop, kill, teardown, startup cleanup and
|
|
502
|
+
PTY exit cancel pending automation and timers before disposal. Only a rejected
|
|
503
|
+
PTY write belonging to a still-live matching attempt emits
|
|
504
|
+
`startup_prompt_write_failed`; cancellation and late settlement stay quiet.
|
|
505
|
+
|
|
506
|
+
Both CLIs reword gates often, so an off-allowlist gate behind a recognized header
|
|
507
|
+
prefix fails closed: a header-shaped region (`headerStart` in
|
|
508
|
+
`src/core/trust/dialog.ts`) with real header text, selectable options, only
|
|
509
|
+
option rows and a frame-ending native footer beneath it, and no conversation row
|
|
510
|
+
above it holds input as `<agent>-unknown_gate-prompt` and is never written to. Both
|
|
511
|
+
CLIs paint the composer below conversation content, so quoted or model-written
|
|
512
|
+
question-plus-list prose fails that tail test. The footer is required because options
|
|
513
|
+
paint before it. A gate whose first words fall outside `headerStart` (e.g.
|
|
514
|
+
`Allow ...?`) is NOT held: a purely structural recognizer would also catch dialogs
|
|
515
|
+
Elwood drives itself (the Codex model picker ends in `Press enter to confirm or esc
|
|
516
|
+
to go back`).
|
|
517
|
+
|
|
518
|
+
A fulfilled write alone does not prove the gate cleared. Real-CLI checks use a
|
|
519
|
+
separate raw visibility oracle so production recognition failures cannot make
|
|
520
|
+
the tests report the gate absent. Sanitized native Claude 2.1.274 and Codex
|
|
521
|
+
0.154.0 post-trust composer captures anchor the positive-clearance tests.
|
|
522
|
+
A no-model Codex resize probe at 100×12, 100×8 and 100×6 confirms that the welcome
|
|
523
|
+
box can scroll away while its composer and model/reasoning/path footer remain.
|
|
524
|
+
Those native rows also prove clearance; welcome presence is not required.
|
|
525
|
+
|
|
526
|
+
### Native Codex startup warnings
|
|
527
|
+
|
|
528
|
+
Codex 0.154.0 normally collapses MCP failures to
|
|
529
|
+
`⚠ 1 MCP startup issue · ctrl + t for details`. Its Ctrl+T overlay retains the
|
|
530
|
+
canonical detailed MCP and login warning rows beneath the boxed welcome header.
|
|
531
|
+
The collapsed count cannot supply server names or recovery instructions; Elwood
|
|
532
|
+
does not send Ctrl+T automatically. Captures and the local failing-server/401
|
|
533
|
+
real-CLI test verify the detailed rows. The current welcome chrome and native
|
|
534
|
+
warning prefixes distinguish these banners from conversational quotations.
|
|
535
|
+
|
|
536
|
+
Native 0.154.0 startup renders no `•`/`●` row at any point: recorded frame by frame
|
|
537
|
+
(2026-09-17) through the directory gate, hooks gate, welcome, and composer with
|
|
538
|
+
both an MCP endpoint that fails at once and one that accepts the connection and
|
|
539
|
+
never answers (the collapsed warning appears after ~10 s with no boot spinner).
|
|
540
|
+
Warning recognition therefore ends at the first assistant-marker row or the
|
|
541
|
+
first caller-side write, whichever comes first; after that a copied welcome box
|
|
542
|
+
whose own marker has scrolled away is content. A CLI version that painted a `•`
|
|
543
|
+
boot spinner before its warnings would lose those warnings rather than forge any.
|
|
544
|
+
|
|
194
545
|
### Bypass-permissions acceptance dialog (`--high-trust`)
|
|
195
546
|
|
|
196
547
|
Claude Code carries a one-time disclaimer for bypass mode. Its wording, taken
|
|
@@ -231,26 +582,26 @@ therefore version/account-gated, and Elwood must be correct in BOTH states:
|
|
|
231
582
|
security reasons` is the CLI's own refusal; Elwood does not special-case it —
|
|
232
583
|
it surfaces as the ordinary start failure with the CLI's message.
|
|
233
584
|
|
|
234
|
-
**Do not equate `autotrust` with
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
585
|
+
**Do not equate `autotrust` with readiness until the real gate clears.** The
|
|
586
|
+
automation gate holds the 10 s initial-ready fallback and queued input from the
|
|
587
|
+
first native trust candidate. Successful bounded automation does not report a
|
|
588
|
+
human block; unsupported or exhausted attempts transfer to the recoverable block
|
|
589
|
+
above. C-E2E-09 requires both `ready` and a cleared trust screen; an unanswerable
|
|
590
|
+
real frame is a failure, not a skip.
|
|
591
|
+
|
|
592
|
+
The responder emits one transient `attention` when a recognized header and its
|
|
593
|
+
native body paint before the affirmative option. A header whose body has not
|
|
594
|
+
validated is held silently: it emits no transient `attention`, only the
|
|
595
|
+
five-second fallback if it never completes. A headless owner must ignore that
|
|
596
|
+
transient only when its trust policy already authorizes the exact allowlisted
|
|
597
|
+
prompt; `--no-trust` and generic permission dialogs remain human blocks. The startup replay buffer can
|
|
246
598
|
deliver this attention after the responder has already continued, so treating
|
|
247
599
|
every attention event as fatal produces a false `blocked_prompt`.
|
|
248
600
|
|
|
249
601
|
## Codex in-TUI update prompt (and the restart loop)
|
|
250
602
|
|
|
251
603
|
Independent of the `autoupdate` preflight (`codex update` run before spawn), the
|
|
252
|
-
Codex TUI can show its OWN "update available" prompt at launch. Elwood **
|
|
253
|
-
skips it** — it never selects "Update now" — because letting the live TUI update
|
|
604
|
+
Codex TUI can show its OWN "update available" prompt at launch. Elwood **only selects a verified safe skip choice** — it never selects "Update now" — because letting the live TUI update
|
|
254
605
|
itself restarts Codex out from under the PTY session. The real update is the
|
|
255
606
|
preflight; the in-TUI prompt is a nuisance to dismiss.
|
|
256
607
|
|
|
@@ -258,19 +609,37 @@ preflight; the in-TUI prompt is a nuisance to dismiss.
|
|
|
258
609
|
"accepts" (or that Elwood used to leave latched) restarts Codex, the update does
|
|
259
610
|
**not** take (a partial download, a managed install, contention), and the SAME
|
|
260
611
|
update screen returns — an infinite loop stuck on the update screen. The fix is an
|
|
261
|
-
**edge-triggered** skip: skip once per appearance
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
612
|
+
**edge-triggered** skip: skip once per appearance. Unknown or blank replacements
|
|
613
|
+
keep automation revoked until authoritative native composer clearance or fresh
|
|
614
|
+
first-party banner evidence permits a new appearance. A verified clear can re-arm
|
|
615
|
+
a new bannered appearance after the restart; retained composer text beneath a
|
|
616
|
+
replacement cannot. The old attempt stays revoked even when a new one is authorized.
|
|
617
|
+
|
|
618
|
+
Version-coupled behavior learned here:
|
|
619
|
+
|
|
620
|
+
- Every automated selection requires the current validated first-party banner and
|
|
621
|
+
its current safe numbered choice. All bannerless continuations are withheld,
|
|
622
|
+
including previously observed number/label bindings. The banner activates the
|
|
623
|
+
blocker before choices paint, and retained input remains held until positive
|
|
624
|
+
native composer clearance. Historical accumulated-buffer matching and later
|
|
625
|
+
safe-option-only continuation inference are no longer authorization rules.
|
|
626
|
+
The earlier 0.155.1 full-menu fixture captures preserve the banner at every
|
|
627
|
+
observed size; those fixtures do not establish a genuine bannerless repaint. C-CODEX-12.
|
|
628
|
+
- Captured Codex menus list `Update now` before safe choices. Selection respects
|
|
629
|
+
that ordering, excludes the update action, and compares the current bounded
|
|
630
|
+
option snapshot before each write. Removal or renumbering of a safe choice
|
|
631
|
+
invalidates the prior retry; a fresh bannered safe block gets a new appearance.
|
|
632
|
+
Old and new numbers are never accumulated into one authorized set.
|
|
633
|
+
- Update recognition and input blocking have different lifetimes. An unknown
|
|
634
|
+
replacement is no longer an update. Without a prior recognized update it does
|
|
635
|
+
not create a retained update hold, so queued paste and Enter remain eligible.
|
|
636
|
+
Once an update was recognized, the session retains its input hold until native
|
|
637
|
+
composer and visible cursor in one completed render prove clearance, with no
|
|
638
|
+
working-title signal. The title may be absent or an ordinary directory name. A
|
|
639
|
+
partial repaint or bare caret cannot release it. Specific trust rules keep their
|
|
640
|
+
own labels; otherwise an unowned retained hold reports `codex-unidentified-dialog`.
|
|
641
|
+
Pending automated trust owns its partial repaints and suppresses that generic
|
|
642
|
+
label until its input hold ends.
|
|
274
643
|
- Option labels drift by version. Older codex (0.132/0.133) rendered a numbered
|
|
275
644
|
dialog ("1. Update now / 2. Skip / 3. Skip until next version"). In the installed
|
|
276
645
|
0.149.1 binary, the upgrade notice strings extracted from the native binary read
|
|
@@ -278,16 +647,18 @@ Two version-coupled wrinkles this cost us:
|
|
|
278
647
|
`https://github.com/openai/codex for installation options.`) rather than a
|
|
279
648
|
numbered dialog — so the interactive dialog is not guaranteed on every version.
|
|
280
649
|
The skip is written ONLY when a numbered skip option is actually present
|
|
281
|
-
(`
|
|
650
|
+
(`safeUpdateOption` → `undefined` ⇒ no write), so a passive banner is a harmless no-op.
|
|
651
|
+
If the only skip-shaped choice precedes the update action, the helper also returns
|
|
652
|
+
`undefined` and no key is written.
|
|
282
653
|
Every retry revalidates that the frame still belongs to the captured first-party
|
|
283
|
-
update-prompt generation and uses the safe option's current number.
|
|
284
|
-
|
|
285
|
-
prompt or replacement dialog inherit a stale digit. A prompt that remains blocking
|
|
654
|
+
update-prompt generation and uses the safe option's current number. The current banner must remain visible; a bannerless repaint cannot inherit a
|
|
655
|
+
digit from a cleared/reappeared prompt. A prompt that remains blocking
|
|
286
656
|
but cannot be safely answered becomes `blocked_prompt` after the bounded
|
|
287
657
|
responder/grace window, including runs without a whole-invocation timeout.
|
|
288
|
-
The match set
|
|
289
|
-
layouts
|
|
290
|
-
|
|
658
|
+
The match set is unit-tested against captured
|
|
659
|
+
layouts; the pinned 0.155.1 native experiment below used controlled update metadata. `codex-update-selection.e2e.ts` also replays the documented option
|
|
660
|
+
layout and an adversarial reordered variant through a real PTY and emulator;
|
|
661
|
+
its child acknowledges the physical skip digit it received. If Codex changes the dialog wording, this is the first thing to
|
|
291
662
|
re-capture.
|
|
292
663
|
|
|
293
664
|
**Concurrent-start failure (verified against codex-cli 0.152.1, 2026-09):** the
|
|
@@ -299,11 +670,17 @@ therefore input-blocking facts, not only responder hints: readiness and paste
|
|
|
299
670
|
submission remain suspended until the rendered update frame clears, even after
|
|
300
671
|
the skip key is written. The prompt recognizer accepts the known first-party
|
|
301
672
|
versioned banner before options paint, plus option-only frames when BOTH "Update
|
|
302
|
-
now" and a safe skip/later choice are present.
|
|
303
|
-
|
|
673
|
+
now" and a safe skip/later choice are present. Those bannerless blocks remain recognition evidence only. No bannerless frame
|
|
674
|
+
authorizes automation; the input hold lasts until positive native composer clearance. Generic agent prose
|
|
304
675
|
containing "update available" and the actual 0.149.1 passive installation notice
|
|
305
676
|
do not block.
|
|
306
677
|
|
|
678
|
+
A fulfilled update digit write is not clearance evidence. Update settlement uses
|
|
679
|
+
the same native composer, cursor, title, and completed-render predicate as the
|
|
680
|
+
retained input hold. It also reads the frame observer's existing hold when old
|
|
681
|
+
composer chrome survives beneath replacement text. Missing readers and replacement
|
|
682
|
+
dialogs cancel quietly.
|
|
683
|
+
|
|
307
684
|
The preflight adds a second boundary because global installers can also race
|
|
308
685
|
across separate Elwood parent processes. A per-user/per-adapter atomic lease in
|
|
309
686
|
the account cache (independent of `TMPDIR`) surrounds the required existence check
|
|
@@ -340,6 +717,18 @@ C-CLAUDE-17/18. Verified against the banner text the field reported; there is no
|
|
|
340
717
|
live-CLI e2e (it would mutate real auth), so the matchers are unit-tested against
|
|
341
718
|
captured strings.
|
|
342
719
|
|
|
720
|
+
## Claude login picker handshake (2026-09-23)
|
|
721
|
+
|
|
722
|
+
The `/login` command Enter and the method-picker selection Enter are distinct
|
|
723
|
+
writes in the production login driver. A fixture must await the command Enter
|
|
724
|
+
before painting the picker, then await the picker Enter before painting the auth
|
|
725
|
+
URL/code screen. Advancing on the first Enter can replace the picker before the
|
|
726
|
+
driver observes it. Reproduced through the real driver and fake PTY in
|
|
727
|
+
`tests/claude/session-login.test.ts` with a temporary 250 ms delay before the picker
|
|
728
|
+
stage: the old fixture missed the selection Enter; the corrected handshake passed.
|
|
729
|
+
This was a fixture reproduction, not a fresh native CLI authentication test; no
|
|
730
|
+
new CLI version or native capture was verified.
|
|
731
|
+
|
|
343
732
|
## Input / paste
|
|
344
733
|
|
|
345
734
|
- Caller and LLM text sent via `sendPrompt`/`sendMessage`/`sendGuidance` is
|
|
@@ -347,13 +736,36 @@ captured strings.
|
|
|
347
736
|
bracketed-paste markers (`ESC[200~`/`ESC[201~`) and C0/C1 controls except
|
|
348
737
|
tab/nl/cr, so text can't escape bracketed paste and inject a dialog-confirming
|
|
349
738
|
Enter. C-API-40.
|
|
350
|
-
-
|
|
351
|
-
|
|
352
|
-
|
|
739
|
+
- Codex 0.156.1 renders each pasted tab as one space, regardless of column;
|
|
740
|
+
consecutive tabs remain consecutive spaces. Pasted CR and LF start new rows.
|
|
741
|
+
Verified in an isolated native PTY without submitting a model turn (2026-09-23).
|
|
742
|
+
Recovery checks must use the sanitized payload and its rendered final line,
|
|
743
|
+
otherwise removed controls or preserved tabs make a still-staged draft look absent.
|
|
744
|
+
- A submission's paste, Enter, and recovery Enters are **held while a blocking
|
|
745
|
+
dialog is visible** (`holdWhileUnsafe` / `writeUnsafe`, `src/core/input/abort.ts`),
|
|
746
|
+
so a dialog appearing in the paste→Enter window can't be auto-confirmed. "Visible"
|
|
747
|
+
means observed: each write first awaits `terminal.settled()`, because a dialog can
|
|
748
|
+
be received before it is rendered. xterm parses the first write after user input
|
|
749
|
+
synchronously and later ones on a timer, so that window is real and input-dependent.
|
|
353
750
|
- **Writing a literal ESC byte in source is fragile** — it can be silently
|
|
354
751
|
stripped by an editor/pipeline (this once neutered an interrupt e2e). Always
|
|
355
752
|
write the escape sequence form (``), never a raw ESC character.
|
|
356
753
|
|
|
754
|
+
## Hook bridge request FIN and delayed decisions
|
|
755
|
+
|
|
756
|
+
The generated bridge child calls `client.end(request)` after connecting. That FIN
|
|
757
|
+
ends the request stream while the child still awaits the parent's decision. A
|
|
758
|
+
local real-socket reproduction with a handler held for 100 ms showed the default
|
|
759
|
+
Node server closing its reply side first: the child received empty EOF and exited
|
|
760
|
+
fail-open before the blocking decision existed. `allowHalfOpen: true` keeps the
|
|
761
|
+
reply side available until the handler settles. The server still ends and destroys
|
|
762
|
+
the socket after flushing its reply; shutdown still destroys pending sockets.
|
|
763
|
+
|
|
764
|
+
The regression runs the actual generated child against `HookBridgeServer`, checking
|
|
765
|
+
both the delayed blocking output/exit code and delayed handler-failure diagnostics.
|
|
766
|
+
This is a local bridge/process proof, not a new Claude or Codex CLI capture. PRD
|
|
767
|
+
§6.2/§6.3, C-HOOK-16.
|
|
768
|
+
|
|
357
769
|
## Hook bridge socket path length (macOS ~104-byte cap)
|
|
358
770
|
|
|
359
771
|
macOS caps a Unix domain socket path near 104 bytes (`sockaddr_un.sun_path`); binding
|
|
@@ -435,8 +847,9 @@ Four real-PTY edges were invisible to the unit fixtures:
|
|
|
435
847
|
Run probes in a detached process session so they keep interactive PATH resolution
|
|
436
848
|
without participating in the caller terminal's job control.
|
|
437
849
|
- Current agent TUIs push Kitty keyboard enhancements with `CSI > flags u`. Head mode
|
|
438
|
-
|
|
439
|
-
|
|
850
|
+
mirrors through session cleanup (so the drained final frames are shown), but an
|
|
851
|
+
agent signalled or force-killed there is not guaranteed to emit its matching
|
|
852
|
+
cleanup sequence, so head mode cannot rely on one reaching the physical terminal. The defensive reset must emit
|
|
440
853
|
`CSI < u` before leaving the alternate screen; otherwise every later shell keystroke
|
|
441
854
|
can remain encoded as a `CSI u` key event, making even a typed `reset` unusable.
|
|
442
855
|
|
|
@@ -502,3 +915,477 @@ side-effect-free signal. C-CLI-21 through C-CLI-24.
|
|
|
502
915
|
- Per the testing pyramid in `CLAUDE.md`: anything that interfaces with the real
|
|
503
916
|
CLI SHOULD have a real-CLI e2e. Every fact in this file is one a unit test could
|
|
504
917
|
not have caught.
|
|
918
|
+
|
|
919
|
+
### Codex commentary and final-answer phases (2026-10-20)
|
|
920
|
+
|
|
921
|
+
The reported completed `response_item` fixture retains assistant text in an
|
|
922
|
+
array-form `output_text` block with `phase: "commentary"`. The previous summarizer
|
|
923
|
+
discarded that phase. It now produces `assistant_progress`; final answers retain
|
|
924
|
+
`assistant_message`. Explicit non-final legacy `agent_message` mirrors remain raw
|
|
925
|
+
observations without normalized text, avoiding false final replies and duplicate
|
|
926
|
+
progress. Tests exercise mirrors before and after canonical response items, as
|
|
927
|
+
well as repeated genuine canonical updates.
|
|
928
|
+
|
|
929
|
+
An isolated real Codex 0.159.2 / `gpt-6-luna` low-effort turn passed
|
|
930
|
+
`tests/e2e/codex-commentary.e2e.ts`: one progress event preceded one final event,
|
|
931
|
+
progress observed `running`, the turn ended `ready`, and ergonomic `send()`
|
|
932
|
+
returned only final text. Exactly one paste and Enter were delivered, with zero
|
|
933
|
+
tools. The test uses a private Codex home and empty project, removes that home,
|
|
934
|
+
and checks the parent environment and Codex auth/config/hook file fingerprints.
|
|
935
|
+
Run explicitly with `ELWOOD_NATIVE_COMMENTARY_PROOF=1`; it consumes one small
|
|
936
|
+
valid-model turn. This pinned-version proof does not establish every future CLI
|
|
937
|
+
layout or guarantee that arbitrary prompts will cause a model to send commentary.
|
|
938
|
+
|
|
939
|
+
### Model-picker dispatch and post-cancel composer (2026-09-19)
|
|
940
|
+
|
|
941
|
+
A serial native PTY probe on Codex 0.155.1 and Claude Code 2.1.278 typed
|
|
942
|
+
`/model`, waited 300 ms, then sent Enter. Neither CLI displayed its model picker
|
|
943
|
+
before Enter; both displayed it afterward. Model test drivers must therefore wait
|
|
944
|
+
for the command's submitting Enter before painting the picker. No model prompt was
|
|
945
|
+
submitted in this probe.
|
|
946
|
+
|
|
947
|
+
Codex returned to its known `Ask Codex to do anything` composer and model/effort
|
|
948
|
+
footer after Escape; automated `listModels` then returned five rows. Claude kept
|
|
949
|
+
`❯ /model` and `Kept model as …` in the transcript above its final fenced composer.
|
|
950
|
+
Its idle footer read `-- INSERT -- ⏵⏵ auto mode on (shift+tab to cycle) · ← for
|
|
951
|
+
agents`. A whole-screen clearance predicate that rejects every earlier caret
|
|
952
|
+
therefore rejects this genuine post-picker idle frame. Model clearance must use
|
|
953
|
+
the last composer, its enclosing rules, and its native footer; a bare caret or a
|
|
954
|
+
partial model dialog is insufficient. The sanitized Claude frame is retained in
|
|
955
|
+
`tests/fixtures/claude-2.1.278/model-cancelled.txt`. With this recognition fix,
|
|
956
|
+
Claude also completed automated `listModels` and returned five rows (C-API-55).
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
### Cursor provenance for Codex trust clearance
|
|
960
|
+
|
|
961
|
+
Startup-only probes on 2026-09-19 checked Codex 0.142.5 and 0.155.1 at 100×30,
|
|
962
|
+
without submitting a model prompt. Both hide the cursor with DEC private mode 25
|
|
963
|
+
on the directory-trust and `/model` dialogs, leaving its coordinates on a footer.
|
|
964
|
+
Both show the cursor at column 2 on the native placeholder row after trust and
|
|
965
|
+
after dismissing the picker. Codex 0.155.1 retains this evidence at 100×6.
|
|
966
|
+
The 0.142.5 narrow resize leaves malformed chrome, so that frame is not used as a
|
|
967
|
+
positive fixture. Inspect cursor mode and coordinates together with the same
|
|
968
|
+
completed rendered text and title: an old composer or footer can remain during a
|
|
969
|
+
dialog repaint, and a transcript can contain identical caret/option text.
|
|
970
|
+
|
|
971
|
+
### Cancelled native composer drafts (2026-09-20)
|
|
972
|
+
|
|
973
|
+
Claude Code 2.1.278 and codex-cli 0.155.1 both cleared a staged `[Image #1]` chip
|
|
974
|
+
and text draft when production cancellation cleanup sent Ctrl+U followed by Ctrl+K
|
|
975
|
+
through the real PTY. `tests/e2e/composer-cleanup.e2e.ts` waits for idle readiness,
|
|
976
|
+
observes the image and text, then cancels before Enter; it rejects any submitting
|
|
977
|
+
Enter and observes no `UserPromptSubmit` hook, so no model turn runs. Disabling
|
|
978
|
+
only the production clear write made both tests retain the image and text and fail.
|
|
979
|
+
This verifies an automation-owned idle composer, not cleanup across caller edits
|
|
980
|
+
or blocking dialogs. Codex clipboard text is restored after attachment.
|
|
981
|
+
|
|
982
|
+
|
|
983
|
+
Native startup protocol replies also emit xterm `onData`. The actual-session
|
|
984
|
+
image-cancellation proof exposed this on both adapters: treating those replies as
|
|
985
|
+
caller edits revoked cleanup before its first staged image. A real terminal's
|
|
986
|
+
cursor-position query (`CSI 6 n`) reproduces the revocation without any caller
|
|
987
|
+
input. Ownership now tracks `xterm.input` invocations; parser-generated replies
|
|
988
|
+
preserve authority, while caller keys still revoke it. Startup trust writers also
|
|
989
|
+
use that automation scope: both actual-session trust fixtures showed that writing
|
|
990
|
+
outside it revoked cleanup before the first caller submission.
|
|
991
|
+
|
|
992
|
+
The actual-session image queue also exposed a consumption race: writing the clear
|
|
993
|
+
keys did not establish that Claude had removed the staged image before successor
|
|
994
|
+
attachment. Cleanup therefore waits for a fresh completed empty native frame. A
|
|
995
|
+
bounded Claude probe then found a cleared frame with a visible input cursor at
|
|
996
|
+
column two, enclosing rules, and a version banner: existing whole-frame live
|
|
997
|
+
clearance accepted it, while the post-model-picker suffix predicate rejected it.
|
|
998
|
+
Cleanup accepts either existing positive Claude clearance path, preserving the
|
|
999
|
+
same completed-render and cursor checks. The suffix path remains useful when
|
|
1000
|
+
earlier conversation carets prevent whole-frame clearance.
|
|
1001
|
+
|
|
1002
|
+
|
|
1003
|
+
### Capitalized Codex model footer (2026-09-23)
|
|
1004
|
+
|
|
1005
|
+
Codex 0.156.1 renders `GPT-6-Astra default` in the native footer, followed by
|
|
1006
|
+
its working directory and a right-aligned warning count. A 189×48 capture after
|
|
1007
|
+
staged-draft cleanup showed the empty `Ask Codex to do anything` placeholder with
|
|
1008
|
+
the input cursor at column 2, row 11 (zero-based), but the lowercase-only `gpt-`
|
|
1009
|
+
footer pattern rejected the completed native frame. Cleanup consequently reported
|
|
1010
|
+
`Could not clear the staged composer draft` after the CLI had already cleared it.
|
|
1011
|
+
The model prefix now accepts the captured `GPT-` spelling alongside `gpt-`;
|
|
1012
|
+
placeholder, footer layout, live cursor and blocking-overlay checks remain required.
|
|
1013
|
+
The captured nonempty rows are retained in
|
|
1014
|
+
`tests/fixtures/codex-0.156.1/cleared-composer.txt`; the regression replays them
|
|
1015
|
+
at their original viewport size, with temporary paths replaced by a stable `CAPTURE`
|
|
1016
|
+
placeholder. C-API-56, C-TRUST-01, PRD §5.4.
|
|
1017
|
+
|
|
1018
|
+
### Native Codex updater layout (2026-09-23)
|
|
1019
|
+
|
|
1020
|
+
An authenticated Codex 0.155.1 binary, copied into an isolated `CODEX_HOME`
|
|
1021
|
+
standalone-release layout with fresh cached update metadata naming 0.156.1,
|
|
1022
|
+
rendered the actual updater without selecting any menu item. Native PTY resize
|
|
1023
|
+
captured the full menu at 100×30, banner plus the clipped first action at 100×6,
|
|
1024
|
+
banner only at 100×3, and the first safe choice at 100×8. The fixtures in
|
|
1025
|
+
`tests/fixtures/codex-0.155.1/update-*.txt` preserve the rendered text.
|
|
1026
|
+
|
|
1027
|
+
The banner begins with `✨` and a thin space. A release-notes link precedes the
|
|
1028
|
+
options. The `Update now` install command wraps onto an indented continuation
|
|
1029
|
+
row; `Press enter to continue` follows the option block. The parser accepts those
|
|
1030
|
+
observed rows while rejecting numbered scrollback before the banner and unknown
|
|
1031
|
+
text after the choices. Wrapped command fragments must form a prefix of the
|
|
1032
|
+
captured `sh -c 'curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh'`
|
|
1033
|
+
action. Arbitrary indented replacement text is not a command continuation or safe choice.
|
|
1034
|
+
|
|
1035
|
+
These captures prove native renderer layout under controlled cached metadata,
|
|
1036
|
+
not an update execution or a genuine bannerless repaint. The banner remained
|
|
1037
|
+
visible in every captured resize. Adversarial replacement frames and shell-PTY
|
|
1038
|
+
proofs are separate constructed evidence; these fixtures alone do not prove
|
|
1039
|
+
queued-input suppression through a live Elwood session.
|
|
1040
|
+
|
|
1041
|
+
A controlled real-session probe passed on 2026-09-23: one test, one pass, no skips. It verified the pinned binary's
|
|
1042
|
+
version and login status, then started Elwood with normal automatic skip handling
|
|
1043
|
+
and a queued caller message. At 100×6 and 100×3, Elwood stayed `blocked` and emitted
|
|
1044
|
+
`codex-update-prompt` attention. Neither automation nor the queued message attempted
|
|
1045
|
+
an application write; the queue rejected on shutdown. The PTY interceptor recorded
|
|
1046
|
+
attempts before rejecting them, so it could not hide an incorrect selection. Only
|
|
1047
|
+
exact native terminal protocol replies were forwarded. `autoupdate: false`
|
|
1048
|
+
disabled installation, not startup-menu skipping. The temporary binary, config,
|
|
1049
|
+
version metadata, and credential copy were removed after teardown. This proves
|
|
1050
|
+
these narrow native layouts under controlled version metadata; it does not prove
|
|
1051
|
+
a bannerless continuation, run an updater, or submit a model turn.
|
|
1052
|
+
|
|
1053
|
+
### Native updater resize to a bannerless empty viewport (2026-10-01)
|
|
1054
|
+
|
|
1055
|
+
A fresh isolated Codex 0.155.1 probe used the actual pinned standalone binary and
|
|
1056
|
+
private authenticated `CODEX_HOME`, with cached metadata naming 0.156.1. With
|
|
1057
|
+
normal startup-menu skipping enabled and one caller message queued, resizing
|
|
1058
|
+
100×6 → 100×2 → 100×1 → 100×3 → 100×6 produced a genuinely empty viewport at one
|
|
1059
|
+
row. The two-row frame still contained the banner. The empty repaint remained
|
|
1060
|
+
`blocked`, emitted `codex-unidentified-dialog` attention, held the caller, and
|
|
1061
|
+
attempted zero application writes. Returning to three and six rows restored the
|
|
1062
|
+
banner and retained the hold. Shutdown rejected the queued message.
|
|
1063
|
+
|
|
1064
|
+
The run passed one test with no skips. Application writes were counted before
|
|
1065
|
+
being rejected by the interceptor; only exact terminal protocol replies reached
|
|
1066
|
+
the PTY. No updater action or model prompt was delivered, and the private binary,
|
|
1067
|
+
metadata and credential copy were removed afterward. This proves a genuine
|
|
1068
|
+
bannerless **empty** repaint, not a bannerless numbered-choice layout. The initial
|
|
1069
|
+
six-row layout had only the clipped update action, so that narrow phase alone
|
|
1070
|
+
establishes no live safe-choice selection.
|
|
1071
|
+
|
|
1072
|
+
The final proof also launches a second isolated session without a queued caller,
|
|
1073
|
+
then resizes its real updater from 100×6 to 100×30. Before every application write,
|
|
1074
|
+
the interceptor checks the current rendered first-party banner and parsed `2. Skip`
|
|
1075
|
+
choice; only the exact digit `2` is permitted. The measured run attempted and
|
|
1076
|
+
delivered exactly one `2`, reached `ready`, then closed without a model prompt.
|
|
1077
|
+
The combined test passed 1/1 with no skips (8.28 seconds); the narrow phase still
|
|
1078
|
+
had zero application attempts. The negative session is killed before this phase,
|
|
1079
|
+
so its held caller cannot become a model submission when the menu clears.
|
|
1080
|
+
|
|
1081
|
+
`tests/fixtures/codex-0.155.1/update-resize-100x1.json` preserves the actual frames.
|
|
1082
|
+
The opt-in `codex-native-update.e2e.ts` proof is repeatable with
|
|
1083
|
+
`ELWOOD_NATIVE_UPDATE_PROOF=1`; it verifies the pinned binary and login state before
|
|
1084
|
+
launch and never installs over the user's CLI. C-CODEX-12.
|
|
1085
|
+
|
|
1086
|
+
### Empty input while a turn is active (2026-09-23)
|
|
1087
|
+
|
|
1088
|
+
The retained Claude 2.1.281 `working.txt` and `working-empty-input.json` captures
|
|
1089
|
+
contain `⚠ Your login expires in 1 day · run /login to renew` in the welcome
|
|
1090
|
+
region and the same notice without `⚠` below the native composer. A user report
|
|
1091
|
+
on 2.1.305 (2026-10-20) shows the same welcome wording with `3 days`. These
|
|
1092
|
+
observations underpin the `login_expiring` warning (C-CLAUDE-23); they are advance
|
|
1093
|
+
renewal notices, not the lapsed-authentication screens used by `login_expired`.
|
|
1094
|
+
No `/login` was driven to collect this evidence.
|
|
1095
|
+
|
|
1096
|
+
Native captures show that empty input and idle-turn clearance are different facts.
|
|
1097
|
+
Codex 0.156.1 kept its visible cursor at column 2 on `Ask Codex to do anything`
|
|
1098
|
+
while its working title and interrupt status were active. The bounded probe used
|
|
1099
|
+
an invalid model and reached rejection without model quota. Its model-only status
|
|
1100
|
+
line also carried a right-aligned `⚠ 3 warnings · f2 to view` badge.
|
|
1101
|
+
|
|
1102
|
+
Claude Code 2.1.281 kept a visible column-2 cursor on its empty fenced input while
|
|
1103
|
+
`Wandering… (0s)` and the `◐ Claude Code` title were active. A single synthetic
|
|
1104
|
+
`Reply exactly OK. Do not use tools.` request in an isolated workspace supplied
|
|
1105
|
+
this capture; the request later reached a usage limit, so it proves active input
|
|
1106
|
+
geometry, not a successful answer. The native manual-mode footer included the
|
|
1107
|
+
token count and a login-expiry notice. No further valid-model requests were made.
|
|
1108
|
+
|
|
1109
|
+
The sanitized `working-empty-input.json` fixtures retain these actual completed
|
|
1110
|
+
frames and cursor coordinates. Empty-input observers may use this geometry to
|
|
1111
|
+
confirm a consumed draft during work. They do not release trust, model-picker, or
|
|
1112
|
+
cleanup holds: those retain their stricter idle contract. Replay callers must
|
|
1113
|
+
also retain their existing dialog-blocking check and require a fresh frame after
|
|
1114
|
+
submission; an old empty frame does not prove acceptance.
|
|
1115
|
+
|
|
1116
|
+
The Claude observer also preserves the existing version-banner/fenced-input
|
|
1117
|
+
alternative and the documented 2.1.268 non-Vim bypass-permissions footer.
|
|
1118
|
+
Those compatibility cases are constructed regressions, not new working captures.
|
|
1119
|
+
|
|
1120
|
+
## Native submission hooks end recovery (2026-09-24)
|
|
1121
|
+
|
|
1122
|
+
`tests/e2e/paste-recovery.e2e.ts` passed against Claude Code 2.1.281 and
|
|
1123
|
+
codex-cli 0.156.1: 2 tests, 2 passes, 0 failures, 0 skips, covering cold and
|
|
1124
|
+
resumed sessions for each adapter. Every phase physically delivered one Enter,
|
|
1125
|
+
emitted one `UserPromptSubmit`, and attempted no recovery Enter after native
|
|
1126
|
+
`user_message` activity during a further six-second observation.
|
|
1127
|
+
|
|
1128
|
+
Codex resume did attempt a recovery Enter before its hook arrived: first Enter
|
|
1129
|
+
at 151 ms, retry at 1155 ms, native activity at 1317 ms. The test counted that
|
|
1130
|
+
retry and intercepted it before delivery. This proves the hook-only guarantee;
|
|
1131
|
+
it does not prove safety in the interval before the hook, or isolate native
|
|
1132
|
+
working evidence. The other three phases each attempted only the first Enter.
|
|
1133
|
+
|
|
1134
|
+
Both CLIs rejected a nonexistent model before quota consumption. Since public
|
|
1135
|
+
resume options omit model, the test appended that same invalid native `--model`
|
|
1136
|
+
at the PTY launch seam. Native hooks, readiness, and input queues remained real.
|
|
1137
|
+
All processes and temporary credential copies were cleaned up. These observations
|
|
1138
|
+
do not establish successful model output or correlation of a hook to a prompt.
|
|
1139
|
+
|
|
1140
|
+
## Live staged text and ambiguous working frames (2026-09-24)
|
|
1141
|
+
|
|
1142
|
+
The 2026-09-24 no-submission captures of Claude Code 2.1.281 and
|
|
1143
|
+
Codex 0.156.1 show the actual cursor inside collapsed or wrapped drafts. Codex
|
|
1144
|
+
continuations use two-space indentation and may cross a nonzero buffer base.
|
|
1145
|
+
Claude collapsed text uses the exact “paste again to expand” footer, with the
|
|
1146
|
+
separate `◐ medium · /effort` row observed again in the fresh recovery probe; Ctrl+Y
|
|
1147
|
+
can remain visible from an earlier draft. Those captures did not establish that
|
|
1148
|
+
Ctrl-U/K removed all earlier text, and are not a model-turn acceptance proof.
|
|
1149
|
+
Committed fixtures preserve geometry while replacing account/quota details and
|
|
1150
|
+
temporary workspace names.
|
|
1151
|
+
|
|
1152
|
+
Actual session/PTY tests distinguish the current cursor-owned composer from
|
|
1153
|
+
identical transcript text. Startup or resume replay and accepted native work can
|
|
1154
|
+
produce indistinguishable working frames before readiness. Recovery therefore
|
|
1155
|
+
withholds Enter during work without permanently inferring acceptance. A fresh
|
|
1156
|
+
positive empty input frame or native user-message activity ends that submission’s
|
|
1157
|
+
recovery; otherwise a later verified idle draft remains eligible within the
|
|
1158
|
+
four-observation/two-Enter bound. This is a conservative policy tested with
|
|
1159
|
+
controlled frames, not a newly observed native correlation guarantee.
|
|
1160
|
+
|
|
1161
|
+
A fresh bounded recovery probe on these same CLI versions passed for both
|
|
1162
|
+
adapters: an 18-line prompt remained staged, and the actual PTY writer attempted
|
|
1163
|
+
exactly the first Enter plus two recovery Enters, near 150/1150/2150 ms. All three
|
|
1164
|
+
Enters were intercepted before delivery; neither CLI emitted UserPromptSubmit,
|
|
1165
|
+
and neither ran a model turn. This proves native staged geometry and retry
|
|
1166
|
+
bounds, not acceptance or post-acceptance behavior. The temporary Codex auth
|
|
1167
|
+
copy was removed after teardown.
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
## Cached image recovery frames (2026-10-01)
|
|
1171
|
+
|
|
1172
|
+
The existing captured image-chip and staged-text layouts establish live composer
|
|
1173
|
+
geometry, not whether an Enter was accepted after the capture. A completed idle
|
|
1174
|
+
frame can remain cached until a later native repaint; a second Enter must not be
|
|
1175
|
+
authorized from that pre-attempt frame. Recovery now captures the render revision
|
|
1176
|
+
before each physical Enter attempt and requires later completed output plus the
|
|
1177
|
+
adapter's live idle-composer check. Resizing or scrolling changes snapshot geometry
|
|
1178
|
+
without establishing this output ordering. Native user-message activity retains
|
|
1179
|
+
its independent, permanent revocation of recovery.
|
|
1180
|
+
|
|
1181
|
+
The attachment-to-submission regressions use the real adapters and terminal parser,
|
|
1182
|
+
with controlled PTY output and a stubbed Codex platform clipboard. They retain the
|
|
1183
|
+
native Claude effort footer and distinguish fresh attached chips from history,
|
|
1184
|
+
hidden/working frames, and unchanged pre-Enter chips. This is deterministic ordering
|
|
1185
|
+
evidence, not a new native CLI acceptance measurement.
|
|
1186
|
+
|
|
1187
|
+
## Codex whitespace-only staged input (2026-10-01)
|
|
1188
|
+
|
|
1189
|
+
Private copied Codex 0.159.2, auth and config rendered a bracketed paste of two
|
|
1190
|
+
spaces, a tab and a space as an apparently empty `›`. The completed 140×35 frame
|
|
1191
|
+
was ready with visible cursor at zero-based (6,31): trimming text cannot prove
|
|
1192
|
+
consumption. Fixture: `tests/fixtures/codex-0.159.2/whitespace-only-input.json`.
|
|
1193
|
+
Updates were disabled and the model nonexistent. Exactly one paste and two
|
|
1194
|
+
protocol replies occurred, with no Enter, UPS, clipboard operation or model turn.
|
|
1195
|
+
Private home cleanup and unchanged parent environment passed. This proves geometry,
|
|
1196
|
+
not acceptance. Controlled replay combines it with an older captured empty frame;
|
|
1197
|
+
image tests exercise adapter options with stubbed clipboard. No native Claude
|
|
1198
|
+
whitespace capture is claimed.
|
|
1199
|
+
|
|
1200
|
+
## Codex 0.159.2 native acceptance ordering
|
|
1201
|
+
|
|
1202
|
+
A private-home Node 24.7.0 cold/resume probe used
|
|
1203
|
+
`gpt-elwood-nonexistent-acceptance-probe`, one Enter/UPS per phase and a one-second
|
|
1204
|
+
handler hold. The real generated bridge received its 38-byte response only after
|
|
1205
|
+
return (cold 1.353ms, resume 1.391ms), verifying half-close transport without a
|
|
1206
|
+
successful model/quota turn. Parent environment and global config were unchanged.
|
|
1207
|
+
Bounded pre-Enter discovery found no cold candidate, not proof no file existed.
|
|
1208
|
+
Resume used the persisted native ID with cold path memory cleared. Both UPS events
|
|
1209
|
+
had native task/turn-context metadata, but the new user record appeared only after
|
|
1210
|
+
ACK, absent at ingress and during the hold. Waiting for that record before ACK
|
|
1211
|
+
would deadlock the work ACK unblocks. This is ordering evidence, not a filesystem
|
|
1212
|
+
authority requirement for the authenticated per-launch hook channel.
|
|
1213
|
+
|
|
1214
|
+
Official `rust-v0.159.2` commit `ff6aec96948b70d94983af2641a6b67c94faeff5` explains it:
|
|
1215
|
+
`core/src/hook_runtime.rs::inspect_pending_input` supplies active
|
|
1216
|
+
`turn_context.sub_id` and awaits UPS; `core/src/session/turn.rs::run_hooks_and_record_inputs`
|
|
1217
|
+
records afterward. SessionStart hooks run earlier. Steering shares the active
|
|
1218
|
+
context, so Enter need not create a new turn ID. `core/src/tasks/regular.rs` runs
|
|
1219
|
+
input hooks on cancelled startup too: cancellation cannot rule out delayed prior
|
|
1220
|
+
UPS. Successors must retain predecessor boundaries, not claim unfamiliar IDs from
|
|
1221
|
+
matching text alone.
|
|
1222
|
+
|
|
1223
|
+
Opt-in `tests/e2e/codex-native-response.e2e.ts` passed on Codex 0.159.2 / Node 24.7.0,
|
|
1224
|
+
`gpt-6-luna`, low effort: two valid model turns in private home/empty workspace,
|
|
1225
|
+
cold `CodexSession.send` then `HeadlessCliSession.stream` using persisted Elwood
|
|
1226
|
+
record/native resume ID. Each returned its distinct exact synthetic token; resume
|
|
1227
|
+
excluded the old token. Each had one paste/Enter/UPS/Stop and zero tools. Private
|
|
1228
|
+
home removal and unchanged parent environment passed. This pinned-version response
|
|
1229
|
+
isolation proof is separate from bogus-model ACK ordering.
|
|
1230
|
+
|
|
1231
|
+
The pinned response fixture isolates both probe and PTY shell startup with a
|
|
1232
|
+
child-only `ZDOTDIR` pointing at its private home. An inherited interactive zsh
|
|
1233
|
+
profile timed out before `codex --version` at 15 seconds; the same pinned binary
|
|
1234
|
+
with an empty private profile directory returned its version in 52 ms. This
|
|
1235
|
+
preflight failure submitted no model turn. Parent environment values stay intact.
|
|
1236
|
+
|
|
1237
|
+
## Claude question editor captures (2026-10-20)
|
|
1238
|
+
|
|
1239
|
+
Claude Code 2.1.305 accepts a single question on Enter. Grouped questions advance
|
|
1240
|
+
through tabs and end on a separate Review your answers / Submit answers page.
|
|
1241
|
+
Multi-select uses checkbox rows, Space to toggle, and a per-question Submit row.
|
|
1242
|
+
|
|
1243
|
+
The highlighted Type something row is already an editor: paste before Enter.
|
|
1244
|
+
An empty Enter there declines the request. A two-line bracketed paste preserved
|
|
1245
|
+
its newline. Choice rows start at column zero with a highlight or space, followed
|
|
1246
|
+
by one space. Other continuations are indented five spaces, so their numbered
|
|
1247
|
+
lists are text, not additional choices. The checkbox Submit row also uses five
|
|
1248
|
+
columns, but occurs only in the multi-select layout.
|
|
1249
|
+
|
|
1250
|
+
A native checkbox Submit highlight can have a hidden terminal cursor parked at
|
|
1251
|
+
column zero on the viewport's bottom blank row. A multiline Other answer places
|
|
1252
|
+
the visible cursor on its indented continuation. Neither necessarily sits on
|
|
1253
|
+
the highlighted option glyph. The captures used private configuration and
|
|
1254
|
+
authentication copies with synthetic prompts; see
|
|
1255
|
+
`tests/fixtures/claude-2.1.305/questions/`.
|
|
1256
|
+
|
|
1257
|
+
### Claude question dialogs and manual composer (2026-10-20)
|
|
1258
|
+
|
|
1259
|
+
Claude Code 2.1.305 renders `AskUserQuestion` as a fenced questionnaire with
|
|
1260
|
+
checkbox headers, numbered choices, and a selected `❯` row. That caret belongs
|
|
1261
|
+
to the dialog, so the captured questionnaire is a blocking screen fact. The
|
|
1262
|
+
retained question and review frames are under
|
|
1263
|
+
`tests/fixtures/claude-2.1.305/questions/`.
|
|
1264
|
+
|
|
1265
|
+
After native submission the captured `accepted-manual-composer.json` contains
|
|
1266
|
+
`⏸ manual mode on · ? for shortcuts` below the fenced empty composer. Earlier
|
|
1267
|
+
question prompts remain above it. The footer is valid native composer chrome;
|
|
1268
|
+
clearance still requires the current visible cursor at column two on the empty
|
|
1269
|
+
input row. A hook candidate may arrive while the previous composer is still
|
|
1270
|
+
visible, so that old frame cannot retire it before its matching questionnaire has
|
|
1271
|
+
appeared. Matching uses the live panel’s tabs and prompt, rather than earlier
|
|
1272
|
+
question text or cancellation notices retained in history.
|
|
1273
|
+
|
|
1274
|
+
These captures establish the questionnaire and manual-footer additions on
|
|
1275
|
+
2.1.305. They do not reverify every screen-table pattern from earlier versions.
|
|
1276
|
+
|
|
1277
|
+
The private adapter/controller tests retain native input ownership when a
|
|
1278
|
+
composer repaint precedes the matching completion hook. Successful submissions
|
|
1279
|
+
keep their request pending; a post-write abort retires the public ID while the
|
|
1280
|
+
native hold remains until matching completion, replacement or turn end. A
|
|
1281
|
+
predecessor review panel cannot publish a newly observed successor.
|
|
1282
|
+
|
|
1283
|
+
Live sessions connect this adapter to the session-owned question controller,
|
|
1284
|
+
completed terminal renders, hook routing and the ordinary-input gate. Claude's
|
|
1285
|
+
hook-decision gate resolves the exact caller hook outcome before publishing a
|
|
1286
|
+
request; direct answers and denials withdraw automation while retaining native
|
|
1287
|
+
ownership until matching completion, replacement or turn end. The captured frames
|
|
1288
|
+
establish the native layouts; the capture-specific version and screen-pattern
|
|
1289
|
+
limitations above still apply.
|
|
1290
|
+
|
|
1291
|
+
Structured answers use the session-owned transaction lane; request listing
|
|
1292
|
+
bypasses an active ergonomic turn. After uncertain dispatch, both physical write
|
|
1293
|
+
settlement and matching native closure are required before ordinary input resumes,
|
|
1294
|
+
regardless of their order. The live screen-fact rule also holds input while the
|
|
1295
|
+
questionnaire is visible.
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
A final Enter rejected before physical dispatch, including by a current-frame or
|
|
1299
|
+
abort guard, does not count as submission. Once dispatch begins, a rejection or
|
|
1300
|
+
abort leaves delivery uncertain: the native identity and input hold survive an
|
|
1301
|
+
empty composer until matching native completion, replacement or turn end.
|
|
1302
|
+
A semantic replacement of a known questionnaire must show matching new choices
|
|
1303
|
+
before a retained composer can retire it.
|
|
1304
|
+
|
|
1305
|
+
### Codex question panels, work pulses, and Plan footer (2026-10-20)
|
|
1306
|
+
|
|
1307
|
+
Codex 0.163.0's native queued-question UI can coexist with a working status
|
|
1308
|
+
that pulses between `•` and `◦`. Both glyphs retain the elapsed-time and
|
|
1309
|
+
`esc to interrupt` grammar; the lighter pulse does not end the running turn.
|
|
1310
|
+
A blocking question panel ends with its own navigation/submission footer and
|
|
1311
|
+
must hold ordinary input even though its selected option also uses `›`.
|
|
1312
|
+
The captured queued choice panel hides the native cursor and can leave its
|
|
1313
|
+
coordinates at the end of the working row above the panel. That position is
|
|
1314
|
+
valid only with hidden cursor, exact working-row geometry, and blank intervening
|
|
1315
|
+
rows; a visible or unrelated cursor does not establish panel ownership.
|
|
1316
|
+
|
|
1317
|
+
After a Plan mode question completes, the native model footer includes the exact
|
|
1318
|
+
right-aligned `Plan mode (⇧tab to cycle)` suffix. That suffix preserves empty
|
|
1319
|
+
composer evidence alongside the existing model/footer grammar, current visible
|
|
1320
|
+
cursor, and overlay checks.
|
|
1321
|
+
|
|
1322
|
+
The native `async-editor-first.txt` queued editor and `blocking-modal-first.txt`
|
|
1323
|
+
modal captures retain their exact header and terminal footer. The collapsed
|
|
1324
|
+
`? 1 question` badge is not an open editor and does not itself block ordinary input.
|
|
1325
|
+
|
|
1326
|
+
These captures establish the layouts in
|
|
1327
|
+
`tests/fixtures/codex-0.163.0/questions/`; they do not reverify all earlier
|
|
1328
|
+
Codex trust and update dialogs.
|
|
1329
|
+
|
|
1330
|
+
### Native Codex editor provenance and clipped drafts (2026-10-21)
|
|
1331
|
+
|
|
1332
|
+
Two isolated Codex 0.163.0 captures distinguish an empty placeholder from a
|
|
1333
|
+
literal answer with the same text. In queued input, `Type your answer` starts
|
|
1334
|
+
with a dimmed cursor cell at column 2; typing that literal leaves a nondimmed
|
|
1335
|
+
cursor after it at column 18. Modal notes render ` › Add notes` in both states,
|
|
1336
|
+
with the empty dimmed cursor at column 4 and the typed cursor at column 13.
|
|
1337
|
+
Private question frames retain the actual cursor-cell dimming and the cell-derived
|
|
1338
|
+
prefix from the same completed render. Public terminal snapshots keep their shape.
|
|
1339
|
+
|
|
1340
|
+
The native editor manually wraps text without setting xterm `isWrapped`, clips
|
|
1341
|
+
long prefixes even at 140×45, and omits visible glyphs for interior trailing
|
|
1342
|
+
spaces that still survive submission. Both queued and modal answers trim outer
|
|
1343
|
+
whitespace on submission: a synthetic 764-character paste was accepted as its
|
|
1344
|
+
760-character `trim()` result. A continuation containing an indented `›` remains
|
|
1345
|
+
answer text; it cannot replace the native notes start after the option block.
|
|
1346
|
+
|
|
1347
|
+
The snapshots, source hashes, expected inputs, and native acceptance evidence are
|
|
1348
|
+
in `tests/fixtures/codex-0.163.0/questions/editor/`. A viewport alone cannot establish
|
|
1349
|
+
complete logical equality of multirow or clipped drafts. Cursor-cell style and a
|
|
1350
|
+
physical row prefix are partial evidence, so they must not confirm unshown answer
|
|
1351
|
+
text. Full-answer verification must bind an owned paste to the native accepted
|
|
1352
|
+
payload rather than infer missing text from the screen.
|
|
1353
|
+
|
|
1354
|
+
## Native interactive question records (2026-10-20)
|
|
1355
|
+
|
|
1356
|
+
Claude Code 2.1.305 exposes structured `AskUserQuestion` input in PreToolUse and
|
|
1357
|
+
PermissionRequest hooks. PermissionRequest can omit the native tool-use ID
|
|
1358
|
+
(`tool_use_id`). Direct hook answers may bypass the terminal editor. PostToolUse
|
|
1359
|
+
carries the accepted answers for the entire tool request. See
|
|
1360
|
+
[Claude question editor captures](#claude-question-editor-captures-2026-10-20)
|
|
1361
|
+
for the captured editor, navigation and submission behavior.
|
|
1362
|
+
|
|
1363
|
+
Codex 0.163.0 Plan-mode
|
|
1364
|
+
`request_user_input` groups questions in a modal and returns one function output
|
|
1365
|
+
with all answers. Every question needs nonempty options; a free-text-only tool
|
|
1366
|
+
call was rejected before any editor appeared. None of the above plus notes
|
|
1367
|
+
provides free text. `request_user_input_async` immediately returns accepted:true,
|
|
1368
|
+
then exposes independently answerable queued questions while work continues.
|
|
1369
|
+
Shift+Left opens the editor. Answering one leaves the others available, with a
|
|
1370
|
+
committed `send_user_message_question_reply` envelope identifying the exact
|
|
1371
|
+
question. The editor advances to a remaining question and stays expanded, so
|
|
1372
|
+
Elwood remains `blocked` even while the working row continues. This status does
|
|
1373
|
+
not complete the original `send()` turn. Ordinary composer input is not an
|
|
1374
|
+
equivalent answer route. Consecutive answer echoes can contain indented `›`
|
|
1375
|
+
inside multiline text before the final assistant response. Only that bounded
|
|
1376
|
+
response makes them transcript history for empty-composer recognition; an
|
|
1377
|
+
uncompleted user echo or numbered native option block still holds input.
|
|
1378
|
+
|
|
1379
|
+
Async question AgentMessage records can say phase:final_answer while work is
|
|
1380
|
+
still running. They are question metadata, not a final assistant reply. The
|
|
1381
|
+
paginated item_completed mirror uses type AgentMessage. Deduplicate these mirrors
|
|
1382
|
+
against the stable tool call. The native question ID encodes the call ID and
|
|
1383
|
+
question index. Ctrl+] locally skips the focused async question without an answer
|
|
1384
|
+
record; Esc from its editor can merely collapse it. Do not treat every Esc as a
|
|
1385
|
+
turn interruption.
|
|
1386
|
+
|
|
1387
|
+
Queued editors after the first use `⇧→ prev question`; only the first uses
|
|
1388
|
+
`⇧→ main prompt`. Keep this distinction in captured and scripted navigation
|
|
1389
|
+
frames. If a local skip and Esc collapse coalesce into one output render, the
|
|
1390
|
+
smaller badge does not identify the removed question. Preserve the prior focused
|
|
1391
|
+
editor count until a matching remaining editor confirms that removal.
|