From 04bacc19fb48aed9d52cdf39b8c6fd82bc1692dd Mon Sep 17 00:00:00 2001 From: Luxferre Date: Sun, 22 Mar 2026 18:31:01 +0200 Subject: [PATCH] tui: implement history navigation key handlers --- cmd/sidekick-tui/main.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/cmd/sidekick-tui/main.go b/cmd/sidekick-tui/main.go index 0ec4a22..27f2be4 100644 --- a/cmd/sidekick-tui/main.go +++ b/cmd/sidekick-tui/main.go @@ -353,6 +353,41 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyCtrlJ: m.textarea.InsertString("\n") return m, nil + case tea.KeyUp: + if m.textarea.Line() == 0 { + userMsgs := m.userMessages() + if len(userMsgs) == 0 { + return m, nil + } + if m.historyIndex == -1 { + m.promptDraft = m.textarea.Value() + m.historyIndex = len(userMsgs) - 1 + } else if m.historyIndex > 0 { + m.historyIndex-- + } else { + return m, nil + } + m.textarea.SetValue(userMsgs[m.historyIndex]) + m.textarea.CursorEnd() + return m, nil + } + case tea.KeyDown: + if m.textarea.Line() == m.textarea.LineCount()-1 { + if m.historyIndex == -1 { + return m, nil + } + userMsgs := m.userMessages() + if m.historyIndex < len(userMsgs)-1 { + m.historyIndex++ + m.textarea.SetValue(userMsgs[m.historyIndex]) + m.textarea.CursorStart() + } else { + m.historyIndex = -1 + m.textarea.SetValue(m.promptDraft) + m.textarea.CursorStart() + } + return m, nil + } case tea.KeyEnter: v := m.textarea.Value() if strings.TrimSpace(v) == "" || m.isThinking { @@ -368,6 +403,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.currentReasoning = "" m.transientSteps = nil m.textarea.Reset() + m.historyIndex = -1 + m.promptDraft = "" m.updateViewportContent() m.viewport.GotoBottom() return m, nil @@ -377,6 +414,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { Role: sidekick.MessageRoleUser, Content: v, }) + m.historyIndex = -1 + m.promptDraft = "" m.currentStream = "" m.currentReasoning = "" m.transientSteps = nil