diff --git a/codex-rs/core/src/features.rs b/codex-rs/core/src/features.rs index c9a24a43d..cc65ad572 100644 --- a/codex-rs/core/src/features.rs +++ b/codex-rs/core/src/features.rs @@ -136,6 +136,7 @@ pub enum Feature { /// Emit skill approval test prompts/events. SkillApproval, /// Steer feature flag - when enabled, Enter submits immediately instead of queuing. + /// Kept for config backward compatibility; behavior is always steer-enabled. Steer, /// Allow request_user_input in Default collaboration mode. DefaultModeRequestUserInput, @@ -638,7 +639,7 @@ pub const FEATURES: &[FeatureSpec] = &[ FeatureSpec { id: Feature::Steer, key: "steer", - stage: Stage::Stable, + stage: Stage::Removed, default_enabled: true, }, FeatureSpec { diff --git a/codex-rs/tui/src/bottom_pane/chat_composer.rs b/codex-rs/tui/src/bottom_pane/chat_composer.rs index 789211996..e05953d2a 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer.rs +++ b/codex-rs/tui/src/bottom_pane/chat_composer.rs @@ -31,8 +31,8 @@ //! //! # Submission and Prompt Expansion //! -//! When steer is enabled, `Enter` submits immediately. `Tab` requests queuing while a task is -//! running; if no task is running, `Tab` submits just like Enter so input is never dropped. +//! `Enter` submits immediately. `Tab` requests queuing while a task is running; if no task is +//! running, `Tab` submits just like Enter so input is never dropped. //! `Tab` does not submit when entering a `!` shell command. //! //! On submit/queue paths, the composer: @@ -382,8 +382,6 @@ pub(crate) struct ChatComposer { dismissed_mention_popup_token: Option, mention_bindings: HashMap, recent_submission_mention_bindings: Vec, - /// When enabled, `Enter` submits immediately and `Tab` requests queuing behavior. - steer_enabled: bool, collaboration_modes_enabled: bool, config: ChatComposerConfig, collaboration_mode_indicator: Option, @@ -489,7 +487,6 @@ impl ChatComposer { dismissed_mention_popup_token: None, mention_bindings: HashMap::new(), recent_submission_mention_bindings: Vec::new(), - steer_enabled: false, collaboration_modes_enabled: false, config, collaboration_mode_indicator: None, @@ -550,17 +547,6 @@ impl ChatComposer { ordered } - /// Enables or disables "Steer" behavior for submission keys. - /// - /// When steer is enabled, `Enter` produces [`InputResult::Submitted`] (send immediately) and - /// `Tab` produces [`InputResult::Queued`] when a task is running; otherwise it submits - /// immediately. `Tab` does not submit when the input is a `!` shell command. - /// When steer is disabled, `Enter` produces [`InputResult::Queued`], preserving the default - /// "queue while a task is running" behavior. - pub fn set_steer_enabled(&mut self, enabled: bool) { - self.steer_enabled = enabled; - } - pub fn set_collaboration_modes_enabled(&mut self, enabled: bool) { self.collaboration_modes_enabled = enabled; } @@ -2735,25 +2721,12 @@ impl ChatComposer { modifiers: KeyModifiers::NONE, kind: KeyEventKind::Press, .. - } if self.steer_enabled && !self.is_bang_shell_command() => { - self.handle_submission(self.is_task_running) - } - KeyEvent { - code: KeyCode::Tab, - modifiers: KeyModifiers::NONE, - kind: KeyEventKind::Press, - .. - } if self.is_task_running && !self.is_bang_shell_command() => { - self.handle_submission(true) - } + } if !self.is_bang_shell_command() => self.handle_submission(self.is_task_running), KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::NONE, .. - } => { - let should_queue = !self.steer_enabled; - self.handle_submission(should_queue) - } + } => self.handle_submission(false), input => self.handle_input_basic(input), } } @@ -3153,7 +3126,6 @@ impl ChatComposer { use_shift_enter_hint: self.use_shift_enter_hint, is_task_running: self.is_task_running, quit_shortcut_key: self.quit_shortcut_key, - steer_enabled: self.steer_enabled, collaboration_modes_enabled: self.collaboration_modes_enabled, is_wsl, context_window_percent: self.context_window_percent, @@ -4109,9 +4081,7 @@ impl ChatComposer { | FooterMode::ComposerHasDraft => false, }; let show_queue_hint = match footer_props.mode { - FooterMode::ComposerHasDraft => { - footer_props.is_task_running && footer_props.steer_enabled - } + FooterMode::ComposerHasDraft => footer_props.is_task_running, FooterMode::QuitShortcutReminder | FooterMode::ComposerEmpty | FooterMode::ShortcutOverlay @@ -4735,10 +4705,9 @@ mod tests { }, ); - // Textarea has content, agent running, steer enabled: queue hint is shown. + // Textarea has content, agent running: queue hint is shown. snapshot_composer_state_with_width("footer_collapse_queue_full", 120, true, |composer| { setup_collab_footer(composer, 98, None); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }); @@ -4748,7 +4717,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, None); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4759,7 +4727,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, None); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4770,7 +4737,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, None); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4781,20 +4747,18 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, None); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, ); - // Textarea has content, plan mode active, agent running, steer enabled: queue hint + mode. + // Textarea has content, plan mode active, agent running: queue hint + mode. snapshot_composer_state_with_width( "footer_collapse_plan_queue_full", 120, true, |composer| { setup_collab_footer(composer, 98, Some(CollaborationModeIndicator::Plan)); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4805,7 +4769,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, Some(CollaborationModeIndicator::Plan)); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4816,7 +4779,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, Some(CollaborationModeIndicator::Plan)); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4827,7 +4789,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, Some(CollaborationModeIndicator::Plan)); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4838,7 +4799,6 @@ mod tests { true, |composer| { setup_collab_footer(composer, 98, Some(CollaborationModeIndicator::Plan)); - composer.set_steer_enabled(true); composer.set_task_running(true); composer.set_text_content("Test".to_string(), Vec::new(), Vec::new()); }, @@ -4910,11 +4870,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); composer.set_text_content("draft text".to_string(), Vec::new(), Vec::new()); assert_eq!(composer.clear_for_ctrl_c(), Some("draft text".to_string())); @@ -4978,7 +4933,6 @@ mod tests { assert_eq!(composer.pending_pastes, vec![(placeholder.clone(), large)]); assert_eq!(composer.textarea.element_payloads(), vec![placeholder]); - composer.set_steer_enabled(true); let (result, _needs_redraw) = composer.handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); match result { @@ -5132,13 +5086,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); let (result, needs_redraw) = composer.handle_key_event(KeyEvent::new(KeyCode::Char('?'), KeyModifiers::NONE)); @@ -5181,10 +5128,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); // Force an active paste burst so this test doesn't depend on tight timing. composer @@ -5292,10 +5235,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); let _ = composer.handle_key_event(KeyEvent::new(KeyCode::Char('?'), KeyModifiers::NONE)); assert_eq!(composer.footer_mode, FooterMode::ShortcutOverlay); @@ -5546,7 +5485,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let input = "npx -y @kaeawc/auto-mobile@latest"; composer.textarea.insert_str(input); @@ -5582,10 +5520,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); let _ = composer.handle_key_event(KeyEvent::new(KeyCode::Char('1'), KeyModifiers::NONE)); assert!(composer.is_in_paste_burst()); @@ -5617,10 +5551,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); let _ = composer.handle_key_event(KeyEvent::new(KeyCode::Char('あ'), KeyModifiers::NONE)); @@ -5763,9 +5693,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); let mut now = Instant::now(); let step = Duration::from_millis(1); @@ -5781,7 +5708,7 @@ mod tests { ); now += step; - let (result, _) = composer.handle_submission_with_time(!composer.steer_enabled, now); + let (result, _) = composer.handle_submission_with_time(false, now); assert!( matches!(result, InputResult::None), "Enter during a burst should insert newline, not submit" @@ -5917,9 +5844,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); let needs_redraw = composer.handle_paste("hello".to_string()); assert!(needs_redraw); @@ -5949,9 +5873,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); - composer.set_steer_enabled(true); // Ensure composer is empty and press Enter. assert!(composer.textarea.text().is_empty()); @@ -5981,7 +5902,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let large = "x".repeat(LARGE_PASTE_CHAR_THRESHOLD + 10); let needs_redraw = composer.handle_paste(large.clone()); @@ -6019,7 +5939,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.handle_paste(large); assert_eq!(composer.pending_pastes.len(), 1); @@ -6153,7 +6072,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); // Type "/mo" humanlike so paste-burst doesn’t interfere. type_chars_humanlike(&mut composer, &['/', 'm', 'o']); @@ -6182,7 +6100,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); type_chars_humanlike(&mut composer, &['/', 'm', 'o']); match &composer.active_popup { @@ -6214,7 +6131,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); // Type "/res" humanlike so paste-burst doesn’t interfere. type_chars_humanlike(&mut composer, &['/', 'r', 'e', 's']); @@ -6729,7 +6645,7 @@ mod tests { } #[test] - fn tab_submits_when_no_task_running_in_steer_mode() { + fn tab_submits_when_no_task_running() { use crossterm::event::KeyCode; use crossterm::event::KeyEvent; use crossterm::event::KeyModifiers; @@ -6743,7 +6659,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); type_chars_humanlike(&mut composer, &['h', 'i']); @@ -6758,7 +6673,7 @@ mod tests { } #[test] - fn tab_does_not_submit_for_bang_shell_command_in_steer_mode() { + fn tab_does_not_submit_for_bang_shell_command() { use crossterm::event::KeyCode; use crossterm::event::KeyEvent; use crossterm::event::KeyModifiers; @@ -6772,7 +6687,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_task_running(false); type_chars_humanlike(&mut composer, &['!', 'l', 's']); @@ -6883,7 +6797,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); // Define test cases: (paste content, is_large) let test_cases = [ @@ -7164,7 +7077,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let path = PathBuf::from("/tmp/image1.png"); composer.attach_image(path.clone()); composer.handle_paste(" hi".into()); @@ -7203,7 +7115,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let mention_bindings = vec![MentionBinding { mention: "figma".to_string(), @@ -7237,7 +7148,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let remote_image_url = "https://example.com/remote.png".to_string(); composer.set_remote_image_urls(vec![remote_image_url.clone()]); let path = PathBuf::from("/tmp/image1.png"); @@ -7304,7 +7214,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); type_chars_humanlike(&mut composer, &['f', 'i', 'r', 's', 't']); let (result, _needs_redraw) = @@ -7370,7 +7279,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let large_content = "x".repeat(LARGE_PASTE_CHAR_THRESHOLD + 5); composer.handle_paste(large_content.clone()); @@ -7414,7 +7322,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let large_content = format!(" {}", "x".repeat(LARGE_PASTE_CHAR_THRESHOLD + 5)); composer.handle_paste(large_content.clone()); @@ -7458,7 +7365,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let pasted = "line1\r\nline2\r\n".to_string(); composer.handle_paste(pasted); @@ -7502,7 +7408,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.textarea.set_text_clearing_elements("/unknown "); composer.textarea.set_cursor("/unknown ".len()); @@ -7549,7 +7454,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); let path = PathBuf::from("/tmp/image2.png"); composer.attach_image(path.clone()); let (result, _) = @@ -7861,7 +7765,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); // Inject prompts as if received via event. composer.set_custom_prompts(vec![CustomPrompt { @@ -7901,7 +7804,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -7937,7 +7839,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -7977,7 +7878,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8033,7 +7933,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8090,7 +7989,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8139,7 +8037,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); // Create a custom prompt with positional args (no named args like $USER) composer.set_custom_prompts(vec![CustomPrompt { @@ -8204,7 +8101,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8263,7 +8159,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer .textarea @@ -8300,7 +8195,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer .textarea @@ -8438,7 +8332,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8477,7 +8370,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8516,7 +8408,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8560,7 +8451,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8601,7 +8491,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(false); composer.set_custom_prompts(vec![CustomPrompt { name: "my-prompt".to_string(), @@ -8616,9 +8505,10 @@ mod tests { .set_text_clearing_elements("/prompts:my-prompt foo "); composer.textarea.set_cursor(composer.textarea.text().len()); composer.attach_image(PathBuf::from("/tmp/unused.png")); + composer.set_task_running(true); let (result, _needs_redraw) = - composer.handle_key_event(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)); + composer.handle_key_event(KeyEvent::new(KeyCode::Tab, KeyModifiers::NONE)); assert!(matches!( result, @@ -8674,7 +8564,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "elegant".to_string(), @@ -8747,7 +8636,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "price".to_string(), @@ -8786,7 +8674,6 @@ mod tests { "Ask Codex to do anything".to_string(), false, ); - composer.set_steer_enabled(true); composer.set_custom_prompts(vec![CustomPrompt { name: "repeat".to_string(), diff --git a/codex-rs/tui/src/bottom_pane/footer.rs b/codex-rs/tui/src/bottom_pane/footer.rs index 28005a172..cf1d30277 100644 --- a/codex-rs/tui/src/bottom_pane/footer.rs +++ b/codex-rs/tui/src/bottom_pane/footer.rs @@ -59,7 +59,6 @@ pub(crate) struct FooterProps { pub(crate) esc_backtrack_hint: bool, pub(crate) use_shift_enter_hint: bool, pub(crate) is_task_running: bool, - pub(crate) steer_enabled: bool, pub(crate) collaboration_modes_enabled: bool, pub(crate) is_wsl: bool, /// Which key the user must press again to quit. @@ -126,8 +125,8 @@ pub(crate) enum FooterMode { ComposerEmpty, /// Base single-line footer when the composer contains a draft. /// - /// The shortcuts hint is suppressed here; when a task is running with - /// steer enabled, this mode can show the queue hint instead. + /// The shortcuts hint is suppressed here; when a task is running, this + /// mode can show the queue hint instead. ComposerHasDraft, } @@ -179,7 +178,7 @@ pub(crate) fn footer_height(props: &FooterProps) -> u16 { | FooterMode::ComposerHasDraft => false, }; let show_queue_hint = match props.mode { - FooterMode::ComposerHasDraft => props.is_task_running && props.steer_enabled, + FooterMode::ComposerHasDraft => props.is_task_running, FooterMode::QuitShortcutReminder | FooterMode::ComposerEmpty | FooterMode::ShortcutOverlay @@ -1020,7 +1019,7 @@ mod tests { | FooterMode::ComposerHasDraft => false, }; let show_queue_hint = match props.mode { - FooterMode::ComposerHasDraft => props.is_task_running && props.steer_enabled, + FooterMode::ComposerHasDraft => props.is_task_running, FooterMode::QuitShortcutReminder | FooterMode::ComposerEmpty | FooterMode::ShortcutOverlay @@ -1189,7 +1188,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1207,7 +1205,6 @@ mod tests { esc_backtrack_hint: true, use_shift_enter_hint: true, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1225,7 +1222,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1243,7 +1239,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1261,7 +1256,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: true, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1279,7 +1273,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1297,7 +1290,6 @@ mod tests { esc_backtrack_hint: true, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1315,7 +1307,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: true, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1333,7 +1324,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1344,24 +1334,6 @@ mod tests { }, ); - snapshot_footer( - "footer_composer_has_draft_queue_hint_disabled", - FooterProps { - mode: FooterMode::ComposerHasDraft, - esc_backtrack_hint: false, - use_shift_enter_hint: false, - is_task_running: true, - steer_enabled: false, - collaboration_modes_enabled: false, - is_wsl: false, - quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), - context_window_percent: None, - context_window_used_tokens: None, - status_line_value: None, - status_line_enabled: false, - }, - ); - snapshot_footer( "footer_composer_has_draft_queue_hint_enabled", FooterProps { @@ -1369,7 +1341,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: true, - steer_enabled: true, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1385,7 +1356,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1414,7 +1384,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: true, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1436,7 +1405,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1453,7 +1421,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1475,7 +1442,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1497,7 +1463,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: false, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1520,7 +1485,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), @@ -1547,7 +1511,6 @@ mod tests { esc_backtrack_hint: false, use_shift_enter_hint: false, is_task_running: false, - steer_enabled: false, collaboration_modes_enabled: true, is_wsl: false, quit_shortcut_key: key_hint::ctrl(KeyCode::Char('c')), diff --git a/codex-rs/tui/src/bottom_pane/mod.rs b/codex-rs/tui/src/bottom_pane/mod.rs index 3202a6162..17d885d5f 100644 --- a/codex-rs/tui/src/bottom_pane/mod.rs +++ b/codex-rs/tui/src/bottom_pane/mod.rs @@ -265,10 +265,6 @@ impl BottomPane { let _ = self.take_mention_bindings(); } - pub fn set_steer_enabled(&mut self, enabled: bool) { - self.composer.set_steer_enabled(enabled); - } - pub fn set_collaboration_modes_enabled(&mut self, enabled: bool) { self.composer.set_collaboration_modes_enabled(enabled); self.request_redraw(); diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_composer_has_draft_queue_hint_disabled.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_composer_has_draft_queue_hint_disabled.snap deleted file mode 100644 index 6fdeda07b..000000000 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_composer_has_draft_queue_hint_disabled.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tui/src/bottom_pane/footer.rs -expression: terminal.backend() ---- -" 100% context left " diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 77683512c..a6c7b1fef 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -2876,9 +2876,6 @@ impl ChatWidget { }; widget.prefetch_rate_limits(); - widget - .bottom_pane - .set_steer_enabled(widget.config.features.enabled(Feature::Steer)); widget.bottom_pane.set_voice_transcription_enabled( widget.config.features.enabled(Feature::VoiceTranscription), ); @@ -3053,9 +3050,6 @@ impl ChatWidget { }; widget.prefetch_rate_limits(); - widget - .bottom_pane - .set_steer_enabled(widget.config.features.enabled(Feature::Steer)); widget.bottom_pane.set_voice_transcription_enabled( widget.config.features.enabled(Feature::VoiceTranscription), ); @@ -3219,9 +3213,6 @@ impl ChatWidget { }; widget.prefetch_rate_limits(); - widget - .bottom_pane - .set_steer_enabled(widget.config.features.enabled(Feature::Steer)); widget.bottom_pane.set_voice_transcription_enabled( widget.config.features.enabled(Feature::VoiceTranscription), ); @@ -3354,7 +3345,7 @@ impl ChatWidget { else { return; }; - // Steer submissions during active final-answer streaming can race with turn + // Submissions during active final-answer streaming can race with turn // completion and strand the UI in a running state. Queue those inputs instead // of injecting immediately; `on_task_complete()` drains this FIFO via // `maybe_send_next_queued_input()`, so no typed prompt is dropped. @@ -3362,7 +3353,7 @@ impl ChatWidget { && !self.is_plan_streaming_in_tui() && self.stream_controller.is_none(); if should_submit_now { - // Submitted is only emitted when steer is enabled. + // Submitted is emitted when user submits. // Reset any reasoning header only when we are actually submitting a turn. self.reasoning_buffer.clear(); self.full_reasoning_buffer.clear(); @@ -6526,9 +6517,6 @@ impl ChatWidget { } else { self.config.features.disable(feature); } - if feature == Feature::Steer { - self.bottom_pane.set_steer_enabled(enabled); - } if feature == Feature::VoiceTranscription { self.bottom_pane.set_voice_transcription_enabled(enabled); } diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index e6ce131f7..00d4a1df9 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -1632,7 +1632,6 @@ async fn make_chatwidget_manual( animations_enabled: cfg.animations, skills: None, }); - bottom.set_steer_enabled(true); bottom.set_collaboration_modes_enabled(true); let auth_manager = codex_core::test_support::auth_manager_from_auth(CodexAuth::from_api_key("test")); @@ -3435,7 +3434,7 @@ async fn unified_exec_begin_restores_working_status_snapshot() { } #[tokio::test] -async fn steer_enter_queues_while_plan_stream_is_active() { +async fn enter_queues_while_plan_stream_is_active() { let (mut chat, _rx, mut op_rx) = make_chatwidget_manual(None).await; chat.thread_id = Some(ThreadId::new()); chat.set_feature_enabled(Feature::CollaborationModes, true); @@ -3559,7 +3558,7 @@ async fn steer_enter_during_final_stream_preserves_follow_up_prompts_in_order() } #[tokio::test] -async fn steer_enter_submits_when_plan_stream_is_not_active() { +async fn enter_submits_when_plan_stream_is_not_active() { let (mut chat, _rx, mut op_rx) = make_chatwidget_manual(None).await; chat.thread_id = Some(ThreadId::new()); chat.set_feature_enabled(Feature::CollaborationModes, true);