Simplify TUI collaboration override updates

This commit is contained in:
Eric Traut
2026-05-13 09:48:35 -07:00
parent f0205079f0
commit 2d92f391ee
6 changed files with 34 additions and 54 deletions

View File

@@ -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<SelectionAction> = 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());

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -333,6 +333,12 @@ pub(super) fn drain_insert_history(
out
}
pub(super) fn drain_app_events(
rx: &mut tokio::sync::mpsc::UnboundedReceiver<AppEvent>,
) -> Vec<AppEvent> {
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 {

View File

@@ -1,10 +1,6 @@
use super::*;
use pretty_assertions::assert_eq;
fn drain_app_events(rx: &mut tokio::sync::mpsc::UnboundedReceiver<AppEvent>) -> Vec<AppEvent> {
std::iter::from_fn(|| rx.try_recv().ok()).collect()
}
fn assert_collaboration_override(events: &[AppEvent], expected: ModeKind) {
assert!(
events.iter().any(|event| match event {

View File

@@ -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<AppEvent>) -> Vec<AppEvent> {
std::iter::from_fn(|| rx.try_recv().ok()).collect()
}
fn assert_model_effort_override(
events: &[AppEvent],
expected_model: &str,