11package cmd
22
33import (
4- "context"
54 "fmt"
65 "math/rand"
76 "os"
@@ -55,28 +54,30 @@ func (m *chatModel) handleSessionCommand(cmd string, parts []string, text string
5554 return m , tea .Quit
5655
5756 case "/clear" :
57+ if m .manualCompacting {
58+ return m .cancelManualCompact ("Compaction cancelled." )
59+ }
5860 // Cancel any running /loop goroutine.
5961 if m .loopCancel != nil {
6062 m .loopCancel ()
6163 m .loopCancel = nil
6264 }
63- m .messages = nil
64- m .messages = append (m .messages , displayMsg {role : "system" , content : "Conversation cleared." })
65+ m .messages = []displayMsg {{role : "system" , content : "Conversation cleared." }}
66+ m .viewDirty = true
67+ m .autoScroll = false
6568 return m , nil
6669
6770 case "/compact" :
68- before := m .session .MessageCount ()
69- strat , tokBefore , tokAfter , err := m .session .CompactConversation (context .Background ())
70- after := m .session .MessageCount ()
71- msg := fmt .Sprintf ("Compacted (%s): %d → %d messages, ~%dk → ~%dk tokens" , strat , before , after , tokBefore / 1000 , tokAfter / 1000 )
72- if err != nil {
73- msg = fmt .Sprintf ("Compacted with fallback: %d → %d messages" , before , after )
71+ if m .manualCompacting {
72+ return m .cancelManualCompact ("Compaction cancelled." )
7473 }
75- m .messages = append (m .messages , displayMsg {role : "system" , content : msg })
76- m .compacting = false
77- m .brailleSpinner .SetLabel (m .spinnerVerb )
78- m .invalidateConnStatus ()
79- return m , nil
74+ if m .waiting {
75+ m .messages = append (m .messages , displayMsg {role : "system" , content : "Wait for the current response to finish, then run /compact." })
76+ m .viewDirty = true
77+ m .updateViewportContent ()
78+ return m , nil
79+ }
80+ return m .startManualCompact ()
8081
8182 case "/history" :
8283 entries , err := session .List ()
@@ -105,7 +106,7 @@ func (m *chatModel) handleSessionCommand(cmd string, parts []string, text string
105106 return m , nil
106107 }
107108 m .sessionID = s .ID
108- m .messages = nil
109+ m .messages = [] displayMsg {{ role : "welcome" , content : m . welcomeCache }}
109110 var msgs []client.EyrieMessage
110111 for _ , sm := range s .Messages {
111112 em := client.EyrieMessage {Role : sm .Role , Content : sm .Content }
@@ -123,6 +124,8 @@ func (m *chatModel) handleSessionCommand(cmd string, parts []string, text string
123124 }
124125 m .session .LoadMessages (msgs )
125126 m .messages = append (m .messages , displayMsg {role : "system" , content : fmt .Sprintf ("Recovered: %s\n Session %s ready (%d msgs)" , note , s .ID , len (s .Messages ))})
127+ m .viewDirty = true
128+ m .autoScroll = false
126129 return m , nil
127130 }
128131 // List candidates
@@ -151,7 +154,7 @@ func (m *chatModel) handleSessionCommand(cmd string, parts []string, text string
151154 return m , nil
152155 }
153156 m .sessionID = saved .ID
154- m .messages = nil
157+ m .messages = [] displayMsg {{ role : "welcome" , content : m . welcomeCache }}
155158 var msgs []client.EyrieMessage
156159 for _ , sm := range saved .Messages {
157160 em := client.EyrieMessage {Role : sm .Role , Content : sm .Content }
@@ -169,6 +172,8 @@ func (m *chatModel) handleSessionCommand(cmd string, parts []string, text string
169172 }
170173 m .session .LoadMessages (msgs )
171174 m .messages = append (m .messages , displayMsg {role : "system" , content : fmt .Sprintf ("Resumed session %s" , saved .ID )})
175+ m .viewDirty = true
176+ m .autoScroll = false
172177 return m , nil
173178
174179 case "/fork" :
0 commit comments