diff --git a/README.md b/README.md index 301d91a42247..892c049a4418 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,17 @@ If you want Codex in your code editor (VS Code, Cursor, Windsurf), chatgpt.com/codex.

> [!NOTE] -> **Exomind fork status** +> Exomind fork status +> > This fork tracks `openai/codex` and carries a small set of workflow-level changes on top of upstream. +> > - README section updated on `2026-03-07` > - Latest `upstream/main` observed at update time: `9a4787c24` > - Current fork/upstream merge-base: `b6d43ec8` > - Fork-specific additions currently include: > - a shared pending-input queue for repeating queue and repeating steer messages, with distinct preview colors > - `Shift+Tab` cycling collaboration mode when the composer is empty, and enqueuing a repeating queue message otherwise -> - `Alt+↑` recalling the most recently enqueued queue or steer draft by enqueue order +> - `Alt+Up` recalling the most recently enqueued queue or steer draft by enqueue order > - Termux compatibility work and a stable Android build path > - fork-specific CI compatibility adjustments plus governance/task-tracking experiments > - When this block changes, update the `upstream/main` hash in the same PR so the fork baseline stays auditable diff --git a/codex-rs/tui/src/bottom_pane/pending_input_preview.rs b/codex-rs/tui/src/bottom_pane/pending_input_preview.rs index d028aeaa02b4..549012db07f3 100644 --- a/codex-rs/tui/src/bottom_pane/pending_input_preview.rs +++ b/codex-rs/tui/src/bottom_pane/pending_input_preview.rs @@ -72,23 +72,26 @@ impl PendingInputPreview { for steer in &self.pending_steers { let wrapped = if steer.repeating { adaptive_wrap_lines( - steer.text.lines().map(|line| Line::from(line.cyan())), + steer + .text + .lines() + .map(|line| Line::from(line.cyan().bold())), RtOptions::new(width as usize) - .initial_indent(Line::from(" ! repeat steer: ".cyan())) + .initial_indent(Line::from(" ! repeat steer: ".cyan().bold())) .subsequent_indent(Line::from(" ")), ) } else { adaptive_wrap_lines( - steer.text.lines().map(|line| Line::from(line.blue())), + steer.text.lines().map(|line| Line::from(line.light_blue())), RtOptions::new(width as usize) - .initial_indent(Line::from(" ! pending steer: ".blue())) + .initial_indent(Line::from(" ! pending steer: ".light_blue())) .subsequent_indent(Line::from(" ")), ) }; let overflow_line = if steer.repeating { - Line::from(" …".cyan()) + Line::from(" …".cyan().bold()) } else { - Line::from(" …".blue()) + Line::from(" …".light_blue()) }; Self::push_truncated_preview_lines(&mut lines, wrapped, overflow_line); } @@ -100,48 +103,45 @@ impl PendingInputPreview { message .text .lines() - .map(|line| Line::from(line.cyan().italic())), + .map(|line| Line::from(line.cyan().bold().italic())), RtOptions::new(width as usize) - .initial_indent(Line::from(" ↻ ! ".cyan())) + .initial_indent(Line::from(" ↻ ! ".cyan().bold())) .subsequent_indent(Line::from(" ")), ), - Line::from(" …".cyan().italic()), + Line::from(" …".cyan().bold().italic()), ), (true, false) => ( adaptive_wrap_lines( message .text .lines() - .map(|line| Line::from(line.blue().italic())), + .map(|line| Line::from(line.light_blue().italic())), RtOptions::new(width as usize) - .initial_indent(Line::from(" ↳ ! ".blue())) + .initial_indent(Line::from(" ↳ ! ".light_blue())) .subsequent_indent(Line::from(" ")), ), - Line::from(" …".blue().italic()), + Line::from(" …".light_blue().italic()), ), (false, true) => ( adaptive_wrap_lines( message .text .lines() - .map(|line| Line::from(line.yellow().italic())), + .map(|line| Line::from(line.green().bold().italic())), RtOptions::new(width as usize) - .initial_indent(Line::from(" ↻ ".yellow())) + .initial_indent(Line::from(" ↻ ".green().bold())) .subsequent_indent(Line::from(" ")), ), - Line::from(" …".yellow().italic()), + Line::from(" …".green().bold().italic()), ), (false, false) => ( adaptive_wrap_lines( - message - .text - .lines() - .map(|line| Line::from(line.green().italic())), + message.text.lines().map(|line| Line::from(line.italic())), RtOptions::new(width as usize) - .initial_indent(Line::from(" ↳ ".green())) + .initial_indent(Line::from(" ↳ ")) .subsequent_indent(Line::from(" ")), ), - Line::from(" …".green().italic()), + Line::from(" …".italic()), ), }; Self::push_truncated_preview_lines(&mut lines, wrapped, overflow_line); diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap index b3a9f32aaab0..b2cde9a77682 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 301 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -13,14 +12,14 @@ Buffer { " ⌥ + ↑ edit ", ], styles: [ - x: 0, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 11, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 1, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 13, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 13, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 3, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 5, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 14, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap index 95946584cbde..385f9232fee1 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 272 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -13,17 +12,14 @@ Buffer { " ⌥ + ↑ edit ", ], styles: [ - x: 0, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 17, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 1, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 1, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 27, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 3, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 3, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 28, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 14, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_multiline_pending_steer_uses_single_prefix_and_truncates.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_multiline_pending_steer_uses_single_prefix_and_truncates.snap index 08a4f3fbe702..68b2040663f8 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_multiline_pending_steer_uses_single_prefix_and_truncates.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_multiline_pending_steer_uses_single_prefix_and_truncates.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 378 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -12,13 +11,13 @@ Buffer { " … ", ], styles: [ - x: 0, y: 0, fg: Cyan, bg: Reset, underline: Reset, modifier: NONE, + x: 0, y: 0, fg: Cyan, bg: Reset, underline: Reset, modifier: BOLD, x: 28, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 1, fg: Cyan, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 1, fg: Cyan, bg: Reset, underline: Reset, modifier: BOLD, x: 15, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 2, fg: Cyan, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 2, fg: Cyan, bg: Reset, underline: Reset, modifier: BOLD, x: 14, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 3, fg: Cyan, bg: Reset, underline: Reset, modifier: NONE, + x: 0, y: 3, fg: Cyan, bg: Reset, underline: Reset, modifier: BOLD, x: 5, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap index f3e2a1e33787..5901ca276915 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 238 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -10,8 +9,8 @@ Buffer { " ⌥ + ↑ edit ", ], styles: [ - x: 0, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 17, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 14, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_pending_steer.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_pending_steer.snap index 59c5a830200b..2ae420255483 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_pending_steer.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_pending_steer.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 345 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -9,7 +8,7 @@ Buffer { " ! pending steer: Please continue. ", ], styles: [ - x: 0, y: 0, fg: Blue, bg: Reset, underline: Reset, modifier: NONE, + x: 0, y: 0, fg: LightBlue, bg: Reset, underline: Reset, modifier: NONE, x: 35, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap index dc43cd6336e7..45960432313f 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 362 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -12,12 +11,12 @@ Buffer { " ⌥ + ↑ edit ", ], styles: [ - x: 0, y: 0, fg: Blue, bg: Reset, underline: Reset, modifier: NONE, + x: 0, y: 0, fg: LightBlue, bg: Reset, underline: Reset, modifier: NONE, x: 35, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 1, fg: Cyan, bg: Reset, underline: Reset, modifier: NONE, + x: 0, y: 1, fg: Cyan, bg: Reset, underline: Reset, modifier: BOLD, x: 48, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 2, fg: Yellow, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 2, fg: Yellow, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: BOLD, + x: 4, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: BOLD | ITALIC, x: 29, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 14, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap index 85317b79552b..5911fb902fcb 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 252 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -11,11 +10,10 @@ Buffer { " ⌥ + ↑ edit ", ], styles: [ - x: 0, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 17, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 1, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 1, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 27, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 14, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap index cb7a661d9b3c..4994f4fa1ff8 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/pending_input_preview.rs -assertion_line: 288 expression: "format!(\"{buf:?}\")" --- Buffer { @@ -12,13 +11,12 @@ Buffer { " ⌥ + ↑ edit ", ], styles: [ - x: 0, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 0, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 4, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 0, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 1, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 14, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, - x: 0, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: NONE, - x: 4, y: 2, fg: Green, bg: Reset, underline: Reset, modifier: ITALIC, + x: 4, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: ITALIC, x: 27, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 14, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE,