okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

nekomimi.pettui: ctrl-click a path in the transcript to open it in an editorcc6ab84

main
3.0 KiB91 linesraw
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.
11	var sid string
12	var forward bool
13	switch sm := msg.(type) {
14	case ChatOlderLoadedMsg:
15		sid, forward = sm.SessionID, true
16	case ChatWindowMsg:
17		sid, forward = sm.SessionID, true
18	case ChatEditorFinishedMsg:
19		sid, forward = sm.SessionID, true
20	case FileOpenResultMsg:
21		sid, forward = sm.SessionID, true
22	case ChatClearCopyStatusMsg:
23		sid, forward = sm.SessionID, true
24	case ChatStatusPollMsg:
25		sid, forward = sm.SessionID, true
26	case ChatCacheFadeMsg:
27		sid, forward = sm.SessionID, true
28	case ChatProgressTickMsg:
29		// a tick dropped under a modal would leave the face frozen for good
30		sid, forward = sm.SessionID, true
31	case ChatLiveDrawMsg:
32		sid, forward = sm.SessionID, true
33	case ChatStatusMsg:
34		sid, forward = sm.SessionID, true
35	case ChatStreamResultMsg:
36		sid, forward = sm.SessionID, true
37	case ChatStreamClosedMsg:
38		sid, forward = sm.SessionID, true
39	case ChatInterruptMsg:
40		sid, forward = sm.SessionID, true
41	case ClipboardImagePastedMsg:
42		sid, forward = sm.SessionID, true
43	case terminalClipboardTimeoutMsg:
44		sid, forward = sm.SessionID, true
45	case terminalClipboardProbeTimeoutMsg:
46		sid, forward = sm.SessionID, true
47	case tea.ModeReportMsg:
48		sid, forward = m.Chat.SessionID, sm.Mode == kittyClipboardMode
49	case uv.UnknownOscEvent:
50		sid, forward = m.Chat.SessionID, true
51	case ChatStreamEventMsg:
52		sid, forward = sm.SessionID, true
53		if m.ActiveSession != nil && sid == m.ActiveSession.ID && sm.Generation == m.Chat.Generation && sm.Event.Snapshot != nil {
54			captured := *sm.Event.Snapshot
55			m.updateSession(captured)
56		}
57		if m.ActiveSession != nil && sid == m.ActiveSession.ID && sm.Generation == m.Chat.Generation && sm.Event.Type == daemon.EventUser && !sm.Event.Replayed {
58			m.ClearNotices()
59		}
60	case ChatOperationPollMsg:
61		sid, forward = sm.SessionID, true
62	case ChatOperationResolvedMsg:
63		sid, forward = sm.SessionID, true
64	case ChatTurnSentMsg:
65		sid, forward = sm.SessionID, true
66		if m.ActiveSession != nil && sid == m.ActiveSession.ID && sm.Err == nil {
67			m.ClearNotices()
68		}
69	}
70	if forward {
71		var cmd tea.Cmd
72		if m.ActiveSession != nil && sid == m.ActiveSession.ID {
73			m.Chat, cmd = m.Chat.Update(msg)
74		}
75		if event, ok := msg.(ChatStreamEventMsg); ok && event.SessionID == m.Chat.SessionID && event.Generation == m.Chat.Generation && event.Event.Type == daemon.EventReset {
76			cmd = tea.Batch(cmd, m.refreshSettingsCmd())
77		}
78		if event, ok := msg.(ChatStreamEventMsg); ok && event.SessionID == m.Chat.SessionID && event.Generation == m.Chat.Generation && !event.Event.Replayed && event.Event.Invalidation != nil {
79			if event.Event.Invalidation.Catalog {
80				m.CatalogGen++
81				cmd = tea.Batch(cmd, m.loadCommandCatalogCmd(m.CatalogGen))
82			}
83			if event.Event.Invalidation.Settings {
84				cmd = tea.Batch(cmd, m.refreshSettingsCmd())
85			}
86		}
87		return cmd, true
88	}
89
90	return nil, false
91}