okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
4db295e
main
1package tui 2 3import ( 4"errors" 5 6 tea"charm.land/bubbletea/v2" 7) 8 9func init () { 10enter := tea.KeyPressMsg {Code :tea .KeyEnter } 11shiftEnter := tea.KeyPressMsg {Code :tea .KeyEnter ,Mod :tea .ModShift } 12down := tea.KeyPressMsg {Code :tea .KeyDown } 13typed := func (text string ) []tea.Msg { 14var keys []tea.Msg 15for _ ,r := range text { 16keys = append (keys , tea.KeyPressMsg {Code :r ,Text :string (r )}) 17 } 18return keys 19 } 20registerShots ("extensions" , 21shotState {"list" ,extensionsShot (nil )}, 22shotState {"filtering" ,extensionsShot (nil ,typed ("bs" )... )}, 23shotState {"no-match" ,extensionsShot (nil ,typed ("zzz" )... )}, 24shotState {"quarantined" ,extensionsShot (nil ,down ,down ,down )}, 25shotState {"confirm-global" ,extensionsShot (nil ,enter )}, 26shotState {"confirm-session" ,extensionsShot (nil ,shiftEnter )}, 27shotState {"confirm-follow-global" ,extensionsShot (nil , tea.KeyPressMsg {Code :'x' ,Mod :tea .ModCtrl })}, 28shotState {"saving" ,extensionsShot (nil ,shiftEnter ,enter )}, 29shotState {"save-failed" ,func (w ,h int )string { 30m := extensionsModel (w ,h ,nil ) 31m ,_ = m .Update (shiftEnter ) 32m ,_ = m .Update (enter ) 33m ,_ = m .Update (extensionToggledMsg {Gen :m .Generation ,Err :errors .New ("daemon refused the change" )}) 34return m .View () 35 }}, 36shotState {"notice" ,extensionsShot (func (m * ExtensionPickerModel ) { 37m .Notice = "Saved the global default. Reload sessions to apply it." 38 })}, 39shotState {"loading" ,func (w ,h int )string { 40m := NewExtensionPickerModel (nil ,"s" ) 41m .SetSize (w ,h ) 42return m .View () 43 }}, 44shotState {"empty" ,func (w ,h int )string { 45m := NewExtensionPickerModel (nil ,"s" ) 46m .SetSize (w ,h ) 47m ,_ = m .Update (extensionsLoadedMsg {Gen :m .Generation }) 48return m .View () 49 }}, 50shotState {"load-failed" ,func (w ,h int )string { 51m := NewExtensionPickerModel (nil ,"s" ) 52m .SetSize (w ,h ) 53m ,_ = m .Update (extensionsLoadedMsg {Gen :m .Generation ,Err :errors .New ("daemon connection unavailable" )}) 54return m .View () 55 }}, 56 ) 57} 58 59func extensionsModel (width ,height int ,setup func (* ExtensionPickerModel ))ExtensionPickerModel { 60m := NewExtensionPickerModel (nil ,"s" ) 61m .SetSize (width ,height ) 62m ,_ = m .Update (extensionsLoadedMsg {Gen :m .Generation ,Extensions : []ExtensionItem { 63 {Name :"view" ,Description :"show the model its changes as highlighted images" ,Enabled :true ,Overridden :true ,Plugins : []string {"tool" },Tools : []string {"view_diff" }}, 64 {Name :"bash" ,Description :"run shell commands" ,Enabled :true ,GlobalEnabled :true ,Plugins : []string {"tool" ,"context" },Context :true }, 65 {Name :"webhooks" ,Description :"signed inbound requests wake a session" }, 66 {Name :"mcp" ,Description :"tool servers" ,GlobalEnabled :true ,Quarantined :"failed to start" }, 67 }}) 68if setup != nil { 69setup (& m ) 70 } 71return m 72} 73 74func extensionsShot (setup func (* ExtensionPickerModel ),keys ... tea.Msg )func (width ,height int )string { 75return func (width ,height int )string { 76m := extensionsModel (width ,height ,setup ) 77for _ ,key := range keys { 78m ,_ = m .Update (key ) 79 } 80return m .View () 81 } 82}