From 28714013c8753cdebe03bf05a5538df8dc456fef Mon Sep 17 00:00:00 2001 From: Ruslan Strazhnyk Date: Wed, 22 Jul 2026 22:23:11 +0200 Subject: [PATCH] fix(tui): handle spacebar in turn-running input viewport MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bubble Tea delivers the spacebar as tea.KeySpace, not tea.KeyRunes. turnViewportModel.updateKey had no case for tea.KeySpace, so every space typed while the agent was processing was silently dropped — messages appeared without spaces. Added the missing handler that inserts a space at the cursor, matching the idle input widget (input.go) which already handled it correctly. Regression test included. --- internal/tui/turn_viewport.go | 5 +++++ internal/tui/turn_viewport_test.go | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/internal/tui/turn_viewport.go b/internal/tui/turn_viewport.go index 3c18f1c..7dd7b56 100644 --- a/internal/tui/turn_viewport.go +++ b/internal/tui/turn_viewport.go @@ -236,6 +236,11 @@ func (m turnViewportModel) updateKey(msg tea.KeyMsg) (tea.Model, tea.Cmd) { m.cursor = 0 case tea.KeyEnd: m.cursor = len(m.text) + case tea.KeySpace: + m.text = append(m.text, 0) + copy(m.text[m.cursor+1:], m.text[m.cursor:]) + m.text[m.cursor] = ' ' + m.cursor++ case tea.KeyRunes: if msg.Alt && len(msg.Runes) == 1 { switch msg.Runes[0] { diff --git a/internal/tui/turn_viewport_test.go b/internal/tui/turn_viewport_test.go index 0035559..0c6f421 100644 --- a/internal/tui/turn_viewport_test.go +++ b/internal/tui/turn_viewport_test.go @@ -93,6 +93,18 @@ func TestTurnViewportEditingMatchesMainInput(t *testing.T) { } } +func TestTurnViewportInsertsSpaceKey(t *testing.T) { + m := newTurnViewportModel("qmax > ", nil, nil) + m.text = []rune("hello") + m.cursor = len(m.text) + m, _ = updateTurnViewport(t, m, tea.KeyMsg{Type: tea.KeySpace}) + m, _ = updateTurnViewport(t, m, tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("world")}) + + if got, want := string(m.text), "hello world"; got != want { + t.Fatalf("text = %q, want %q (space key was dropped)", got, want) + } +} + func TestTurnViewportPreservesDraftWhenTurnFinishes(t *testing.T) { m := newTurnViewportModel("qmax > ", nil, nil) m, _ = updateTurnViewport(t, m, tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("follow up")})