diff --git a/cmd/sidekick-tui/main.go b/cmd/sidekick-tui/main.go index cc6dce6..aaa26b9 100644 --- a/cmd/sidekick-tui/main.go +++ b/cmd/sidekick-tui/main.go @@ -245,7 +245,7 @@ func (m model) renderMessage(msg sidekick.Message) string { if m.renderer != nil { if reasoning != "" { if r, err := m.renderer.Render(m.formatReasoning(reasoning)); err == nil { - reasoning = strings.TrimSpace(r) + "\n" + reasoning = strings.TrimSpace(r) + "\n\n" } } if content != "" { @@ -281,7 +281,7 @@ func (m *model) updateViewportContent() { if m.renderer != nil { if reasoning != "" { if r, err := m.renderer.Render(m.formatReasoning(reasoning)); err == nil { - reasoning = strings.TrimSpace(r) + "\n" + reasoning = strings.TrimSpace(r) + "\n\n" } } if content != "" { diff --git a/cmd/sidekick-tui/repro_test.go b/cmd/sidekick-tui/repro_test.go new file mode 100644 index 0000000..3bf63da --- /dev/null +++ b/cmd/sidekick-tui/repro_test.go @@ -0,0 +1,61 @@ +package main + +import ( + "strings" + "testing" + + "github.com/charmbracelet/glamour" + "sidekick" +) + +func TestRenderMessageNewlines(t *testing.T) { + r, _ := glamour.NewTermRenderer( + glamour.WithStandardStyle("dark"), + glamour.WithWordWrap(80), + ) + m := model{renderer: r} + + msg := sidekick.Message{ + Role: sidekick.MessageRoleUser, + Content: "Line 1\nLine 2", + } + + rendered := m.renderMessage(msg) + if !strings.Contains(rendered, "Line 1") || !strings.Contains(rendered, "Line 2") { + t.Errorf("rendered message missing content: %s", rendered) + } + + // Check if newline is preserved. If squashed, it might be "Line 1 Line 2" + if strings.Contains(rendered, "Line 1 Line 2") { + t.Error("newlines were squashed in user message") + } +} + +func TestRenderMessageReasoningGap(t *testing.T) { + r, _ := glamour.NewTermRenderer( + glamour.WithStandardStyle("dark"), + glamour.WithWordWrap(80), + ) + m := model{renderer: r} + + msg := sidekick.Message{ + Role: sidekick.MessageRoleAssistant, + Reasoning: "Thinking about it", + Content: "Actual response", + } + + rendered := m.renderMessage(msg) + // Check if there is a gap between Thinking and Response + + if !strings.Contains(rendered, "Thinking") || !strings.Contains(rendered, "Actual") || !strings.Contains(rendered, "response") { + t.Errorf("rendered message missing content: %s", rendered) + } + + // If there's no blank line between reasoning and content, they might be too close. + // We want to see if they are on adjacent lines or have a gap. + // The user says "next one begins immediately while it should start from a new line" + // This might mean it's on the SAME line if glamour messed up, or just next line. + + // Let's print it to see + t.Logf("Rendered Assistant:\n%s", rendered) +}