Skip to content

Commit d5cf1a7

Browse files
authored
Merge pull request #45 from blockopsnetwork/chore/update-tui-upgrade-display
Update tui upgrade display
2 parents a4b3ded + 9ec2331 commit d5cf1a7

3 files changed

Lines changed: 53 additions & 9 deletions

File tree

cmd/tui.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff 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()

cmd/update_check.go

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
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

3475
func fetchLatestTag() (string, error) {

cmd/upgrade.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff 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
}

0 commit comments

Comments
 (0)