From 3210b4c6437b2dd2fb7a4c01d3243946ca91f035 Mon Sep 17 00:00:00 2001 From: Christopher Sardegna Date: Mon, 28 Sep 2026 15:26:07 -0700 Subject: [PATCH 1/4] test: preserve Codex 0.158 preview compatibility captures --- src/harness/summary_tests.rs | 138 ++++++++++++++++++ .../0.157.1-fullscreen-approval.bin | 1 + .../0.157.1-fullscreen-stdin.bin | 1 + .../codex_0158_preview/0.157.1-inline.bin | 17 +++ .../0.158.0-fullscreen-approval.bin | 1 + .../0.158.0-fullscreen-stdin.bin | 1 + .../codex_0158_preview/0.158.0-inline.bin | 16 ++ tests/corpus/codex_0158_preview/README.md | 57 ++++++++ 8 files changed, 232 insertions(+) create mode 100644 tests/corpus/codex_0158_preview/0.157.1-fullscreen-approval.bin create mode 100644 tests/corpus/codex_0158_preview/0.157.1-fullscreen-stdin.bin create mode 100644 tests/corpus/codex_0158_preview/0.157.1-inline.bin create mode 100644 tests/corpus/codex_0158_preview/0.158.0-fullscreen-approval.bin create mode 100644 tests/corpus/codex_0158_preview/0.158.0-fullscreen-stdin.bin create mode 100644 tests/corpus/codex_0158_preview/0.158.0-inline.bin create mode 100644 tests/corpus/codex_0158_preview/README.md diff --git a/src/harness/summary_tests.rs b/src/harness/summary_tests.rs index 66e1a51..e36c316 100644 --- a/src/harness/summary_tests.rs +++ b/src/harness/summary_tests.rs @@ -1393,6 +1393,144 @@ fn omp_ascii_box_glyphs_do_not_anchor() { // ------------------------------------------------------- corpus replay -- +/// Each offset is a cumulative PTY byte checkpoint, not a standalone repaint. +fn codex_0158_checkpoint(bytes: &[u8], offset: usize, alternate: bool) -> Vec { + let mut emu = Emulator::new(40, 120, 2000); + emu.process(&bytes[..offset]); + assert_eq!(emu.alternate_screen(), alternate); + emu.live_rows() +} + +#[test] +fn corpus_codex_0158_working_queue_and_completed_turns() { + for (bytes, offsets, queue_hint) in [ + ( + include_bytes!("../../tests/corpus/codex_0158_preview/0.157.1-inline.bin").as_slice(), + [12405, 15613, 17650, 18716], + " ⌥+↑ edit last queued message", + ), + ( + include_bytes!("../../tests/corpus/codex_0158_preview/0.158.0-inline.bin").as_slice(), + [11311, 14478, 16558, 17253], + " shift+← edit last queued message", + ), + ] { + for (state, offset) in offsets.into_iter().enumerate() { + let rows = codex_0158_checkpoint(bytes, offset, false); + let has = |text: &str| rows.iter().any(|row| row == text); + let queued = state == 1; + let draft = state == 2; + assert_eq!(has("• Queued follow-up inputs"), queued); + assert_eq!(has(" ↳ Queued phase zero message"), queued); + assert_eq!(has(queue_hint), queued); + assert_eq!(has("› Queued phase zero message"), draft); + assert_eq!(has("› Ask Codex to do anything"), !draft); + assert_eq!( + has("• PHASE0 COMPLETE. Deterministic local response."), + state == 3 + ); + assert_eq!( + CodexSummary.live_preview(&rows), + (state != 3).then(|| ("Working".to_string(), "codex:working")), + "checkpoint {offset}" + ); + } + } +} + +#[test] +fn corpus_codex_0158_command_approvals() { + for (bytes, offset) in [ + ( + include_bytes!("../../tests/corpus/codex_0158_preview/0.157.1-fullscreen-approval.bin") + .as_slice(), + 11965, + ), + ( + include_bytes!("../../tests/corpus/codex_0158_preview/0.158.0-fullscreen-approval.bin") + .as_slice(), + 12967, + ), + ] { + let rows = codex_0158_checkpoint(bytes, offset, true); + for text in [ + " Would you like to run the following command?", + " $ printf 'PHASE0 APPROVAL\\n'", + "› 1. Yes, proceed (y)", + " 3. No, and tell Codex what to do differently (esc)", + ] { + assert!(rows.iter().any(|row| row == text), "{text}"); + } + assert_eq!( + corpus(&bytes[..offset], &CodexSummary, 120), + anchor("awaiting approval", "codex:approval-menu") + ); + } +} + +#[test] +fn corpus_codex_0158_stdin_requires_a_second_approval() { + for (bytes, command, input, needs_approval) in [ + ( + include_bytes!("../../tests/corpus/codex_0158_preview/0.157.1-fullscreen-stdin.bin") + .as_slice(), + 12494, + 16518, + false, + ), + ( + include_bytes!("../../tests/corpus/codex_0158_preview/0.158.0-fullscreen-stdin.bin") + .as_slice(), + 13496, + 17417, + true, + ), + ] { + let rows = codex_0158_checkpoint(bytes, command, true); + assert!( + rows.iter() + .any(|row| row == " Would you like to run the following command?") + ); + assert_eq!( + CodexSummary.live_preview(&rows), + Some(("awaiting approval".to_string(), "codex:approval-menu")) + ); + let rows = codex_0158_checkpoint(bytes, input, true); + assert!( + rows.iter() + .any(|row| row.starts_with("✔ You approved codex to run read line;")) + ); + assert_eq!( + rows.iter() + .any(|row| row.starts_with(" Would you like to send input to terminal ")), + needs_approval + ); + assert_eq!( + rows.iter().any(|row| row == " Input: \"fixture\\n\""), + needs_approval + ); + assert_eq!( + rows.iter() + .any(|row| row == "• PHASE0 COMPLETE. Deterministic local response."), + !needs_approval + ); + assert_eq!( + rows.iter().any(|row| row == " PHASE0 INPUT: fixture"), + !needs_approval + ); + assert_eq!( + CodexSummary.live_preview(&rows), + needs_approval.then(|| ("awaiting approval".to_string(), "codex:approval-menu")) + ); + if needs_approval { + assert_eq!( + corpus(&bytes[..input], &CodexSummary, 120), + anchor("awaiting approval", "codex:approval-menu") + ); + } + } +} + /// Positive per-state fixtures at capture geometry (40×120): exact /// normalized text, Anchor provenance, and the matcher id. #[test] diff --git a/tests/corpus/codex_0158_preview/0.157.1-fullscreen-approval.bin b/tests/corpus/codex_0158_preview/0.157.1-fullscreen-approval.bin new file mode 100644 index 0000000..593ea45 --- /dev/null +++ b/tests/corpus/codex_0158_preview/0.157.1-fullscreen-approval.bin @@ -0,0 +1 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?25l[?1049h[?1007l[?1000h[?1002h[?1006h[?1003h[?25l[?2026h[?25l╭───────────────────────────────────────╮│ >_ OpenAI Codex (v0.157.1) ││ ││ model: loading /model to change ││ directory: loading │╰───────────────────────────────────────╯›Ask Codex to do anything?forshortcuts[0 q╭[?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l/private/tmp/…/workspace[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lTip:Run/reviewtogetacodereviewofyourcurrentchanges.phase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l─────────────╮ │ │phase0-fixture-model /model to change │ │─────────────╯[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› Phasezerofixture:replywiththecompletionmarker.Ask Codex to do anything?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l•Working(0s • esc to interrupt)⚠1 warning·f2toview[?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l]0;⠹ ⠹ | workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l1[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l2[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦3[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l5[?25h[?2026l]0;[ ! ] Action Required | workspace[?2026h[?25l•Runningprintf 'PHASE0 APPROVAL\n'Would you like to run the following command?Environment:localReason:Phase zero approval fixture: print a marker.$printf 'PHASE0 APPROVAL\n' › 1. Yes, proceed (y)  2. Yes, and don't ask againforcommandsthatstartwith`printf"PHASE0APPROVAL\\n"`(p)3.No,andtellCodexwhattododifferently(esc)Press enter to confirm or esc to cancel [?2026l[?2026h[?2026l]0;[ . ] Action Required | workspace]0;[ ! ] Action Required | workspace]0;[ . ] Action Required | workspace]0;⠙ workspace[?2026h✗ You canceled the request to run printf 'PHASE0 APPROVAL\n'•Failed (exit 1)printf 'PHASE0 APPROVAL\n' └ (no output)•Working(5s • esc to interrupt) ›Ask Codex to do anythingphase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l]0;workspace[?2026h[?25l■ Conversation interrupted - tell the model what to do differently. Something went wrong? Hit `/feedback` to report theissue. Tip:Run/reviewtogetacodereviewofyourcurrentchanges.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l›Shutting down...[?2026l]0;[?1006l[?1015l[?1003l[?1002l[?1000l[?1007l[?1049l[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_preview/0.157.1-fullscreen-stdin.bin b/tests/corpus/codex_0158_preview/0.157.1-fullscreen-stdin.bin new file mode 100644 index 0000000..5909ffa --- /dev/null +++ b/tests/corpus/codex_0158_preview/0.157.1-fullscreen-stdin.bin @@ -0,0 +1 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?25l[?1049h[?1007l[?1000h[?1002h[?1006h[?1003h[?25l[?2026h[?25l╭───────────────────────────────────────╮│ >_ OpenAI Codex (v0.157.1) ││ ││ model: loading /model to change ││ directory: loading │╰───────────────────────────────────────╯›Ask Codex to do anything?forshortcuts[0 q╭[?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l───────────────────╮ │ │ │/private/…/0.157.1-fullscreen-stdin/workspace │───────────────────╯[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lTip:Use/keymaptoconfigurekeyboardshortcuts.phase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lphase0-fixture-model /modeltochange[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› Phasezerofixture:replywiththecompletionmarker.Ask Codex to do anything?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l⚠1 warning·f2toview[?25h[?2026l]0;⠙ workspace[?2026h[?25l•Working(0s • esc to interrupt)[?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l]0;⠹ ⠹ | workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l1[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l2[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦3[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25l4[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;[ ! ] Action Required | workspace[?2026h[?25l•Runningread line; printf "PHASE0 INPUT: %s\n" "$line"Would you like to run the following command?Environment:localReason:Phase zero input approval fixture: read and echo one line.$read line; printf "PHASE0 INPUT: %s\n" "$line" › 1. Yes, proceed (y)  2. Yes, and don't ask againforcommandsthatstartwith`readline;printf"PHASE0INPUT:%s\n""$line"`(p)3.No,andtellCodexwhattododifferently(esc)Press enter to confirm or esc to cancel [?2026l[?2026h[?2026l]0;[ . ] Action Required | workspace]0;[ ! ] Action Required | workspace]0;⠙ workspace[?2026h✔ You approved codex to run read line; printf "PHASE0 INPUT: %s\n" "$line" this time•Runningread line; printf "PHASE0 INPUT: %s\n" "$line"•Working(5s • esc to interrupt) ›Ask Codex to do anythingphase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l6[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l └ fixture PHASE0 INPUT: fixture[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•a read line; printf "PHASE0 INPUT: %s\n" "$line"[?25h[?2026l]0;workspace[?2026h[?25l• PHASE0COMPLETE.Deterministiclocalresponse. 2:42 PM  Tip:Switchmodelsorreasoningeffortquicklywith/model.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lesc again o editpreviousmessage[?25h[?2026l[?2026h[?25lTip:Switchmodelsorreasoningeffortquicklywith/model.? for shorcuts   ⚠1 warning·f2toview[?25h[?2026l[?2026h[?25l›Shutting down...[?2026l]0;[?1006l[?1015l[?1003l[?1002l[?1000l[?1007l[?1049l[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_preview/0.157.1-inline.bin b/tests/corpus/codex_0158_preview/0.157.1-inline.bin new file mode 100644 index 0000000..d13337c --- /dev/null +++ b/tests/corpus/codex_0158_preview/0.157.1-inline.bin @@ -0,0 +1,17 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?2026h[?25l╭───────────────────────────────────────╮│ >_ OpenAI Codex (v0.157.1) ││ ││ model: loading /model to change ││ directory: loading │╰───────────────────────────────────────╯  › Ask Codex to do anything  [0 q╭[?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l─────────────╮ │ │ │/private/tmp/…/0.157.1-inline/workspace │─────────────╯[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lphase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026hMMMMMMMM +╭────────────────────────────────────────────────────╮ +│ >_ OpenAI Codex (v0.157.1) │ +│ │ +│ model: phase0-fixture-model /model to change │ +│ directory: /private/tmp/…/0.157.1-inline/workspace │ +╰────────────────────────────────────────────────────╯ + + Tip: New Build faster with the Desktop app. Run 'codex app' or visit ]8;;https://chatgpt.com/codex?app-landing-page=truehttps://chatgpt.com/codex?app-landing-page=true]8;;[?25l  › Ask Codex to do anything  phase0-fixture-model default[0 q [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026hMMMM + + +› Phase zero fixture: reply with the completion marker. +[?25lAsk Codex to do anything[0 q [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l⚠1 warning·f2toview[?25h[?2026l]0;⠙ workspace[?2026h[?25l • Working (0s • esc to interrupt)  › Ask Codex to do anything  phase0-fixture-model default ⚠ 1 warning · f2 to view[0 q [?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l]0;⠹ ⠹ | workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25l1[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25l2[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25l◦3[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lQueued phase zero messagetab to queue message   100% contex left[?25h[?2026l]0;⠹ workspace[?2026h[?25l5[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l ◦ Working (5s • esc to interrupt) • Queued follow-up inputs ↳ Queued phase zero message ⌥+↑ edit last queued message › Ask Codex to do anything  phase0-fixture-model default ⚠ 1 warning · f2 to view[0 q [?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25l•6[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l • Working (6s • esc to interrupt)  › Queued phase zero message  tab to queue message 100% context left[0 q [?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25l7[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lAsk Codex to do anythingphase0-fixture-model default⚠1 warning · f2 o view[?25h[?2026l[?2026hMM + +• PHASE0 COMPLETE. Deterministic local response.[?25l  › Ask Codex to do anything  phase0-fixture-model default ⚠ 1 warning · f2 to view[0 q [?25h[?2026l]0;workspace[?2026hMM + + 2:42 PM[?25l[0 q [?25h[?2026l[?2026h[?25l  › Shutting down... [?2026l]0;[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_preview/0.158.0-fullscreen-approval.bin b/tests/corpus/codex_0158_preview/0.158.0-fullscreen-approval.bin new file mode 100644 index 0000000..8412f5d --- /dev/null +++ b/tests/corpus/codex_0158_preview/0.158.0-fullscreen-approval.bin @@ -0,0 +1 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?25l[?1049h[?1007l[?1000h[?1002h[?1006h[?1003h[?25l[?2026h[?25l>_ OpenAI Codex (v0.158.0)loadingGot a minute and a mildly unreasonable idea?⣀⣤⣤⣤⣀⣀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⣤⣤⣤⣤⣤⡀⢀⣾⣿⣿⠿⠋⠉⠉⢉⣭⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣷⣄⣀⣾⣿⣿⠃⣀⣴⣾⣿⣿⡿⠟⠋⣀⡀⠈⠙⢿⣿⣿⣧⣀⣶⣿⣿⣿⣿⡇⢸⣿⣿⡿⠛⠉⢀⣠⣴⣿⣿⣿⣷⣦⣀⠈⢻⣿⣿⡇⣰⣿⣿⡿⢿⣿⣿⡇⢸⣿⣿⢀⣤⣶⣿⣿⣿⠟⠛⠻⣿⣿⣿⣿⣮⣿⣿⡷⢰⣿⣿⡟⠁⢸⣿⣿⡇⢸⣿⣿⣿⣿⠿⠿⣿⣿⣿⣦⣄⡀⠈⠛⠿⣿⣿⣿⣧⡀⣾⣿⣿⠃⢸⣿⣿⡇⢸⣿⣿⠋⠁⠈⠙⢻⣿⣿⣿⣶⣤⡀⠹⢿⣿⣷⡄⢸⣿⣿⣇⠸⣿⣿⣷⣦⣼⣿⣿⢸⣿⣿⠻⢿⣿⣿⡇⠘⣿⣿⣿⠈⢿⣿⣿⣦⡀⠈⠛⠿⣿⣿⣿⣿⣄⡀⢀⣠⣼⣿⣿⣿⣿⡇⣿⣿⣿⠇⢻⣿⣿⣿⣷⣦⣀⠈⠙⠻⣿⣿⣿⣶⣶⣿⣿⣿⣿⣿⣿⣿⡇⣠⣿⣿⣿⢸⣿⣿⡿⢿⣿⣿⣿⣦⣠⣴⣿⣿⣿⡿⠟⠋⢸⣿⣿⣿⣿⣷⣴⣿⣿⣿⠃⠘⣿⣿⣷⠈⠛⢿⣿⣿⣿⠿⠋⠉⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠻⣿⣿⣿⣤⣀⠈⠉⢀⣤⣶⣿⣿⣿⠿⠟⠁⣰⣿⣿⡟⠋⠁⠈⠿⣿⣿⣿⣿⣶⣾⣿⣿⣿⣿⠟⠋⠁⣠⣼⣿⣿⡟⠙⠛⠛⠛⠻⠛⢿⣿⣿⣿⣿⣷⣾⣿⣿⣿⡿⠏⠈⠙⠛⠿⠿⠿⠿⠛⠉›Ask Codex to do anything?forshortcuts[0 q [?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l/private/tmp/fleetcom-phase0.STTTSl/0.158.0-fullscreen-approval/workspace[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lphase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› Phasezerofixture:replywiththecompletionmarker.Ask Codex to do anything?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l⚠1 warning·f2toview[?25h[?2026l]0;⠙ workspace[?2026h[?25l•Working(0s • esc to interrupt)[?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l1[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l2[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l◦3[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l]0;[ ! ] Action Required | workspace[?2026h[?25l•Runningprintf 'PHASE0 APPROVAL\n'Would you like to run the following command?Environment:localReason:Phase zero approval fixture: print a marker.$printf 'PHASE0 APPROVAL\n' › 1. Yes, proceed (y)  2. Yes, and don't ask againforcommandsthatstartwith`printf"PHASE0APPROVAL\\n"`(p)3.No,andtellCodexwhattododifferently(esc)Press enter to confirm or esc to cancel [?2026l[?2026h[?2026l]0;[ . ] Action Required | workspace]0;[ ! ] Action Required | workspace]0;[ . ] Action Required | workspace]0;⠙ workspace[?2026h✗ You canceled the request to run printf 'PHASE0 APPROVAL\n'•Runningprintf 'PHASE0 APPROVAL\n'•Working(5s • esc to interrupt) ›Ask Codex to do anythingphase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l[?2026h[?25l•Failed (exit 1) printf 'HASE0 APPROVAL\n' └ (no output)[?25h[?2026l]0;workspace[?2026h[?25l■ Conversation interrupted - tell the model what to do differently. Something went wrong? Hit `/feedback` to report theissue. [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l›Shutting down...[?2026l]0;[?1006l[?1015l[?1003l[?1002l[?1000l[?1007l[?1049l[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_preview/0.158.0-fullscreen-stdin.bin b/tests/corpus/codex_0158_preview/0.158.0-fullscreen-stdin.bin new file mode 100644 index 0000000..79cc1ee --- /dev/null +++ b/tests/corpus/codex_0158_preview/0.158.0-fullscreen-stdin.bin @@ -0,0 +1 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?25l[?1049h[?1007l[?1000h[?1002h[?1006h[?1003h[?25l[?2026h[?25l>_ OpenAI Codex (v0.158.0)loadingAll right. What have you got?⣀⣤⣤⣤⣀⣀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⣤⣤⣤⣤⣤⡀⢀⣾⣿⣿⠿⠋⠉⠉⢉⣭⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣷⣄⣀⣾⣿⣿⠃⣀⣴⣾⣿⣿⡿⠟⠋⣀⡀⠈⠙⢿⣿⣿⣧⣀⣶⣿⣿⣿⣿⡇⢸⣿⣿⡿⠛⠉⢀⣠⣴⣿⣿⣿⣷⣦⣀⠈⢻⣿⣿⡇⣰⣿⣿⡿⢿⣿⣿⡇⢸⣿⣿⢀⣤⣶⣿⣿⣿⠟⠛⠻⣿⣿⣿⣿⣮⣿⣿⡷⢰⣿⣿⡟⠁⢸⣿⣿⡇⢸⣿⣿⣿⣿⠿⠿⣿⣿⣿⣦⣄⡀⠈⠛⠿⣿⣿⣿⣧⡀⣾⣿⣿⠃⢸⣿⣿⡇⢸⣿⣿⠋⠁⠈⠙⢻⣿⣿⣿⣶⣤⡀⠹⢿⣿⣷⡄⢸⣿⣿⣇⠸⣿⣿⣷⣦⣼⣿⣿⢸⣿⣿⠻⢿⣿⣿⡇⠘⣿⣿⣿⠈⢿⣿⣿⣦⡀⠈⠛⠿⣿⣿⣿⣿⣄⡀⢀⣠⣼⣿⣿⣿⣿⡇⣿⣿⣿⠇⢻⣿⣿⣿⣷⣦⣀⠈⠙⠻⣿⣿⣿⣶⣶⣿⣿⣿⣿⣿⣿⣿⡇⣠⣿⣿⣿⢸⣿⣿⡿⢿⣿⣿⣿⣦⣠⣴⣿⣿⣿⡿⠟⠋⢸⣿⣿⣿⣿⣷⣴⣿⣿⣿⠃⠘⣿⣿⣷⠈⠛⢿⣿⣿⣿⠿⠋⠉⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠻⣿⣿⣿⣤⣀⠈⠉⢀⣤⣶⣿⣿⣿⠿⠟⠁⣰⣿⣿⡟⠋⠁⠈⠿⣿⣿⣿⣿⣶⣾⣿⣿⣿⣿⠟⠋⠁⣠⣼⣿⣿⡟⠙⠛⠛⠛⠻⠛⢿⣿⣿⣿⣿⣷⣾⣿⣿⣿⡿⠏⠈⠙⠛⠿⠿⠿⠿⠛⠉›Ask Codex to do anything?forshortcuts[0 q [?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l/private/tmp/fleetcom-phase0.STTTSl/0.158.0-fullscreen-stdin/workspace[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25h[?2026l[?2026h[?25lphase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› Phasezerofixture:replywiththecompletionmarker.Ask Codex to do anything?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l⚠1 warning·f2toview[?25h[?2026l]0;⠙ workspace[?2026h[?25l•Working(0s • esc to interrupt)[?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l1[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l2[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l◦3[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l]0;[ ! ] Action Required | workspace[?2026h[?25l•Runningread line; printf "PHASE0 INPUT: %s\n" "$line"Would you like to run the following command?Environment:localReason:Phase zero input approval fixture: read and echo one line.$read line; printf "PHASE0 INPUT: %s\n" "$line" › 1. Yes, proceed (y)  2. Yes, and don't ask againforcommandsthatstartwith`readline;printf"PHASE0INPUT:%s\n""$line"`(p)3.No,andtellCodexwhattododifferently(esc)Press enter to confirm or esc to cancel [?2026l[?2026h[?2026l]0;[ . ] Action Required | workspace]0;[ ! ] Action Required | workspace]0;⠙ workspace[?2026h✔ You approved codex to run read line; printf "PHASE0 INPUT: %s\n" "$line" this time•Runningread line; printf "PHASE0 INPUT: %s\n" "$line"•Working(5s • esc to interrupt) ›Ask Codex to do anythingphase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l6[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l]0;[ ! ] Action Required | workspace[?2026h[?25lWould you like to send input to terminal 88437?Environment:localReason:Send input to an existing terminal. This terminal was launched outside the sandbox, bypassing any managednetwork proxy. The cwd is its launch directory; the terminal's current directory and state may have changed. Input: "fixture\n"› 1. Yes, proceed (y) 2.No,andtellCodexwhattododifferently(esc)Press enter to confirm or esc to cancel [?2026l]0;[ . ] Action Required | workspace]0;[ ! ] Action Required | workspace]0;[ . ] Action Required | workspace]0;⠙ workspace[?2026h✗ You canceled the request to run write_stdin --session-id 88437 'fixture ...•Runningread line; printf "PHASE0 INPUT: %s\n" "$line"•Working (6s • esc to interrupt)› Ask Codex to do anythingphase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l]0;workspace[?2026h[?25l•Failed (exit 1) read line; printf "PHASE0 INPUT: %s\n "$line" └ (no output)■ Conversation interrupted - tell the model what to do differently. Something went wrong? Hit `/feedback` to report theissue. [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l›Shutting down...[?2026l]0;[?1006l[?1015l[?1003l[?1002l[?1000l[?1007l[?1049l[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_preview/0.158.0-inline.bin b/tests/corpus/codex_0158_preview/0.158.0-inline.bin new file mode 100644 index 0000000..e7564b4 --- /dev/null +++ b/tests/corpus/codex_0158_preview/0.158.0-inline.bin @@ -0,0 +1,16 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?2026h[?25l  >_ OpenAI Codex (v0.158.0) loading  A glitch in the Matrix, or just a missing semicolon?  › Ask Codex to do anything  [0 q [?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l/private/tmp/fleetcom-phase0.STTTSl/0.158.0-inline/workspace[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lphase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026hMMMMMMM + + >_ OpenAI Codex (v0.158.0) + /private/tmp/fleetcom-phase0.STTTSl/0.158.0-inline/workspace + + A glitch in the Matrix, or just a missing semicolon? + + Tip: You can run any shell command from Codex using ! (e.g. !ls)[?25l  › Ask Codex to do anything  phase0-fixture-model default[0 q [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026hMMMM + + +› Phase zero fixture: reply with the completion marker. +[?25lAsk Codex to do anything[0 q [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l⚠1 warning·f2toview[?25h[?2026l]0;⠙ workspace[?2026h[?25l • Working (0s • esc to interrupt)  › Ask Codex to do anything  phase0-fixture-model default ⚠ 1 warning · f2 to view[0 q [?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l]0;⠹ ⠹ | workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l1[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l2[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦3[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25lQueued phase zero messagetab to queue message   100% contex left[?25h[?2026l[?2026h[?25l5[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l ◦ Working (5s • esc to interrupt) • Queued follow-up inputs ↳ Queued phase zero message shift+← edit last queued message › Ask Codex to do anything  phase0-fixture-model default ⚠ 1 warning · f2 to view[0 q [?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•6[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l • Working (6s • esc to interrupt)  › Queued phase zero message  tab to queue message 100% context left[0 q [?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l7[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026hMMMM + +• PHASE0 COMPLETE. Deterministic local response. + + 2:42 PM[?25l  › Ask Codex to do anything  phase0-fixture-model default ⚠ 1 warning · f2 to view[0 q [?25h[?2026l[?2026h[?25l  › Shutting down... [?2026l]0;[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_preview/README.md b/tests/corpus/codex_0158_preview/README.md new file mode 100644 index 0000000..b82a485 --- /dev/null +++ b/tests/corpus/codex_0158_preview/README.md @@ -0,0 +1,57 @@ +# Codex 0.157.1 and 0.158.0 preview captures + +Captured 2026-09-28 from the official macOS arm64 release executables in a +40-row × 120-column PTY with `TERM=xterm-256color`. Each file is the complete, +unmodified direct Codex PTY stream from startup through teardown. Tests replay +prefixes at the byte checkpoints below. There are no resize events in these +six scenarios. The `fullscreen` scenarios use Codex's alternate screen; they +are not captures of an outer fleetcom client. + +The Responses endpoint was a loopback server with scripted replies and harmless +tool calls. Each run used an isolated home and workspace, `--no-daemon`, and +`CODEX_TUI_DISABLE_KEYBOARD_ENHANCEMENT=1`. This is real CLI rendering with a +mock provider, not a hosted-model or account test. The unknown fixture model +produces a warning beside the inline model footer. Working-state tests assert +`live_preview` separately so they do not preserve the existing missing-label +behavior. Approval tests also verify preview resolution. + +The inline scenario submits a prompt, queues `Queued phase zero message` with +Tab, retrieves it with Shift-Left (`ESC [ 1 ; 2 D`), clears the draft with +Ctrl-U, and waits for completion. Both releases retrieve the draft, although +0.157.1 displays the older Option-Up hint. The approval scenario declines a +`printf` command. The stdin scenario approves a shell command that reads one +line, then the mock requests `fixture\n` as terminal input. 0.157.1 completes; +0.158.0 displays a second approval menu. Tests check the rendered distinctions +and adapter results against the reviewed capture screens, not generated +expectations. + +## Producer provenance + +| Version | Source commit | Official macOS arm64 tarball SHA-256 | +| --- | --- | --- | +| 0.157.1 | `36650394c5b38c2990ccf2a3457165ca3e9d9726` | `3c45b162b7a76f51325015b1d0a8112c73219b7a9b59cd5762c37c9ba55894fa` | +| 0.158.0 | `064c6b8c737f5b41d171fdda80bd9ef10ad06eb3` | `341c4a08f9ce1935b3007376dc2a3d50a0a89112930e9a474ae61367218f6e8a` | + +Imported from the matching scenario's `session.bin` in the Phase 0 evidence +bundle `fleetcom-phase0.STTTSl`; stream hashes match that bundle's manifests +and fixture index. No home directories, request dumps, or pilot runs are +included. All paths and IDs visible in the streams belong to isolated capture +workspaces. Playback requires no Codex executable, network, or account. + +## Streams and checkpoints + +Offsets are exclusive byte ends measured from startup. Dimensions remain +40×120 at every checkpoint. + +| Stream | Tested checkpoints | Bytes | SHA-256 | +| --- | --- | ---: | --- | +| `0.157.1-inline.bin` | working 12405; queued 15613; Shift-Left 17650; completed 18716 | 18979 | `3948ac17127d2a8b87e52ce33c21ae5fd481561138534d773e9c857eeedd5a93` | +| `0.158.0-inline.bin` | working 11311; queued 14478; Shift-Left 16558; completed 17253 | 17516 | `891a15ed16251b0af90ca3cf06311d401fef8e7a0bf93a3fea240f3a2f74f8ac` | +| `0.157.1-fullscreen-approval.bin` | approval 11965 | 13572 | `cbc65ae4387235d0b6a7d724984125d72bd7ed0348e39f41866b5426783ba99a` | +| `0.158.0-fullscreen-approval.bin` | approval 12967 | 14592 | `357b3c8c5b4d6b34b422d08f745d92700b4969635d8e29282d1cb76b48b84d8e` | +| `0.157.1-fullscreen-stdin.bin` | command approval 12494; completed after stdin 16518 | 17327 | `07e950cd24ae9a93684ca427714eb6a9507a64a08987c2de6263476d96bc4efe` | +| `0.158.0-fullscreen-stdin.bin` | command approval 13496; stdin approval 17417 | 19416 | `cb8c3662a0121b8dd1fd73ee3d15de3ae9208bdd72f054b1c71c58460d27ab47` | + +These captures do not establish Linux CLI rendering, real-account behavior, +native mouse/clipboard behavior, or shared-daemon compatibility. Tests replay +the recorded bytes portably; they do not drive a live CLI. From 12d8ee74ef0bcea808f986048982416a0f049572 Mon Sep 17 00:00:00 2001 From: Christopher Sardegna Date: Mon, 28 Sep 2026 15:27:38 -0700 Subject: [PATCH 2/4] test: preserve Codex terminal transitions across the 0.158 upgrade --- .gitattributes | 1 + src/terminal/codex_tests.rs | 105 ++++++++ src/terminal/mod.rs | 2 + .../0.157.1-fullscreen-fleetcom-load.bin | 1 + .../0.157.1-fullscreen-transitions.bin | 1 + .../0.158.0-fullscreen-fleetcom-load.bin | 1 + .../0.158.0-fullscreen-transitions.bin | 1 + tests/corpus/codex_0158_terminal/README.md | 39 +++ .../corpus/codex_0158_terminal/manifest.json | 234 ++++++++++++++++++ 9 files changed, 385 insertions(+) create mode 100644 src/terminal/codex_tests.rs create mode 100644 tests/corpus/codex_0158_terminal/0.157.1-fullscreen-fleetcom-load.bin create mode 100644 tests/corpus/codex_0158_terminal/0.157.1-fullscreen-transitions.bin create mode 100644 tests/corpus/codex_0158_terminal/0.158.0-fullscreen-fleetcom-load.bin create mode 100644 tests/corpus/codex_0158_terminal/0.158.0-fullscreen-transitions.bin create mode 100644 tests/corpus/codex_0158_terminal/README.md create mode 100644 tests/corpus/codex_0158_terminal/manifest.json diff --git a/.gitattributes b/.gitattributes index 94440a8..47afc19 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ # Treat raw PTY captures as binary data. tests/corpus/*.bin binary +tests/corpus/**/*.bin binary diff --git a/src/terminal/codex_tests.rs b/src/terminal/codex_tests.rs new file mode 100644 index 0000000..063ef8a --- /dev/null +++ b/src/terminal/codex_tests.rs @@ -0,0 +1,105 @@ +//! Replay release-binary output; the model responses were scripted locally. + +use super::emulator::Emulator; +use crate::protocol::ClipboardKind; + +const REPLY: &str = "PHASE0 COMPLETE. Deterministic local response."; +const PROMPT: &str = "Phase zero fixture: reply with the completion marker."; +const MANIFEST: &str = include_str!("../../tests/corpus/codex_0158_terminal/manifest.json"); +const STREAMS: [&[u8]; 4] = [ + include_bytes!("../../tests/corpus/codex_0158_terminal/0.157.1-fullscreen-transitions.bin"), + include_bytes!("../../tests/corpus/codex_0158_terminal/0.157.1-fullscreen-fleetcom-load.bin"), + include_bytes!("../../tests/corpus/codex_0158_terminal/0.158.0-fullscreen-transitions.bin"), + include_bytes!("../../tests/corpus/codex_0158_terminal/0.158.0-fullscreen-fleetcom-load.bin"), +]; + +#[test] +fn codex_release_terminal_transitions() { + let manifest = jzon::parse(MANIFEST).unwrap(); + assert_eq!(manifest["fixtures"].len(), STREAMS.len()); + for (fixture, bytes) in manifest["fixtures"].members().zip(STREAMS) { + let name = fixture["name"].as_str().unwrap(); + let outer = fixture["surface"] == "outer fleetcom client"; + assert_eq!(fixture["bytes"].as_usize().unwrap(), bytes.len(), "{name}"); + // Small chunks also split UTF-8 and escape sequences across parser calls. + for chunk_size in [usize::MAX, 7] { + let mut emu = Emulator::new(40, 120, 10_000); + assert!(!emu.alternate_screen()); + let mut at = 0; + let mut resizes = fixture["resizes"].members().peekable(); + for mark in fixture["marks"].members() { + let checkpoint = mark["name"].as_str().unwrap(); + let end = mark["offset"].as_usize().unwrap(); + // A resize at a checkpoint's end belongs to the following state. + while let Some(resize) = resizes.peek() { + let offset = resize["offset"].as_usize().unwrap(); + if offset >= end { + break; + } + for chunk in bytes[at..offset].chunks(chunk_size) { + emu.process(chunk); + } + emu.resize( + resize["resize"][0].as_u16().unwrap(), + resize["resize"][1].as_u16().unwrap(), + ); + at = offset; + resizes.next(); + } + for chunk in bytes[at..end].chunks(chunk_size) { + emu.process(chunk); + } + at = end; + let context = format!("{name}/{checkpoint}, chunk size {chunk_size}"); + assert_eq!( + emu.size(), + ( + mark["rows"].as_u16().unwrap(), + mark["cols"].as_u16().unwrap() + ), + "{context}" + ); + assert_eq!(emu.alternate_screen(), checkpoint != "exit", "{context}"); + let text = emu.live_rows().join("\n"); + match checkpoint { + "attached" | "completed" | "copied" | "narrow" | "restored" => { + assert!(text.contains(PROMPT), "{context}: missing prompt: {text}"); + assert!(text.contains(REPLY), "{context}: missing reply: {text}"); + if outer { + assert!(text.contains("[attached] codex resume '"), "{context}"); + let replies = if checkpoint == "attached" { 1 } else { 2 }; + assert_eq!(text.matches(REPLY).count(), replies, "{context}"); + } + } + "new-thread" | "exit" => { + assert!(!text.contains(PROMPT), "{context}: stale prompt"); + assert!(!text.contains(REPLY), "{context}: stale reply"); + } + _ => {} + } + if checkpoint == "copied" { + assert!( + text.contains("Copied Whole response to clipboard"), + "{context}" + ); + if name.starts_with("0.158.0") { + assert!(text.contains("Copying Whole response"), "{context}"); + } + } + let clipboard = emu.drain_clipboard(); + assert_eq!(clipboard.oversized_len, None, "{context}"); + let expected = if checkpoint == "copied" { + vec![(ClipboardKind::Clipboard, REPLY.to_owned())] + } else { + vec![] + }; + assert_eq!(clipboard.stores, expected, "{context}"); + assert!( + emu.drain_clipboard().stores.is_empty(), + "{context}: drained twice" + ); + } + assert_eq!(at, bytes.len(), "{name}: untested trailing output"); + } + } +} diff --git a/src/terminal/mod.rs b/src/terminal/mod.rs index e373be0..843e8b8 100644 --- a/src/terminal/mod.rs +++ b/src/terminal/mod.rs @@ -3,6 +3,8 @@ //! events into PTY bytes. pub(crate) mod ansi; +#[cfg(test)] +mod codex_tests; pub(crate) mod emulator; // Differential emulator tests over recorded PTY output. #[cfg(test)] diff --git a/tests/corpus/codex_0158_terminal/0.157.1-fullscreen-fleetcom-load.bin b/tests/corpus/codex_0158_terminal/0.157.1-fullscreen-fleetcom-load.bin new file mode 100644 index 0000000..ff11837 --- /dev/null +++ b/tests/corpus/codex_0158_terminal/0.157.1-fullscreen-fleetcom-load.bin @@ -0,0 +1 @@ +[?u[?1049h[?25l[?2004h[?1007s[?1007h[?1004s[?1004h[?2026h[?25l fleetcom 0 running · 0 idle · 0 done by state · dir · custom · foreground                                       ❯ n run · @ dir · / find · s sort  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… 0s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… full-screen 0s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… workspace 0s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… workspace 1s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… workspace 2s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… workspace 3s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-42… workspace 4s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25l[?2026l[?1000h[?1002h[?1003h[?1015h[?1006h[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM                     Tip: Use /feedback to send logs to the maintainers when something looks off.  › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM                      › Phase zero fixture: reply with the completion marker.   phase0-fixture-model default  [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (0s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (0s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (1s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (1s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (1s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (2s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (2s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (3s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (3s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (4s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (4s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (4s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (4s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (5s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (5s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.            ◦ Working (5s • esc to interrupt)  • Queued follow-up inputs  ↳ Queued phase zero message  ⌥+↑ edit last queued message   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.            • Working (6s • esc to interrupt)  • Queued follow-up inputs  ↳ Queued phase zero message  ⌥+↑ edit last queued message   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (6s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (6s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (7s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (7s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (7s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.                › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM             Tip: Use /theme to choose a syntax highlighting theme.  › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM              › Ask Codex to do anything   phase0-fixture-model default  ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM            › /copy copy the last response or part of it  › /copy   phase0-fixture-model default  [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM             Copy to clipboard   › 1. Whole response PHASE0 COMPLETE. Deterministic local response.   enter select · esc back  [?25l [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' Ctrl-\ background [?25l[?2026l]52;c;UEhBU0UwIENPTVBMRVRFLiBEZXRlcm1pbmlzdGljIGxvY2FsIHJlc3BvbnNlLg==[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM             Tip: Use /theme to choose a syntax highlighting theme.  › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' copied 46 chars [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.157.1) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM  • Copied Whole response to clipboard           Tip: Use /theme to choose a syntax highlighting theme.  › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-426f-7162-a215-3cea7cd6e6dd' copied 46 chars [?25h[?2026l \ No newline at end of file diff --git a/tests/corpus/codex_0158_terminal/0.157.1-fullscreen-transitions.bin b/tests/corpus/codex_0158_terminal/0.157.1-fullscreen-transitions.bin new file mode 100644 index 0000000..b1f52ba --- /dev/null +++ b/tests/corpus/codex_0158_terminal/0.157.1-fullscreen-transitions.bin @@ -0,0 +1 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?25l[?1049h[?1007l[?1000h[?1002h[?1006h[?1003h[?25l[?2026h[?25l╭───────────────────────────────────────╮│ >_ OpenAI Codex (v0.157.1) ││ ││ model: loading /model to change ││ directory: loading │╰───────────────────────────────────────╯›Ask Codex to do anything?forshortcuts[0 q╭[?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l/private/tmp/…/workspace[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lTip:Youcanresumeapreviousconversationbyrunningcodex resumephase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l─────────────╮ │ │phase0-fixture-model /model to change │ │─────────────╯[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› Phasezerofixture:replywiththecompletionmarker.Ask Codex to do anything?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l⚠1 warning·f2toview[?25h[?2026l]0;⠙ workspace[?2026h[?25l•Working(0s • esc to interrupt)[?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l]0;⠹ ⠹ | workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l1[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l2[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦3[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l5Queued phase zero messagetab to queue message[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦Working(5s • esc to interrupt)• Queuedfollow-upinputs ↳ Queued phase zero message  ⌥+↑ edit last queued mssageAsk Codex to do anything? for shortcuts ⚠1 warning·f2toview[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•6[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l   •Working (6s • esc to intrrupt)Queued phase zero messagetab to queue message[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l7[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lAsk Codex to do anything? for shortcuts ⚠1 warning·f2toview[?25h[?2026l[?2026h[?25l• PHASE0COMPLETE.Deterministiclocalresponse. [?25h[?2026l]0;workspace[?2026h[?25l 2:42 PM Tip:Pressctrl+gtoedityourcurrentdraftinanexternaleditor.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l   [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› /copy copy the last response or part of it /copy[?25h[?2026l[?2026h[?25l Copy to clipboard › 1. Whole response PHASE0 COMPLETE. Deterministic local response. enter select · esc back [?2026l[?2026h[?2026l]52;c;UEhBU0UwIENPTVBMRVRFLiBEZXRlcm1pbmlzdGljIGxvY2FsIHJlc3BvbnNlLg==[?2026h Tip:Pressctrl+gtoedityourcurrentdraftinanexternaleditor.›Ask Codex to do anything phase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l[?2026h[?25l• CopiedWholeresponsetoclipboard[?25h[?2026l[?2026h[?25l│ ││ model: phase0-fixture-model /model to change ││ directory: /private/tmp/…/workspace │╰────────────────────────────────────────────────────╯› Phasezerofixture:replywiththecompletionmarker.• PHASE0COMPLETE.Deterministiclocalresponse. 2:42 PM • CopiedWholeresponsetoclipboardTip:Pressctrl+rtosearchpreviouslyenteredprompts.›Ask Codex to do anythingphase0-fixture-model default?forshortcuts⚠1 warning·f2toview[0 q│[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮│ >_ OpenAI Codex (v0.157.1) ││ ││ model: phase0-fixture-model /model to change ││ directory: /private/tmp/…/workspace │╰────────────────────────────────────────────────────╯› Phasezerofixture:replywiththecompletionmarker.• PHASE0COMPLETE.Deterministiclocalresponse. 2:42 PM • CopiedWholeresponsetoclipboardTip:Pressctrl+gtoedityourcurrentdraftinanexternaleditor.›Ask Codex to do anythingphase0-fixture-model default?forshortcuts⚠1 warning·f2toview[0 q╭[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l   [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› /new start a new chat during a conversation /new[?25h[?2026l[?2026h[?25l Tip: Press ctrl+g to edit your current draft in an external editor.Ask Codex to do anything?forshortcuts⚠1 warning·f2toview[?25h[?2026l]0;workspace[?2026h[?25l╭────────────────────────────────────────────────────╮│ >_ OpenAI Codex (v0.157.1) ││ ││ model: phase0-fixture-model /model to change ││ directory: /private/tmp/…/workspace │╰────────────────────────────────────────────────────╯Tokenusage:total=20input=10output=10Tocontinuethissession,runcodex resume 01a0e9f7-8d12-76b1-80a8-a50519150e72Tip:Youcanresumeapreviousconversationbyrunningcodex resume›Ask Codex to do anythingphase0-fixture-model default?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l›Shutting down...[?2026l]0;[?1006l[?1015l[?1003l[?1002l[?1000l[?1007l[?1049l[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_terminal/0.158.0-fullscreen-fleetcom-load.bin b/tests/corpus/codex_0158_terminal/0.158.0-fullscreen-fleetcom-load.bin new file mode 100644 index 0000000..c907475 --- /dev/null +++ b/tests/corpus/codex_0158_terminal/0.158.0-fullscreen-fleetcom-load.bin @@ -0,0 +1 @@ +[?u[?1049h[?25l[?2004h[?1007s[?1007h[?1004s[?1004h[?2026h[?25l fleetcom 0 running · 0 idle · 0 done by state · dir · custom · foreground                                       ❯ n run · @ dir · / find · s sort  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… 0s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… full-screen 0s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… workspace 0s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… workspace 1s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… workspace 2s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… workspace 3s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l fleetcom 1 running · 0 idle · 0 done by state · dir · custom · foreground   Running  ✻ codex resume '01a0e9fa-51… workspace 4s                                   loaded 'phase0-saved': 1 task(s)  ↑↓ select · enter attach · space peek · ? controls [?25l[?2026l[?2026h[?25l [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25l[?2026l[?1000h[?1002h[?1003h[?1015h[?1006h[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM                      › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM                      › Phase zero fixture: reply with the completion marker.   phase0-fixture-model default  [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (0s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (0s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (1s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (1s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (1s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (2s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (2s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (3s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (3s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (4s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (4s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (4s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (5s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (5s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.            ◦ Working (5s • esc to interrupt)  • Queued follow-up inputs  ↳ Queued phase zero message  shift+← edit last queued message   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.            • Working (6s • esc to interrupt)  • Queued follow-up inputs  ↳ Queued phase zero message  shift+← edit last queued message   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (6s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (6s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                ◦ Working (7s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (7s • esc to interrupt)   › Queued phase zero message   phase0-fixture-model default  tab to queue message [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.                • Working (7s • esc to interrupt)   › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.                › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM              › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM              › Ask Codex to do anything   phase0-fixture-model default  ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM            › /copy copy the last response or part of it  › /copy   phase0-fixture-model default  [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM             Copy to clipboard   › 1. Whole response PHASE0 COMPLETE. Deterministic local response.   enter select · esc back  [?25l [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25l[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM  • Copying Whole response…            › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' Ctrl-\ background [?25h[?2026l]52;c;UEhBU0UwIENPTVBMRVRFLiBEZXRlcm1pbmlzdGljIGxvY2FsIHJlc3BvbnNlLg==[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM  • Copying Whole response…            › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' copied 46 chars [?25h[?2026l[?2026h[?25l╭────────────────────────────────────────────────────╮ │ >_ OpenAI Codex (v0.158.0) │ │ │ │ model: phase0-fixture-model /model to change │ │ directory: /private/tmp/…/workspace │ ╰────────────────────────────────────────────────────╯   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:45 PM   › Phase zero fixture: reply with the completion marker.   • PHASE0 COMPLETE. Deterministic local response.   2:46 PM  • Copying Whole response…  • Copied Whole response to clipboard          › Ask Codex to do anything   phase0-fixture-model default  ? for shortcuts ⚠ 1 warning · f2 to view [?25h [attached] codex resume '01a0e9fa-5104-7a23-ba5a-d8f6f54ba9d2' copied 46 chars [?25h[?2026l \ No newline at end of file diff --git a/tests/corpus/codex_0158_terminal/0.158.0-fullscreen-transitions.bin b/tests/corpus/codex_0158_terminal/0.158.0-fullscreen-transitions.bin new file mode 100644 index 0000000..a5615a9 --- /dev/null +++ b/tests/corpus/codex_0158_terminal/0.158.0-fullscreen-transitions.bin @@ -0,0 +1 @@ +[?2004h[?1004h]10;?\]11;?\[>c[?2026h[?25l[?1049h[?1007l[?1000h[?1002h[?1006h[?1003h[?25l[?2026h[?25l>_ OpenAI Codex (v0.158.0)loadingCome on in. There’s room for an idea.⣀⣤⣤⣤⣀⣀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⣤⣤⣤⣤⣤⡀⢀⣾⣿⣿⠿⠋⠉⠉⢉⣭⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣷⣄⣀⣾⣿⣿⠃⣀⣴⣾⣿⣿⡿⠟⠋⣀⡀⠈⠙⢿⣿⣿⣧⣀⣶⣿⣿⣿⣿⡇⢸⣿⣿⡿⠛⠉⢀⣠⣴⣿⣿⣿⣷⣦⣀⠈⢻⣿⣿⡇⣰⣿⣿⡿⢿⣿⣿⡇⢸⣿⣿⢀⣤⣶⣿⣿⣿⠟⠛⠻⣿⣿⣿⣿⣮⣿⣿⡷⢰⣿⣿⡟⠁⢸⣿⣿⡇⢸⣿⣿⣿⣿⠿⠿⣿⣿⣿⣦⣄⡀⠈⠛⠿⣿⣿⣿⣧⡀⣾⣿⣿⠃⢸⣿⣿⡇⢸⣿⣿⠋⠁⠈⠙⢻⣿⣿⣿⣶⣤⡀⠹⢿⣿⣷⡄⢸⣿⣿⣇⠸⣿⣿⣷⣦⣼⣿⣿⢸⣿⣿⠻⢿⣿⣿⡇⠘⣿⣿⣿⠈⢿⣿⣿⣦⡀⠈⠛⠿⣿⣿⣿⣿⣄⡀⢀⣠⣼⣿⣿⣿⣿⡇⣿⣿⣿⠇⢻⣿⣿⣿⣷⣦⣀⠈⠙⠻⣿⣿⣿⣶⣶⣿⣿⣿⣿⣿⣿⣿⡇⣠⣿⣿⣿⢸⣿⣿⡿⢿⣿⣿⣿⣦⣠⣴⣿⣿⣿⡿⠟⠋⢸⣿⣿⣿⣿⣷⣴⣿⣿⣿⠃⠘⣿⣿⣷⠈⠛⢿⣿⣿⣿⠿⠋⠉⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠻⣿⣿⣿⣤⣀⠈⠉⢀⣤⣶⣿⣿⣿⠿⠟⠁⣰⣿⣿⡟⠋⠁⠈⠿⣿⣿⣿⣿⣶⣾⣿⣿⣿⣿⠟⠋⠁⣠⣼⣿⣿⡟⠙⠛⠛⠛⠻⠛⢿⣿⣿⣿⣿⣷⣾⣿⣿⣿⡿⠏⠈⠙⠛⠿⠿⠿⠿⠛⠉›Ask Codex to do anything?forshortcuts[0 q [?25h[?2026l[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l/private/tmp/fleetcom-phase0.STTTSl/0.158.0-fullscreen-transitions/workspace[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;workspace[?2026h[?25lphase0-fixture-model default[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lPhase zero fixture: replywiththecompletionmarker.[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› Phasezerofixture:replywiththecompletionmarker.Ask Codex to do anything?forshortcuts[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l•Working(0s • esc to interrupt)⚠1 warning·f2toview[?25h[?2026l]0;⠙ ⠙ | workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25l1[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l2[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l◦3[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l4[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l5Queued phase zero messagetab to queue message[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l◦Working(5s • esc to interrupt)• Queuedfollow-upinputs ↳ Queued phase zero message  shift+← edit las queud messageAsk Codex to do anything? for shortcuts ⚠1 warning·f2toview[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l•6[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l   •Working (6s • esc o intrrupt)Queued phase zero messagetab to queue message[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠧ workspace[?2026h[?25l◦[?25h[?2026l[?2026h[?25h[?2026l]0;⠇ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠏ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠋ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠙ workspace[?2026h[?25h[?2026l[?2026h[?25l7[?25h[?2026l[?2026h[?25h[?2026l]0;⠹ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠸ workspace[?2026h[?25l•[?25h[?2026l[?2026h[?25h[?2026l]0;⠼ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠴ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l]0;⠦ workspace[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25lAsk Codex to do anything? for shortcuts ⚠1 warning·f2toview[?25h[?2026l]0;workspace[?2026h[?25l• PHASE0COMPLETE.Deterministiclocalresponse. 2:42 PM  [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l   [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› /copy copy the last response or part of it /copy[?25h[?2026l[?2026h[?25l Copy to clipboard › 1. Whole response PHASE0 COMPLETE. Deterministic local response. enter select · esc back [?2026l[?2026h[?2026l[?2026h• CopyingWholeresponse…›Ask Codex to do anything phase0-fixture-model default? for shortcuts ⚠ 1 warning · f2 to view[?25h[?2026l]52;c;UEhBU0UwIENPTVBMRVRFLiBEZXRlcm1pbmlzdGljIGxvY2FsIHJlc3BvbnNlLg==[?2026h[?25h[?2026l[?2026h[?25l• CopiedWholeresponsetoclipboard[?25h[?2026l[?2026h[?25lCome on in. There’s room for an idea.› Phasezerofixture:replywiththecompletionmarker.• PHASE0COMPLETE.Deterministiclocalresponse. 2:42 PM • CopyingWholeresponse…• CopiedWholeresponsetoclipboard›Ask Codex to do anythingphase0-fixture-model default?forshortcuts⚠1 warning·f2toview[0 q [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l>_ OpenAI Codex (v0.158.0)/private/tmp/fleetcom-phase0.STTTSl/0.158.0-fullscreen-transitions/workspaceCome on in. There’s room for an idea.› Phasezerofixture:replywiththecompletionmarker.• PHASE0COMPLETE.Deterministiclocalresponse. 2:42 PM • CopyingWholeresponse…• CopiedWholeresponsetoclipboard›Ask Codex to do anythingphase0-fixture-model default?forshortcuts⚠1 warning·f2toview[0 q [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l   [?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l› /new start a new chat during a conversation /new[?25h[?2026l]0;workspace[?2026h[?25l⣀⣤⣤⣤⣀⣀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⣤⣤⣤⣤⣤⡀⢀⣾⣿⣿⠿⠋⠉⠉⢉⣭⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣷⣄⣀⣾⣿⣿⠃⣀⣴⣾⣿⣿⡿⠟⠋⣀⡀⠈⠙⢿⣿⣿⣧⣀⣶⣿⣿⣿⣿⡇⢸⣿⣿⡿⠛⠉⢀⣠⣴⣿⣿⣿⣷⣦⣀⠈⢻⣿⣿⡇⣰⣿⣿⡿⢿⣿⣿⡇⢸⣿⣿⢀⣤⣶⣿⣿⣿⠟⠛⠻⣿⣿⣿⣿⣮⣿⣿⡷⢰⣿⣿⡟⠁⢸⣿⣿⡇⢸⣿⣿⣿⣿⠿⠿⣿⣿⣿⣦⣄⡀⠈⠛⠿⣿⣿⣿⣧⡀⣾⣿⣿⠃⢸⣿⣿⡇⢸⣿⣿⠋⠁⠈⠙⢻⣿⣿⣿⣶⣤⡀⠹⢿⣿⣷⡄⢸⣿⣿⣇⠸⣿⣿⣷⣦⣼⣿⣿⢸⣿⣿⠻⢿⣿⣿⡇⠘⣿⣿⣿⠈⢿⣿⣿⣦⡀⠈⠛⠿⣿⣿⣿⣿⣄⡀⢀⣠⣼⣿⣿⣿⣿⡇⣿⣿⣿⠇⢻⣿⣿⣿⣷⣦⣀⠈⠙⠻⣿⣿⣿⣶⣶⣿⣿⣿⣿⣿⣿⣿⡇⣠⣿⣿⣿⢸⣿⣿⡿⢿⣿⣿⣿⣦⣠⣴⣿⣿⣿⡿⠟⠋⢸⣿⣿⣿⣿⣷⣴⣿⣿⣿⠃⠘⣿⣿⣷⠈⠛⢿⣿⣿⣿⠿⠋⠉⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠻⣿⣿⣿⣤⣀⠈⠉⢀⣤⣶⣿⣿⣿⠿⠟⠁⣰⣿⣿⡟⠋⠁⠈⠿⣿⣿⣿⣿⣶⣾⣿⣿⣿⣿⠟⠋⠁⣠⣼⣿⣿⡟⠙⠛⠛⠛⠻⠛⢿⣿⣿⣿⣿⣷⣾⣿⣿⣿⡿⠏⠈⠙⠛⠿⠿⠿⠿⠛⠉›Ask Codex to do anythingphase0-fixture-model default?forshortcuts[?25h[?2026l[?2026h[?25l>_ OpenAI Codex (v0.158.0)/private/tmp/fleetcom-phase0.STTTSl/0.158.0-fullscreen-transitions/workspaceWhoa, fancy meeting you here![?25h[?2026l[?2026h[?25lTokenusage:total=20input=10output=10Tocontinuethissession,runcodex resume 01a0e9f7-8d7d-7d73-96da-d844c77e05e7[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25h[?2026l[?2026h[?25l›Shutting down...[?2026l]0;[?1006l[?1015l[?1003l[?1002l[?1000l[?1007l[?1049l[<1u[?2004l[?1004l[0 q[?25h[0 q[?25h^C \ No newline at end of file diff --git a/tests/corpus/codex_0158_terminal/README.md b/tests/corpus/codex_0158_terminal/README.md new file mode 100644 index 0000000..5dc88a4 --- /dev/null +++ b/tests/corpus/codex_0158_terminal/README.md @@ -0,0 +1,39 @@ +# Codex terminal release captures + +Recorded 2026-09-28 with the official arm64 macOS Codex 0.157.1 and 0.158.0 +executables. `manifest.json` preserves source commits, executable/archive hashes, +capture fleetcom provenance, stream hashes, checkpoint offsets, and resize events. +The capture fleetcom tree was d138a752 plus the recorded dirty patch, not a clean +release checkout. These are raw terminal bytes, not constructed repaint fixtures. + +The releases ran with isolated homes/workspaces, `--no-daemon`, +`TERM=xterm-256color`, and keyboard enhancement disabled. A loopback Responses +server supplied scripted replies and title responses. The unknown +`phase0-fixture-model` causes the warning footer. `SSH_TTY` forced OSC 52 output; +the desktop clipboard was never modified. Paths embedded in terminal output are +capture text, not runtime dependencies. + +Each `transitions` file is one complete direct-Codex stream, including teardown. +Replay at 40 rows by 120 columns, resize at the recorded byte offsets to 20 by 60 +and back, and inspect checkpoints before applying resizes at that same offset. +Assertions cover visible prompt/reply retention, `/new` clearing them, alternate +screen entry/exit, and the exact clipboard payload. Draining between checkpoints +ensures later repaints do not masquerade as repeated clipboard stores. + +Each `fleetcom-load` file is a prefix of the outer fleetcom client's output, +ending after copy. It records an actual foreground fleetcom load of a saved Codex +thread. The attached checkpoint contains the previous reply; a later completed +turn contains both replies. Copy reaches the outer terminal as OSC 52. These +assertions verify replayed display and clipboard behavior; they do not execute +save/load. `tests/daemon_resume.rs` separately exercises that path with stubs. +The Phase 0 live-binary experiment verified preservation of the saved thread ID. + +One stream per scenario avoids duplicate cumulative checkpoint blobs. Direct +session hashes identify the original captures; outer prefix hashes differ from +their full source sessions. The tests replay both whole segments and seven-byte +chunks without Codex, network access, or accounts. Synthetic clipboard size and +coalescing tests elsewhere retain their existing coverage. + +Not verified here: Linux release execution, real accounts, native clipboard +backends, native right-click paste, mouse gestures, shared daemons, or child +process cleanup. diff --git a/tests/corpus/codex_0158_terminal/manifest.json b/tests/corpus/codex_0158_terminal/manifest.json new file mode 100644 index 0000000..981d6f2 --- /dev/null +++ b/tests/corpus/codex_0158_terminal/manifest.json @@ -0,0 +1,234 @@ +{ + "captured_date": "2026-09-28", + "platform": "macOS-27.0-arm64-arm-64bit-Mach-O", + "machine": "arm64", + "fleetcom_head": "d138a752dd10afc80b9a4c6830327da2474c09be", + "dirty_patch_sha256": "a0e37cbc2c4877c058a3bcf295cde301086049ea6ed300b7b9244c3d0d15e182", + "fleetcom_binary_sha256": "175904b97d627cdac27f1d062c04a99ff6c63e85f3801a98c5f6920da4a529c6", + "versions": { + "0.157.1": { + "binary_sha256": "27ceb5f9b957b43a519efe4eaa3816a0bffb0a531a2c89af18840c0a3c016a7d", + "tarball_sha256": "3c45b162b7a76f51325015b1d0a8112c73219b7a9b59cd5762c37c9ba55894fa" + }, + "0.158.0": { + "binary_sha256": "788a818fbb9596869c7a487554507cb8bdca17584b8671112b23f9e225ba35c8", + "tarball_sha256": "341c4a08f9ce1935b3007376dc2a3d50a0a89112930e9a474ae61367218f6e8a" + } + }, + "source_commits": { + "0.157.1": "36650394c5b38c2990ccf2a3457165ca3e9d9726", + "0.158.0": "064c6b8c737f5b41d171fdda80bd9ef10ad06eb3" + }, + "fixtures": [ + { + "name": "0.157.1-fullscreen-transitions", + "surface": "direct Codex", + "initial_rows": 40, + "initial_cols": 120, + "bytes": 23780, + "sha256": "6757c1fe0246248da21ce43cb8745f54661942f69359a5c1b26bab2688b18a60", + "source_session_sha256": "6757c1fe0246248da21ce43cb8745f54661942f69359a5c1b26bab2688b18a60", + "marks": [ + { + "name": "startup", + "offset": 2396, + "rows": 40, + "cols": 120 + }, + { + "name": "completed", + "offset": 16312, + "rows": 40, + "cols": 120 + }, + { + "name": "copy-menu", + "offset": 17320, + "rows": 40, + "cols": 120 + }, + { + "name": "copied", + "offset": 18119, + "rows": 40, + "cols": 120 + }, + { + "name": "narrow", + "offset": 19460, + "rows": 20, + "cols": 60 + }, + { + "name": "restored", + "offset": 21163, + "rows": 40, + "cols": 120 + }, + { + "name": "new-thread", + "offset": 23499, + "rows": 40, + "cols": 120 + }, + { + "name": "exit", + "offset": 23780, + "rows": 40, + "cols": 120 + } + ], + "resizes": [ + { + "offset": 18119, + "resize": [ + 20, + 60 + ] + }, + { + "offset": 19460, + "resize": [ + 40, + 120 + ] + } + ] + }, + { + "name": "0.157.1-fullscreen-fleetcom-load", + "surface": "outer fleetcom client", + "initial_rows": 40, + "initial_cols": 120, + "bytes": 227987, + "sha256": "1a72dbf52c4db51de4ca0e7b57dec5873eb29d82891a79243995a1911ec2c531", + "source_session_sha256": "045e070f0dd09b9427db1c23bd5b2f0d64a2abcaf80f73a9485776d6de53fcaa", + "marks": [ + { + "name": "attached", + "offset": 47465, + "rows": 40, + "cols": 120 + }, + { + "name": "completed", + "offset": 199735, + "rows": 40, + "cols": 120 + }, + { + "name": "copied", + "offset": 227987, + "rows": 40, + "cols": 120 + } + ], + "resizes": [] + }, + { + "name": "0.158.0-fullscreen-transitions", + "surface": "direct Codex", + "initial_rows": 40, + "initial_cols": 120, + "bytes": 23701, + "sha256": "8282b5a8ac3361e8f2420d72c1bcf54a0adfe2326d553441e3b2107570c19701", + "source_session_sha256": "8282b5a8ac3361e8f2420d72c1bcf54a0adfe2326d553441e3b2107570c19701", + "marks": [ + { + "name": "startup", + "offset": 3069, + "rows": 40, + "cols": 120 + }, + { + "name": "completed", + "offset": 16969, + "rows": 40, + "cols": 120 + }, + { + "name": "copy-menu", + "offset": 17958, + "rows": 40, + "cols": 120 + }, + { + "name": "copied", + "offset": 18660, + "rows": 40, + "cols": 120 + }, + { + "name": "narrow", + "offset": 19555, + "rows": 20, + "cols": 60 + }, + { + "name": "restored", + "offset": 20676, + "rows": 40, + "cols": 120 + }, + { + "name": "new-thread", + "offset": 23420, + "rows": 40, + "cols": 120 + }, + { + "name": "exit", + "offset": 23701, + "rows": 40, + "cols": 120 + } + ], + "resizes": [ + { + "offset": 18660, + "resize": [ + 20, + 60 + ] + }, + { + "offset": 19555, + "resize": [ + 40, + 120 + ] + } + ] + }, + { + "name": "0.158.0-fullscreen-fleetcom-load", + "surface": "outer fleetcom client", + "initial_rows": 40, + "initial_cols": 120, + "bytes": 222355, + "sha256": "5931cc47124b06ec3f91b7127af98e2651f3e622f90a2bec9987eea2ef765c74", + "source_session_sha256": "86e16d5b683b6ea9579e548951f4aff80c777275eb4d2ca73b2d30cb39c21fe5", + "marks": [ + { + "name": "attached", + "offset": 47445, + "rows": 40, + "cols": 120 + }, + { + "name": "completed", + "offset": 188465, + "rows": 40, + "cols": 120 + }, + { + "name": "copied", + "offset": 222355, + "rows": 40, + "cols": 120 + } + ], + "resizes": [] + } + ] +} From 430862110152c6dc4304e80283272a47e7eac985 Mon Sep 17 00:00:00 2001 From: Christopher Sardegna Date: Mon, 28 Sep 2026 15:33:37 -0700 Subject: [PATCH 3/4] docs: define Codex 0.158 compatibility evidence and replay limits --- docs/agent-resume.md | 4 ++++ tests/corpus/README.md | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/docs/agent-resume.md b/docs/agent-resume.md index 626fc8b..4c9dfb9 100644 --- a/docs/agent-resume.md +++ b/docs/agent-resume.md @@ -70,6 +70,10 @@ After each turn, the notifier writes the `agent-turn-complete` JSON argument to Replacing a configured notifier would change user behavior, so the harness reads bare top-level keys in `$CODEX_HOME/config.toml` until the first table header. If it finds a one-line `notify` array of non-empty basic strings, it chains that notifier after the capture write. `FLEETCOM_NOTIFY_CHAIN` carries its argv joined by newlines; the capture script appends the notification payload before invoking it. An absent setting or empty array means capture runs alone. This encoding cannot transport empty arguments, newlines, or NUL, so those values disable injection. +Live validation on 2026-09-28 used the official macOS arm64 Codex 0.157.1 and 0.158.0 executables with isolated homes and a scripted loopback Responses server. In both releases, the real capture script preserved the notification JSON and passed it to the configured notifier. Saving and loading through foreground fleetcom preserved the thread ID and reopened its history. These runs used `--no-daemon`; separate default-launch probes also captured and saved the ID, but their fresh homes had no managed Codex daemon installed or running. Shared-daemon behavior and real-account behavior remain unverified. + +The [recorded terminal fixtures](../tests/corpus/codex_0158_terminal/README.md) preserve resumed-history and clipboard output from those runs. Offline replay checks the recorded display and OSC 52 forwarding; it does not run the notifier or execute save/load. The separate `tests/daemon_resume.rs` integration tests exercise session resume with stub agents. + ### `grok` You can specify a Grok ID at launch, but cannot inject a live-capture channel. For a bare command, `--session-id ''` is added; no instrumentation is required for a canonical resume command. diff --git a/tests/corpus/README.md b/tests/corpus/README.md index 62ddc65..d678941 100644 --- a/tests/corpus/README.md +++ b/tests/corpus/README.md @@ -7,8 +7,12 @@ parser assertions checked against captured behavior. ## Capture method -Each fixture is raw output from a 40×120 PTY with `TERM=xterm-256color`. Feed -the bytes to the emulator verbatim in tests. +The raw captures listed below start in a 40×120 PTY with +`TERM=xterm-256color`. Feed their bytes to the emulator verbatim. The +`preview_*.bin` fixtures are constructed repaints, described separately below. +Versioned capture directories record their own geometry, checkpoints, and +resize events; they also distinguish direct child output from an outer +fleetcom client's output. ## Fixtures @@ -92,6 +96,32 @@ fix the parser BEL` title announce. | `preview_trunc_grok.bin` | synthetic 40×80: spinner label truncated with the CLI's ellipsis | CLI's own `…` kept verbatim | | `preview_wrap_grok.bin` | synthetic 40×30: ellipsis wrapped onto the next row | structure rejected; marker fallback | +## Codex 0.157.1 and 0.158.0 captures + +The versioned directories contain raw PTY streams from the official macOS arm64 +release executables, recorded on 2026-09-28. Codex ran with isolated homes, +`--no-daemon`, and a loopback Responses server supplying scripted replies: + +- [`codex_0158_preview`](codex_0158_preview/README.md) covers working status, + queued input, Shift-Left draft retrieval, completed-turn rejection by the + working matcher, ordinary command approval, and the additional terminal-input + approval in 0.158.0. The existing approval matcher recognizes both menus. +- [`codex_0158_terminal`](codex_0158_terminal/README.md) covers direct Codex + output across resize, `/new`, alternate-screen teardown, and OSC 52 copy. + Separate outer fleetcom captures show resumed history and the exact clipboard + payload forwarded to the terminal. + +Each directory documents provenance and replay boundaries. The terminal +manifest records the capture fleetcom tree: `d138a752` plus the recorded dirty +patch, not a clean release checkout. Tests replay the bytes without Codex, +network access, or accounts. Replaying a saved-thread capture checks its display +and clipboard output; it does not execute save/load. See +[agent session resume](../../docs/agent-resume.md#codex) for the live validation. + +These recordings do not establish Linux release behavior, real-account +behavior, native clipboard or mouse behavior, or shared-daemon compatibility. +Replay tests are portable; the live capture platform was macOS arm64. + ## Validation coverage Verify display and parser behavior against these fixtures: @@ -107,4 +137,4 @@ Verify display and parser behavior against these fixtures: See `src/terminal/golden.rs` for absolute display and parser expectations and terminal-backend comparisons, and `src/harness/summary_tests.rs` for -preview-fixture expectations. \ No newline at end of file +preview-fixture expectations. From fb1818fe0f75f20b5402846ed515ee92d7c7573c Mon Sep 17 00:00:00 2001 From: Christopher Sardegna Date: Mon, 28 Sep 2026 15:35:03 -0700 Subject: [PATCH 4/4] fix(codex): preserve model labels beside warning badges --- src/harness/summary.rs | 82 ++++++++++++++++++++++++++- src/harness/summary_tests.rs | 106 +++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+), 1 deletion(-) diff --git a/src/harness/summary.rs b/src/harness/summary.rs index 30bfc12..9004bad 100644 --- a/src/harness/summary.rs +++ b/src/harness/summary.rs @@ -440,10 +440,17 @@ fn codex_model_label(rows: &[String]) -> Option { if !rows[i].starts_with(' ') { return None; } - let segs: Vec<&str> = rows[i].trim().split(" · ").collect(); + let row = rows[i].trim(); + let footer = codex_footer_without_warning(row)?; + let segs: Vec<&str> = footer.split(" · ").collect(); if segs[0].is_empty() { return None; } + // The warning reduces footer width; an ellipsis in the model item is + // truncation, even when the remaining words satisfy the effort shape. + if footer != row && (segs[0].contains('…') || segs[0].contains("...")) { + return None; + } let in_out = segs.len() >= 3 && segs[segs.len() - 2].ends_with(" in") && segs[segs.len() - 1].ends_with(" out"); @@ -451,6 +458,79 @@ fn codex_model_label(rows: &[String]) -> Option { }) } +/// The warning occupies a separate right-aligned area with at least two spaces +/// before it. Its middle dot belongs to the badge, not the model status line. +fn codex_footer_without_warning(row: &str) -> Option<&str> { + if !row.contains('⚠') { + return Some(row); + } + let (footer, badge) = row.rsplit_once(" ⚠ ")?; + let (count_label, hint) = badge + .split_once(" · ") + .map_or((badge, None), |(count, hint)| (count, Some(hint))); + let count_text = count_label.split(' ').next()?; + let count = count_text.parse::().ok()?; + if count == 0 || count.to_string() != count_text || footer.contains('⚠') { + return None; + } + if count_label != count_text { + let suffix = if count == 1 { " warning" } else { " warnings" }; + if count_label.strip_prefix(count_text)? != suffix + || !codex_warning_shortcut(hint?.strip_suffix(" to view")?) + { + return None; + } + } else if hint.is_some_and(|hint| !codex_warning_shortcut(hint)) { + return None; + } + Some(footer.trim_end()) +} + +/// Warning hints are one key, a two-key chord, or the unbound command fallback. +fn codex_warning_shortcut(hint: &str) -> bool { + if hint == "/warnings" { + return true; + } + let key_label = |mut key: &str| { + for modifier in ["ctrl+", "shift+"] { + key = key.strip_prefix(modifier).unwrap_or(key); + } + key = key + .strip_prefix("alt+") + .or_else(|| key.strip_prefix("⌥+")) + .unwrap_or(key); + (key.len() == 1 && !key.starts_with(char::is_whitespace)) + || matches!( + key, + "enter" + | "space" + | "tab" + | "esc" + | "backspace" + | "delete" + | "del" + | "fwd del" + | "home" + | "end" + | "pgup" + | "pgdn" + | "↑" + | "↓" + | "←" + | "→" + ) + || key.strip_prefix('f').is_some_and(|number| { + number + .parse::() + .is_ok_and(|n| (1..=24).contains(&n) && n.to_string() == number) + }) + }; + key_label(hint) + || hint + .match_indices(' ') + .any(|(i, _)| key_label(&hint[..i]) && key_label(&hint[i + 1..])) +} + /// Whether an item has the accepted `model-with-reasoning` shape: two or three words, /// with a recognized effort word second. The optional third word occupies the /// service-tier position. Require a fixed effort word to limit false matches against diff --git a/src/harness/summary_tests.rs b/src/harness/summary_tests.rs index e36c316..c77e3a7 100644 --- a/src/harness/summary_tests.rs +++ b/src/harness/summary_tests.rs @@ -694,6 +694,82 @@ fn codex_label_reads_either_status_line_shape() { ); } +#[test] +fn codex_label_separates_right_aligned_warning_badges() { + let label = |row: &str| CodexSummary.model_label(&rs(&["›", "", row])); + for badge in [ + "⚠ 1 warning · f2 to view", + "⚠ 12 warnings · ctrl+w to view", + "⚠ 2 warnings · ctrl+x w to view", + "⚠ 1 warning · /warnings to view", + "⚠ 1 · f2", + "⚠ 2 · shift+←", + "⚠ 3 · ⌥+w", + "⚠ 4 · alt+w", + "⚠ 5 · ctrl+x ctrl+w", + "⚠ 6 · /warnings", + "⚠ 1 warning · ctrl+shift+⌥+f24 to view", + "⚠ 1 · fwd del", + "⚠ 1 · ctrl+x ctrl+fwd del", + "⚠ 1", + "⚠ 12", + ] { + for (footer, want) in [ + ("gpt-5.4 high", "gpt-5.4 high"), + ("gpt-5.4 xhigh fast", "gpt-5.4 xhigh fast"), + ("gpt-5.4 high · /tmp/project", "gpt-5.4 high"), + ("gpt-5.4 · 28.2K in · 78 out", "gpt-5.4"), + ("gpt-5.4 high · 5.26K used · 0 in · 0 out", "gpt-5.4 high"), + ] { + for padding in [" ", " "] { + let row = format!(" {footer}{padding}{badge}"); + assert_eq!(label(&row), Some(want.to_string()), "{row:?}"); + } + } + } +} + +#[test] +fn codex_label_rejects_warning_prose_and_incomplete_footers() { + let label = |row: &str| CodexSummary.model_label(&rs(&["›", "", row])); + for row in [ + " gpt-5.4 high ⚠", + " gpt-5.4 high ⚠ check your configuration", + " gpt-5.4 high ⚠ 1 warning · read documentation to view", + " gpt-5.4 high ⚠ 1 · read documentation", + " gpt-5.4 high ⚠ 1 warning · f2", + " gpt-5.4 high ⚠ 1 warning", + " gpt-5.4 high ⚠ 1 warnings · f2 to view", + " gpt-5.4 high ⚠ 2 warning · f2 to view", + " gpt-5.4 high ⚠ 0", + " gpt-5.4 high ⚠ 01", + " gpt-5.4 high ⚠ -1", + " gpt-5.4 high ⚠ 1 ·", + " gpt-5.4 high ⚠ 1 · f2 extra words", + " gpt-5.4 high ⚠ 1 · f25", + " gpt-5.4 high ⚠ 1 warning · f2 to vie…", + " gpt-5.4 high ⚠ 1 warning · f2 to view", + " gpt-5.4 high⚠ 1", + " /tmp/project · gpt-5.4 high ⚠ 1", + "gpt-5.4 high ⚠ 1", + " gpt-5.4 ⚠ 1", + " gpt-5.4 none ⚠ 1", + " gpt-5.4 very high fast ⚠ 1", + " gpt-5.4 h… ⚠ 1", + " gpt-5.4 high fa… ⚠ 1", + " gpt-5.4… high ⚠ 1", + " gpt-5.4 high... ⚠ 1", + " gpt-5.4 · 0 in · 0 ou… ⚠ 1", + " gpt-5.4… · 0 in · 0 out ⚠ 1", + ] { + assert_eq!(label(row), None, "{row:?}"); + } + + let mut rows = rs(&[" gpt-5.4 high ⚠ 1"]); + rows.extend(rs(&["one", "two", "three", "four", "five", "six"])); + assert_eq!(CodexSummary.model_label(&rows), None); +} + /// The braille spinner and the blocked-on-user blink each canonicalize to a /// single string; idle and foreign titles pass through. #[test] @@ -1438,6 +1514,36 @@ fn corpus_codex_0158_working_queue_and_completed_turns() { } } +fn codex_warning_footer_prefixes_working_preview(bytes: &[u8], offset: usize) { + let rows = codex_0158_checkpoint(bytes, offset, false); + assert_eq!( + CodexSummary.model_label(&rows), + Some("phase0-fixture-model default".to_string()), + "checkpoint {offset}" + ); + assert_eq!( + corpus(&bytes[..offset], &CodexSummary, 120), + anchor("phase0-fixture-model default · Working", "codex:working"), + "checkpoint {offset}" + ); +} + +#[test] +fn corpus_codex_0157_warning_footer_prefixes_working_preview() { + codex_warning_footer_prefixes_working_preview( + include_bytes!("../../tests/corpus/codex_0158_preview/0.157.1-inline.bin"), + 12405, + ); +} + +#[test] +fn corpus_codex_0158_warning_footer_prefixes_working_preview() { + codex_warning_footer_prefixes_working_preview( + include_bytes!("../../tests/corpus/codex_0158_preview/0.158.0-inline.bin"), + 11311, + ); +} + #[test] fn corpus_codex_0158_command_approvals() { for (bytes, offset) in [