From 345a38502d12f65578f6ca74fd87a3e93f09a081 Mon Sep 17 00:00:00 2001 From: Reilly Wood <163153147+rgwood-dd@users.noreply.github.com> Date: Fri, 6 Jun 2025 16:29:37 -0700 Subject: [PATCH] codex-rs: Rename `/clear` to `/new`, make it start an entirely new chat (#1264) I noticed that `/clear` wasn't fully clearing chat history; it would clear the chat history widgets _in the UI_, but the LLM still had access to information from previous messages. This PR renames `/clear` to `/new` for clarity as per Michael's suggestion, resetting `app_state` to a fresh `ChatWidget`. --- codex-rs/tui/src/app.rs | 30 ++++++++++++++----- codex-rs/tui/src/chatwidget.rs | 5 ---- .../tui/src/conversation_history_widget.rs | 6 ---- codex-rs/tui/src/slash_command.rs | 4 +-- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 8f35a350..ff61b5c9 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -40,6 +40,9 @@ pub(crate) struct App<'a> { app_event_rx: Receiver, app_state: AppState<'a>, + /// Config is stored here so we can recreate ChatWidgets as needed. + config: Config, + /// Stored parameters needed to instantiate the ChatWidget later, e.g., /// after dismissing the Git-repo warning. chat_args: Option, @@ -122,7 +125,7 @@ impl<'a> App<'a> { screen: LoginScreen::new(app_event_tx.clone(), config.codex_home.clone()), }, Some(ChatWidgetArgs { - config, + config: config.clone(), initial_prompt, initial_images, }), @@ -133,14 +136,18 @@ impl<'a> App<'a> { screen: GitWarningScreen::new(), }, Some(ChatWidgetArgs { - config, + config: config.clone(), initial_prompt, initial_images, }), ) } else { - let chat_widget = - ChatWidget::new(config, app_event_tx.clone(), initial_prompt, initial_images); + let chat_widget = ChatWidget::new( + config.clone(), + app_event_tx.clone(), + initial_prompt, + initial_images, + ); ( AppState::Chat { widget: Box::new(chat_widget), @@ -153,6 +160,7 @@ impl<'a> App<'a> { app_event_tx, app_event_rx, app_state, + config, chat_args, } } @@ -224,10 +232,16 @@ impl<'a> App<'a> { AppState::Login { .. } | AppState::GitWarning { .. } => {} }, AppEvent::DispatchCommand(command) => match command { - SlashCommand::Clear => match &mut self.app_state { - AppState::Chat { widget } => widget.clear_conversation_history(), - AppState::Login { .. } | AppState::GitWarning { .. } => {} - }, + SlashCommand::New => { + let new_widget = Box::new(ChatWidget::new( + self.config.clone(), + self.app_event_tx.clone(), + None, + Vec::new(), + )); + self.app_state = AppState::Chat { widget: new_widget }; + self.app_event_tx.send(AppEvent::Redraw); + } SlashCommand::ToggleMouseMode => { if let Err(e) = mouse_capture.toggle() { tracing::error!("Failed to toggle mouse mode: {e}"); diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 63f3bc72..bd5197c7 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -207,11 +207,6 @@ impl ChatWidget<'_> { self.conversation_history.scroll_to_bottom(); } - pub(crate) fn clear_conversation_history(&mut self) { - self.conversation_history.clear(); - self.request_redraw(); - } - pub(crate) fn handle_codex_event(&mut self, event: Event) { let Event { id, msg } = event; match msg { diff --git a/codex-rs/tui/src/conversation_history_widget.rs b/codex-rs/tui/src/conversation_history_widget.rs index a23e00d7..714ac074 100644 --- a/codex-rs/tui/src/conversation_history_widget.rs +++ b/codex-rs/tui/src/conversation_history_widget.rs @@ -245,12 +245,6 @@ impl ConversationHistoryWidget { }); } - /// Remove all history entries and reset scrolling. - pub fn clear(&mut self) { - self.entries.clear(); - self.scroll_position = usize::MAX; - } - pub fn record_completed_exec_command( &mut self, call_id: String, diff --git a/codex-rs/tui/src/slash_command.rs b/codex-rs/tui/src/slash_command.rs index cd6da4da..bfc02ceb 100644 --- a/codex-rs/tui/src/slash_command.rs +++ b/codex-rs/tui/src/slash_command.rs @@ -12,7 +12,7 @@ use strum_macros::IntoStaticStr; )] #[strum(serialize_all = "kebab-case")] pub enum SlashCommand { - Clear, + New, ToggleMouseMode, Quit, } @@ -21,7 +21,7 @@ impl SlashCommand { /// User-visible description shown in the popup. pub fn description(self) -> &'static str { match self { - SlashCommand::Clear => "Clear the chat history.", + SlashCommand::New => "Start a new chat.", SlashCommand::ToggleMouseMode => { "Toggle mouse mode (enable for scrolling, disable for text selection)" }