okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
cc6ab84
main
1package tui 2 3import ( 4"albedo/cli/internal/daemon" 5 tea"charm.land/bubbletea/v2" 6 uv"github.com/charmbracelet/ultraviolet" 7) 8 9func (m * AppModel )handleChatLifecycle (msg tea.Msg ) (tea.Cmd ,bool ) { 10// First: forward chat lifecycle messages even while a modal is open. 11var sid string 12var forward bool 13switch sm := msg .(type ) { 14case ChatOlderLoadedMsg : 15sid ,forward = sm .SessionID ,true 16case ChatWindowMsg : 17sid ,forward = sm .SessionID ,true 18case ChatEditorFinishedMsg : 19sid ,forward = sm .SessionID ,true 20case FileOpenResultMsg : 21sid ,forward = sm .SessionID ,true 22case ChatClearCopyStatusMsg : 23sid ,forward = sm .SessionID ,true 24case ChatStatusPollMsg : 25sid ,forward = sm .SessionID ,true 26case ChatCacheFadeMsg : 27sid ,forward = sm .SessionID ,true 28case ChatProgressTickMsg : 29// a tick dropped under a modal would leave the face frozen for good 30sid ,forward = sm .SessionID ,true 31case ChatLiveDrawMsg : 32sid ,forward = sm .SessionID ,true 33case ChatStatusMsg : 34sid ,forward = sm .SessionID ,true 35case ChatStreamResultMsg : 36sid ,forward = sm .SessionID ,true 37case ChatStreamClosedMsg : 38sid ,forward = sm .SessionID ,true 39case ChatInterruptMsg : 40sid ,forward = sm .SessionID ,true 41case ClipboardImagePastedMsg : 42sid ,forward = sm .SessionID ,true 43case terminalClipboardTimeoutMsg : 44sid ,forward = sm .SessionID ,true 45case terminalClipboardProbeTimeoutMsg : 46sid ,forward = sm .SessionID ,true 47case tea.ModeReportMsg : 48sid ,forward = m .Chat .SessionID ,sm .Mode == kittyClipboardMode 49case uv.UnknownOscEvent : 50sid ,forward = m .Chat .SessionID ,true 51case ChatStreamEventMsg : 52sid ,forward = sm .SessionID ,true 53if m .ActiveSession != nil && sid == m .ActiveSession .ID && sm .Generation == m .Chat .Generation && sm .Event .Snapshot != nil { 54captured := * sm .Event .Snapshot 55m .updateSession (captured ) 56 } 57if m .ActiveSession != nil && sid == m .ActiveSession .ID && sm .Generation == m .Chat .Generation && sm .Event .Type == daemon .EventUser && ! sm .Event .Replayed { 58m .ClearNotices () 59 } 60case ChatOperationPollMsg : 61sid ,forward = sm .SessionID ,true 62case ChatOperationResolvedMsg : 63sid ,forward = sm .SessionID ,true 64case ChatTurnSentMsg : 65sid ,forward = sm .SessionID ,true 66if m .ActiveSession != nil && sid == m .ActiveSession .ID && sm .Err == nil { 67m .ClearNotices () 68 } 69 } 70if forward { 71var cmd tea.Cmd 72if m .ActiveSession != nil && sid == m .ActiveSession .ID { 73m .Chat ,cmd = m .Chat .Update (msg ) 74 } 75if event ,ok := msg .(ChatStreamEventMsg );ok && event .SessionID == m .Chat .SessionID && event .Generation == m .Chat .Generation && event .Event .Type == daemon .EventReset { 76cmd = tea .Batch (cmd ,m .refreshSettingsCmd ()) 77 } 78if event ,ok := msg .(ChatStreamEventMsg );ok && event .SessionID == m .Chat .SessionID && event .Generation == m .Chat .Generation && ! event .Event .Replayed && event .Event .Invalidation != nil { 79if event .Event .Invalidation .Catalog { 80m .CatalogGen ++ 81cmd = tea .Batch (cmd ,m .loadCommandCatalogCmd (m .CatalogGen )) 82 } 83if event .Event .Invalidation .Settings { 84cmd = tea .Batch (cmd ,m .refreshSettingsCmd ()) 85 } 86 } 87return cmd ,true 88 } 89 90return nil ,false 91}