diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 920e1c0616..c16d11acbf 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -3377,16 +3377,9 @@ impl ChatWidget { .map(|mut mask| { let name = mask.name.clone(); let is_current = current_kind == mask.mode; - if mask.mode == Some(ModeKind::Plan) - && let Some(effort) = self.config.plan_mode_reasoning_effort - { - mask.reasoning_effort = Some(Some(effort)); - } - let collaboration_mode = self.current_collaboration_mode.apply_mask(&mask); + let override_command = self.collaboration_mode_override_command(&mut mask); let actions: Vec = vec![Box::new(move |tx| { - tx.send(AppEvent::CodexOp(AppCommand::override_collaboration_mode( - collaboration_mode.clone(), - ))); + tx.send(AppEvent::CodexOp(override_command.clone())); tx.send(AppEvent::UpdateCollaborationMode(mask.clone())); })]; SelectionItem { @@ -3501,11 +3494,9 @@ impl ChatWidget { mask.mode = Some(ModeKind::Plan); mask.model = Some(model.clone()); mask.reasoning_effort = Some(effort); - let collaboration_mode = self.current_collaboration_mode.apply_mask(&mask); + let override_command = self.collaboration_mode_override_command(&mut mask); move |tx| { - tx.send(AppEvent::CodexOp(AppCommand::override_collaboration_mode( - collaboration_mode.clone(), - ))); + tx.send(AppEvent::CodexOp(override_command.clone())); tx.send(AppEvent::UpdateModel(model.clone())); tx.send(AppEvent::UpdatePlanModeReasoningEffort(effort)); tx.send(AppEvent::PersistPlanModeReasoningEffort(effort)); @@ -3516,11 +3507,9 @@ impl ChatWidget { mask.mode = Some(ModeKind::Plan); mask.model = Some(model.clone()); mask.reasoning_effort = Some(effort); - let collaboration_mode = self.current_collaboration_mode.apply_mask(&mask); + let override_command = self.collaboration_mode_override_command(&mut mask); move |tx| { - tx.send(AppEvent::CodexOp(AppCommand::override_collaboration_mode( - collaboration_mode.clone(), - ))); + tx.send(AppEvent::CodexOp(override_command.clone())); tx.send(AppEvent::UpdateModel(model.clone())); tx.send(AppEvent::UpdateReasoningEffort(effort)); tx.send(AppEvent::UpdatePlanModeReasoningEffort(effort)); @@ -5249,20 +5238,25 @@ impl ChatWidget { self.active_collaboration_mask.as_ref(), ) { let mut next_mask = next_mask; - if next_mask.mode == Some(ModeKind::Plan) - && let Some(effort) = self.config.plan_mode_reasoning_effort - { - next_mask.reasoning_effort = Some(Some(effort)); - } - let collaboration_mode = self.current_collaboration_mode.apply_mask(&next_mask); - self.app_event_tx - .send(AppEvent::CodexOp(AppCommand::override_collaboration_mode( - collaboration_mode, - ))); + let override_command = self.collaboration_mode_override_command(&mut next_mask); + self.app_event_tx.send(AppEvent::CodexOp(override_command)); self.set_collaboration_mask(next_mask); } } + fn collaboration_mode_override_command(&self, mask: &mut CollaborationModeMask) -> AppCommand { + self.apply_plan_reasoning_override_to_mask(mask); + AppCommand::override_collaboration_mode(self.current_collaboration_mode.apply_mask(mask)) + } + + fn apply_plan_reasoning_override_to_mask(&self, mask: &mut CollaborationModeMask) { + if mask.mode == Some(ModeKind::Plan) + && let Some(effort) = self.config.plan_mode_reasoning_effort + { + mask.reasoning_effort = Some(Some(effort)); + } + } + /// Update the active collaboration mask. /// /// When collaboration modes are enabled and a preset is selected, @@ -5274,11 +5268,7 @@ impl ChatWidget { let previous_mode = self.active_mode_kind(); let previous_model = self.current_model().to_string(); let previous_effort = self.effective_reasoning_effort(); - if mask.mode == Some(ModeKind::Plan) - && let Some(effort) = self.config.plan_mode_reasoning_effort - { - mask.reasoning_effort = Some(Some(effort)); - } + self.apply_plan_reasoning_override_to_mask(&mut mask); if mask.mode == Some(ModeKind::Plan) { self.dismissed_plan_mode_nudge_scopes .insert(self.plan_mode_nudge_scope()); diff --git a/codex-rs/tui/src/chatwidget/reasoning_shortcuts.rs b/codex-rs/tui/src/chatwidget/reasoning_shortcuts.rs index 5ff657db2f..56cbff4169 100644 --- a/codex-rs/tui/src/chatwidget/reasoning_shortcuts.rs +++ b/codex-rs/tui/src/chatwidget/reasoning_shortcuts.rs @@ -19,7 +19,6 @@ use crossterm::event::KeyEvent; use strum::IntoEnumIterator; use super::ChatWidget; -use crate::app_command::AppCommand; use crate::app_event::AppEvent; use crate::key_hint::KeyBindingListExt; @@ -107,11 +106,9 @@ impl ChatWidget { mask.mode = Some(ModeKind::Plan); mask.model = Some(current_model); mask.reasoning_effort = Some(Some(next_effort)); - let collaboration_mode = self.current_collaboration_mode.apply_mask(&mask); - self.app_event_tx - .send(AppEvent::CodexOp(AppCommand::override_collaboration_mode( - collaboration_mode, - ))); + self.app_event_tx.send(AppEvent::CodexOp( + self.collaboration_mode_override_command(&mut mask), + )); self.app_event_tx .send(AppEvent::UpdatePlanModeReasoningEffort(Some(next_effort))); } else { diff --git a/codex-rs/tui/src/chatwidget/slash_dispatch.rs b/codex-rs/tui/src/chatwidget/slash_dispatch.rs index 69e4462ea9..d02641ff48 100644 --- a/codex-rs/tui/src/chatwidget/slash_dispatch.rs +++ b/codex-rs/tui/src/chatwidget/slash_dispatch.rs @@ -89,14 +89,9 @@ impl ChatWidget { return false; } if let Some(mut mask) = collaboration_modes::plan_mask(self.model_catalog.as_ref()) { - if let Some(effort) = self.config.plan_mode_reasoning_effort { - mask.reasoning_effort = Some(Some(effort)); - } - let collaboration_mode = self.current_collaboration_mode.apply_mask(&mask); - self.app_event_tx - .send(AppEvent::CodexOp(AppCommand::override_collaboration_mode( - collaboration_mode, - ))); + self.app_event_tx.send(AppEvent::CodexOp( + self.collaboration_mode_override_command(&mut mask), + )); self.set_collaboration_mask(mask); true } else { diff --git a/codex-rs/tui/src/chatwidget/tests/helpers.rs b/codex-rs/tui/src/chatwidget/tests/helpers.rs index 28ed69139b..816fdefec5 100644 --- a/codex-rs/tui/src/chatwidget/tests/helpers.rs +++ b/codex-rs/tui/src/chatwidget/tests/helpers.rs @@ -333,6 +333,12 @@ pub(super) fn drain_insert_history( out } +pub(super) fn drain_app_events( + rx: &mut tokio::sync::mpsc::UnboundedReceiver, +) -> Vec { + std::iter::from_fn(|| rx.try_recv().ok()).collect() +} + pub(super) fn lines_to_single_string(lines: &[ratatui::text::Line<'static>]) -> String { let mut s = String::new(); for line in lines { diff --git a/codex-rs/tui/src/chatwidget/tests/plan_mode.rs b/codex-rs/tui/src/chatwidget/tests/plan_mode.rs index 17bf50d504..f917335d42 100644 --- a/codex-rs/tui/src/chatwidget/tests/plan_mode.rs +++ b/codex-rs/tui/src/chatwidget/tests/plan_mode.rs @@ -1,10 +1,6 @@ use super::*; use pretty_assertions::assert_eq; -fn drain_app_events(rx: &mut tokio::sync::mpsc::UnboundedReceiver) -> Vec { - std::iter::from_fn(|| rx.try_recv().ok()).collect() -} - fn assert_collaboration_override(events: &[AppEvent], expected: ModeKind) { assert!( events.iter().any(|event| match event { diff --git a/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs b/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs index 9e68806ee1..0217f15e3e 100644 --- a/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs +++ b/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs @@ -7,10 +7,6 @@ use codex_app_server_protocol::MarketplaceRemoveResponse; use codex_features::Stage; use pretty_assertions::assert_eq; -fn drain_app_events(rx: &mut tokio::sync::mpsc::UnboundedReceiver) -> Vec { - std::iter::from_fn(|| rx.try_recv().ok()).collect() -} - fn assert_model_effort_override( events: &[AppEvent], expected_model: &str,