interactive: trim trailing blanks after the last conversation row
Build() emits a trailing blank after every message, so the final assistant reply (and any optional addendum like /help, the OK line, or extension notes) ended its block with one blank row. After we added a leading blank above the status block, that gave a doubled gap between the last conversation row and the status. Strip trailing blank rows from the assembled chat slice once every optional addition has been appended, so the conversation sits flush against the single leading blank of the status block.
- commit
- 38717f516d0b761a0d9bf30f3f9f086e7a49dd36
- author
- patriceckhart · · 2026-04-28 07:18 UTC
- parent
- 0a670c0
- signature
- unsigned
- refs
- tag: v0.1.36
1 file · +10 -0
M internal/agent/modes/interactive.go +10 -0
| @@ -687,6 +687,16 @@ func (i *Interactive) redraw() { | |||
| 687 | 687 | chat = append(chat, "") | |
| 688 | 688 | } | |
| 689 | 689 | ||
| 690 | + | // Strip trailing blank rows so the chat content sits flush | |
| 691 | + | // against the new "blank above status bar" row added by the | |
| 692 | + | // bottom-region assembly. Build() ends every message with a | |
| 693 | + | // blank separator; without this trim, the final message in | |
| 694 | + | // the transcript would have its own trailing blank plus the | |
| 695 | + | // status block's leading blank, doubling the gap. | |
| 696 | + | for len(chat) > 0 && strings.TrimSpace(chat[len(chat)-1]) == "" { | |
| 697 | + | chat = chat[:len(chat)-1] | |
| 698 | + | } | |
| 699 | + | ||
| 690 | 700 | // Dialogs (login or model picker) render between chat and the editor. | |
| 691 | 701 | var dialog []string | |
| 692 | 702 | switch { | |
| @@ -687,6 +687,16 @@ func (i *Interactive) redraw() { | |||||
| 687 | chat = append(chat, "") | 687 | chat = append(chat, "") | ||
| 688 | } | 688 | } | ||
| 689 | 689 | ||||
| 690 | + | // Strip trailing blank rows so the chat content sits flush | |||
| 691 | + | // against the new "blank above status bar" row added by the | |||
| 692 | + | // bottom-region assembly. Build() ends every message with a | |||
| 693 | + | // blank separator; without this trim, the final message in | |||
| 694 | + | // the transcript would have its own trailing blank plus the | |||
| 695 | + | // status block's leading blank, doubling the gap. | |||
| 696 | + | for len(chat) > 0 && strings.TrimSpace(chat[len(chat)-1]) == "" { | |||
| 697 | + | chat = chat[:len(chat)-1] | |||
| 698 | + | } | |||
| 699 | + | ||||
| 690 | // Dialogs (login or model picker) render between chat and the editor. | 700 | // Dialogs (login or model picker) render between chat and the editor. | ||
| 691 | var dialog []string | 701 | var dialog []string | ||
| 692 | switch { | 702 | switch { | ||