From aa5293de22bba11777956f1d6e8169118249fb3e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 20 Apr 2026 16:15:01 -0700 Subject: [PATCH] Avoid constantly scrolling thread history to top as agent generates (#54365) Fixes two problems: * We were not preserving scroll position in the thread history view when the thread metadata store updated * We were updating thread metadata on every single chunk streamed by the agent, even though the content of the thread does not affect its metadata. Release Notes: - N/A --- crates/agent_ui/src/conversation_view.rs | 8 ++++---- crates/agent_ui/src/threads_archive_view.rs | 10 +++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/crates/agent_ui/src/conversation_view.rs b/crates/agent_ui/src/conversation_view.rs index 2ce8f7d73dfea301923f8a667d3d42088162cc00..b796f6dcfcf26d054ba79079f8dc8a885b911991 100644 --- a/crates/agent_ui/src/conversation_view.rs +++ b/crates/agent_ui/src/conversation_view.rs @@ -396,18 +396,18 @@ fn affects_thread_metadata(event: &AcpThreadEvent) -> bool { match event { AcpThreadEvent::NewEntry | AcpThreadEvent::TitleUpdated - | AcpThreadEvent::EntryUpdated(_) - | AcpThreadEvent::EntriesRemoved(_) | AcpThreadEvent::ToolAuthorizationRequested(_) | AcpThreadEvent::ToolAuthorizationReceived(_) - | AcpThreadEvent::Retry(_) | AcpThreadEvent::Stopped(_) | AcpThreadEvent::Error | AcpThreadEvent::LoadError(_) | AcpThreadEvent::Refusal | AcpThreadEvent::WorkingDirectoriesUpdated => true, // -- - AcpThreadEvent::TokenUsageUpdated + AcpThreadEvent::EntryUpdated(_) + | AcpThreadEvent::EntriesRemoved(_) + | AcpThreadEvent::Retry(_) + | AcpThreadEvent::TokenUsageUpdated | AcpThreadEvent::PromptCapabilitiesUpdated | AcpThreadEvent::AvailableCommandsUpdated(_) | AcpThreadEvent::ModeUpdated(_) diff --git a/crates/agent_ui/src/threads_archive_view.rs b/crates/agent_ui/src/threads_archive_view.rs index 6547187547c839bb1b804f933296089ffd435c28..b86d19f2013442690ebc3ca80afb71ae8b576e0e 100644 --- a/crates/agent_ui/src/threads_archive_view.rs +++ b/crates/agent_ui/src/threads_archive_view.rs @@ -320,11 +320,7 @@ impl ThreadsArchiveView { let preserve = self.preserve_selection_on_next_update; self.preserve_selection_on_next_update = false; - let saved_scroll = if preserve { - Some(self.list_state.logical_scroll_top()) - } else { - None - }; + let saved_scroll = self.list_state.logical_scroll_top(); self.list_state.reset(items.len()); self.items = items; @@ -337,9 +333,9 @@ impl ThreadsArchiveView { } } - if let Some(scroll_top) = saved_scroll { - self.list_state.scroll_to(scroll_top); + self.list_state.scroll_to(saved_scroll); + if preserve { if let Some(ix) = self.selection { let next = self.find_next_selectable(ix).or_else(|| { ix.checked_sub(1)