okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
0b9f48f
main
1package tui 2 3import ( 4"slices" 5"strings" 6 7"charm.land/lipgloss/v2" 8"github.com/charmbracelet/x/ansi" 9) 10 11// Effort choices come from the active model, not the command catalog's examples. 12func (m * ChatModel )openEffortSelector (levels []string ) { 13m .effortOptions = slices .Clone (levels ) 14m .effortSelected = max (0 ,slices .Index (levels ,m .Effort )) 15m .TextArea .Reset () 16m .syncLayout () 17} 18 19func (m ChatModel )effortSelectorView ()string { 20if len (m .effortOptions )== 0 { 21return "" 22 } 23width := m .chatWidth () 24selected := m .effortSelected 25// Keep the selected tier visible when the terminal cannot fit every tier. 26left ,right := 0 ,len (m .effortOptions ) 27label := func (i int )string { 28if i == selected { 29return " [" + m .effortOptions [i ]+ "] " 30 } 31return m .effortOptions [i ] 32 } 33plain := func ()string { 34parts := make ([]string ,0 ,right - left ) 35for i := left ;i < right ;i ++ { 36parts = append (parts ,label (i )) 37 } 38line := strings .Join (parts ," ─ " ) 39if left > 0 { 40line = "‹ " + line 41 } 42if right < len (m .effortOptions ) { 43line += " ›" 44 } 45return line 46 } 47for ansi .StringWidth (plain ())> width && right - left > 1 { 48if selected - left > right - 1 - selected { 49left ++ 50 }else { 51right -- 52 } 53 } 54parts := make ([]string ,0 ,right - left ) 55for i := left ;i < right ;i ++ { 56style := m .effortTierStyle (m .effortOptions [i ]) 57if i == selected { 58style = style .Inherit (DefaultStyles .Selected ).Bold (true ) 59 } 60parts = append (parts ,style .Render (label (i ))) 61 } 62decor := DefaultStyles .Decor .Render 63prefix ,suffix := "" ,"" 64if left > 0 { 65prefix = decor ("‹ " ) 66 } 67if right < len (m .effortOptions ) { 68suffix = decor (" ›" ) 69 } 70return ansi .Truncate (prefix + strings .Join (parts ,decor (" ─ " ))+ suffix ,width ,"" ) 71} 72 73func (m ChatModel )effortTierStyle (level string ) lipgloss.Style { 74switch level { 75case "low" : 76return DefaultStyles .EffortLow 77case "medium" : 78return DefaultStyles .EffortMedium 79case "high" : 80return DefaultStyles .EffortHigh 81case "xhigh" : 82return DefaultStyles .EffortXHigh 83case "max" : 84return DefaultStyles .EffortMax 85default : 86return DefaultStyles .Muted 87 } 88}