okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
78011da
main
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 { 12var keys []tea.Msg 13for _ ,r := range text { 14keys = append (keys , tea.KeyPressMsg {Code :r ,Text :string (r )}) 15 } 16return keys 17} 18 19func treeModel (width ,height int )TreePickerModel { 20m := NewTreePickerModel (nil ,"s" ) 21m .SetSize (width ,height ) 22m ,_ = 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 }}) 29return m 30} 31 32func treeShot (keys ... tea.Msg )func (width ,height int )string { 33return func (width ,height int )string { 34m := treeModel (width ,height ) 35for _ ,key := range keys { 36m ,_ = m .Update (key ) 37 } 38return m .View () 39 } 40} 41 42func init () { 43enter := tea.KeyPressMsg {Code :tea .KeyEnter } 44down := tea.KeyPressMsg {Code :tea .KeyDown } 45registerShots ("tree" , 46shotState {"list" ,treeShot (down )}, 47shotState {"filtering" ,treeShot (shotTyped ("retry" )... )}, 48shotState {"no-match" ,treeShot (shotTyped ("zzz" )... )}, 49shotState {"confirm-branch" ,treeShot (enter )}, 50shotState {"branching" ,treeShot (enter ,enter )}, 51shotState {"branch-failed" ,func (width ,height int )string { 52m := treeModel (width ,height ) 53m ,_ = m .Update (enter ) 54m ,_ = m .Update (enter ) 55m ,_ = m .Update (treeForkedMsg {Gen :m .Generation ,Err :errors .New ("the daemon refused the branch" )}) 56return m .View () 57 }}, 58shotState {"loading" ,func (width ,height int )string { 59m := NewTreePickerModel (nil ,"s" ) 60m .SetSize (width ,height ) 61return m .View () 62 }}, 63shotState {"empty" ,func (width ,height int )string { 64m := NewTreePickerModel (nil ,"s" ) 65m .SetSize (width ,height ) 66m ,_ = m .Update (treeLoadedMsg {Gen :m .Generation }) 67return m .View () 68 }}, 69shotState {"load-failed" ,func (width ,height int )string { 70m := NewTreePickerModel (nil ,"s" ) 71m .SetSize (width ,height ) 72m ,_ = m .Update (treeLoadedMsg {Gen :m .Generation ,Err :errors .New ("daemon connection unavailable" )}) 73return m .View () 74 }}, 75 ) 76}