diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go index 46036b75..22cb97fb 100644 --- a/packages/tui/internal/components/chat/messages.go +++ b/packages/tui/internal/components/chat/messages.go @@ -210,7 +210,18 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.clipboard = msg.clipboard m.loading = false m.tail = m.viewport.AtBottom() + + // Preserve scroll across reflow + // if the user was at bottom, keep following; otherwise restore the previous offset. + wasAtBottom := m.viewport.AtBottom() + prevYOffset := m.viewport.YOffset m.viewport = msg.viewport + if wasAtBottom { + m.viewport.GotoBottom() + } else { + m.viewport.YOffset = prevYOffset + } + m.header = msg.header if m.dirty { cmds = append(cmds, m.renderView()) @@ -218,7 +229,6 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } m.tail = m.viewport.AtBottom() - viewport, cmd := m.viewport.Update(msg) m.viewport = viewport cmds = append(cmds, cmd)