okami.mom/albedo

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

dawntui: tree and context inspector on listView, shared confirm for agent delete78011da

main
2.3 KiB76 linesraw
1package tui
2
3import (
4	"albedo/cli/internal/daemon"
5	"errors"
6
7	tea "charm.land/bubbletea/v2"
8)
9
10// shotTyped is the key presses that type text into a filter.
11func shotTyped(text string) []tea.Msg {
12	var keys []tea.Msg
13	for _, r := range text {
14		keys = append(keys, tea.KeyPressMsg{Code: r, Text: string(r)})
15	}
16	return keys
17}
18
19func treeModel(width, height int) TreePickerModel {
20	m := NewTreePickerModel(nil, "s")
21	m.SetSize(width, height)
22	m, _ = m.Update(treeLoadedMsg{Gen: m.Generation, Items: []daemon.TreeCheckpoint{
23		{ID: "a", Type: "user", Preview: "add a retry to the webhook sender"},
24		{ID: "b", Type: "assistant", Preview: "I'll look at the sender first, then the queue it drains into."},
25		{ID: "c", Type: "user", Preview: "also the tests"},
26		{ID: "d", Type: "assistant", Preview: "done: retry with backoff, three attempts, tests pass"},
27		{ID: "e", Type: "user", Preview: "ship it"},
28	}})
29	return m
30}
31
32func treeShot(keys ...tea.Msg) func(width, height int) string {
33	return func(width, height int) string {
34		m := treeModel(width, height)
35		for _, key := range keys {
36			m, _ = m.Update(key)
37		}
38		return m.View()
39	}
40}
41
42func init() {
43	enter := tea.KeyPressMsg{Code: tea.KeyEnter}
44	down := tea.KeyPressMsg{Code: tea.KeyDown}
45	registerShots("tree",
46		shotState{"list", treeShot(down)},
47		shotState{"filtering", treeShot(shotTyped("retry")...)},
48		shotState{"no-match", treeShot(shotTyped("zzz")...)},
49		shotState{"confirm-branch", treeShot(enter)},
50		shotState{"branching", treeShot(enter, enter)},
51		shotState{"branch-failed", func(width, height int) string {
52			m := treeModel(width, height)
53			m, _ = m.Update(enter)
54			m, _ = m.Update(enter)
55			m, _ = m.Update(treeForkedMsg{Gen: m.Generation, Err: errors.New("the daemon refused the branch")})
56			return m.View()
57		}},
58		shotState{"loading", func(width, height int) string {
59			m := NewTreePickerModel(nil, "s")
60			m.SetSize(width, height)
61			return m.View()
62		}},
63		shotState{"empty", func(width, height int) string {
64			m := NewTreePickerModel(nil, "s")
65			m.SetSize(width, height)
66			m, _ = m.Update(treeLoadedMsg{Gen: m.Generation})
67			return m.View()
68		}},
69		shotState{"load-failed", func(width, height int) string {
70			m := NewTreePickerModel(nil, "s")
71			m.SetSize(width, height)
72			m, _ = m.Update(treeLoadedMsg{Gen: m.Generation, Err: errors.New("daemon connection unavailable")})
73			return m.View()
74		}},
75	)
76}