File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -100,6 +100,7 @@ type tuiModel struct {
100100 cancelThinking context.CancelFunc
101101 showHelp bool
102102 animationFrame int
103+ updateNotice string
103104
104105 isStreaming bool
105106 streamingMessageID string
@@ -615,11 +616,7 @@ func (m *tuiModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
615616 }
616617
617618 case updateNotice :
618- m .messages = append (m .messages , ChatMessage {
619- Role : "system" ,
620- Content : fmt .Sprintf ("Update available: %s. Run `ponos upgrade` to update." , msg .latest ),
621- Timestamp : time .Now (),
622- })
619+ m .updateNotice = msg .latest
623620 m .updateViewportContent ()
624621
625622 case tea.Msg :
@@ -692,6 +689,9 @@ func (m *tuiModel) View() string {
692689 sections = append (sections , m .textarea .View ())
693690
694691 leftHelp := "/help for help and / to see available commands"
692+ if m .updateNotice != "" {
693+ leftHelp = fmt .Sprintf ("Update available: %s (run `ponos upgrade`) • %s" , m .updateNotice , leftHelp )
694+ }
695695 rightHelp := "⌘P to generate a command to know what ponos can do for you"
696696 if m .loading {
697697 indicator := m .getAnimatedIndicator ()
Original file line number Diff line number Diff line change 44 "encoding/json"
55 "net/http"
66 "os"
7+ "strconv"
78 "strings"
89 "time"
910
@@ -25,10 +26,50 @@ func (tui *PonosAgentTUI) checkForUpdates(program *tea.Program) {
2526 if err != nil || latest == "" {
2627 return
2728 }
28- if latest == version {
29- return
29+ if isNewerVersion (version , latest ) {
30+ program .Send (updateNotice {latest : latest })
31+ }
32+ }
33+
34+ func isNewerVersion (current , latest string ) bool {
35+ currentParts , ok := parseSemver (current )
36+ if ! ok {
37+ return false
38+ }
39+ latestParts , ok := parseSemver (latest )
40+ if ! ok {
41+ return false
42+ }
43+ for i := 0 ; i < 3 ; i ++ {
44+ if latestParts [i ] > currentParts [i ] {
45+ return true
46+ }
47+ if latestParts [i ] < currentParts [i ] {
48+ return false
49+ }
50+ }
51+ return false
52+ }
53+
54+ func parseSemver (value string ) ([3 ]int , bool ) {
55+ var out [3 ]int
56+ clean := strings .TrimPrefix (strings .TrimSpace (value ), "v" )
57+ parts := strings .Split (clean , "." )
58+ if len (parts ) < 3 {
59+ return out , false
60+ }
61+ for i := 0 ; i < 3 ; i ++ {
62+ part := parts [i ]
63+ if dash := strings .Index (part , "-" ); dash >= 0 {
64+ part = part [:dash ]
65+ }
66+ n , err := strconv .Atoi (part )
67+ if err != nil {
68+ return out , false
69+ }
70+ out [i ] = n
3071 }
31- program . Send ( updateNotice { latest : latest })
72+ return out , true
3273}
3374
3475func fetchLatestTag () (string , error ) {
Original file line number Diff line number Diff line change @@ -300,5 +300,8 @@ func replaceBinary(targetPath, newBinaryPath string) error {
300300 return fmt .Errorf ("failed to write temp binary: %w" , err )
301301 }
302302
303- return os .Rename (tmpName , targetPath )
303+ if err := os .Rename (tmpName , targetPath ); err != nil {
304+ return err
305+ }
306+ return os .Chmod (targetPath , 0o755 )
304307}
You can’t perform that action at this time.
0 commit comments