tui: skip identical consecutive entries in local composer history (#2352)
This PR avoids inserting duplicate consecutive messages into the Chat Composer's local history.
This commit is contained in:
@@ -55,11 +55,18 @@ impl ChatComposerHistory {
|
|||||||
/// Record a message submitted by the user in the current session so it can
|
/// Record a message submitted by the user in the current session so it can
|
||||||
/// be recalled later.
|
/// be recalled later.
|
||||||
pub fn record_local_submission(&mut self, text: &str) {
|
pub fn record_local_submission(&mut self, text: &str) {
|
||||||
if !text.is_empty() {
|
if text.is_empty() {
|
||||||
self.local_history.push(text.to_string());
|
return;
|
||||||
self.history_cursor = None;
|
|
||||||
self.last_history_text = None;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Avoid inserting a duplicate if identical to the previous entry.
|
||||||
|
if self.local_history.last().is_some_and(|prev| prev == text) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.local_history.push(text.to_string());
|
||||||
|
self.history_cursor = None;
|
||||||
|
self.last_history_text = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Should Up/Down key presses be interpreted as history navigation given
|
/// Should Up/Down key presses be interpreted as history navigation given
|
||||||
@@ -187,6 +194,29 @@ mod tests {
|
|||||||
use codex_core::protocol::Op;
|
use codex_core::protocol::Op;
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn duplicate_submissions_are_not_recorded() {
|
||||||
|
let mut history = ChatComposerHistory::new();
|
||||||
|
|
||||||
|
// Empty submissions are ignored.
|
||||||
|
history.record_local_submission("");
|
||||||
|
assert_eq!(history.local_history.len(), 0);
|
||||||
|
|
||||||
|
// First entry is recorded.
|
||||||
|
history.record_local_submission("hello");
|
||||||
|
assert_eq!(history.local_history.len(), 1);
|
||||||
|
assert_eq!(history.local_history.last().unwrap(), "hello");
|
||||||
|
|
||||||
|
// Identical consecutive entry is skipped.
|
||||||
|
history.record_local_submission("hello");
|
||||||
|
assert_eq!(history.local_history.len(), 1);
|
||||||
|
|
||||||
|
// Different entry is recorded.
|
||||||
|
history.record_local_submission("world");
|
||||||
|
assert_eq!(history.local_history.len(), 2);
|
||||||
|
assert_eq!(history.local_history.last().unwrap(), "world");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn navigation_with_async_fetch() {
|
fn navigation_with_async_fetch() {
|
||||||
let (tx, rx) = channel::<AppEvent>();
|
let (tx, rx) = channel::<AppEvent>();
|
||||||
|
|||||||
Reference in New Issue
Block a user