@@ -2,6 +2,8 @@ package chat
22
33import (
44 "context"
5+ "fmt"
6+ "os"
57
68 "github.com/atotto/clipboard"
79 "github.com/charmbracelet/bubbles/v2/help"
@@ -36,6 +38,7 @@ type Page interface {
3638 layout.Help
3739 CompactSession () tea.Cmd
3840 CopySessionToClipboard () tea.Cmd
41+ Cleanup ()
3942}
4043
4144// chatPage implements Page
@@ -153,6 +156,8 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
153156 p .msgCancel ()
154157 p .msgCancel = nil
155158 }
159+ // Stop progress bar if active
160+ p .stopProgressBar ()
156161 return p , nil
157162 }
158163
@@ -193,6 +198,7 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
193198 case * runtime.StreamStartedEvent :
194199 spinnerCmd := p .setWorking (true )
195200 cmd := p .messages .AddAssistantMessage ()
201+ p .startProgressBar ()
196202 return p , tea .Batch (cmd , p .messages .ScrollToBottom (), spinnerCmd )
197203 case * runtime.AgentChoiceEvent :
198204 cmd := p .messages .AppendToLastMessage (msg .AgentName , types .MessageTypeAssistant , msg .Content )
@@ -216,6 +222,7 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
216222 if p .msgCancel != nil {
217223 p .msgCancel = nil
218224 }
225+ p .stopProgressBar ()
219226 return p , tea .Batch (cmd , p .messages .ScrollToBottom (), spinnerCmd )
220227 case * runtime.PartialToolCallEvent :
221228 // When we first receive a tool call, show it immediately in pending state
@@ -455,3 +462,16 @@ func (p *chatPage) CompactSession() tea.Cmd {
455462
456463 return p .messages .ScrollToBottom ()
457464}
465+
466+ func (p * chatPage ) Cleanup () {
467+ p .stopProgressBar ()
468+ }
469+
470+ // See: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
471+ func (p * chatPage ) startProgressBar () {
472+ fmt .Fprint (os .Stderr , "\x1b ]9;4;3;0\x1b \\ " )
473+ }
474+
475+ func (p * chatPage ) stopProgressBar () {
476+ fmt .Fprint (os .Stderr , "\x1b ]9;4;0;0\x1b \\ " )
477+ }
0 commit comments