diff --git a/shell/tui/adapter.go b/shell/tui/adapter.go index fd7248b..72264e3 100644 --- a/shell/tui/adapter.go +++ b/shell/tui/adapter.go @@ -4,8 +4,10 @@ package tui import ( "fmt" + "os" "os/exec" "strings" + "syscall" "time" tea "github.com/charmbracelet/bubbletea" @@ -140,13 +142,28 @@ func (a *Adapter) disableAgent(id string) tea.Cmd { func (a *Adapter) restartAgent(id string) tea.Cmd { return func() tea.Msg { - _ = a.mgr.StopUnified() - time.Sleep(500 * time.Millisecond) - err := a.mgr.StartUnified() - if err == nil { + pid := a.mgr.UnifiedPID() + if pid <= 0 { + // Launcher not running — fall back to full restart. + _ = a.mgr.StopUnified() time.Sleep(500 * time.Millisecond) + err := a.mgr.StartUnified() + if err == nil { + time.Sleep(500 * time.Millisecond) + } + return puretui.MsgActionDone{AgentID: id, Action: "Restart", Err: err} } - return puretui.MsgActionDone{AgentID: id, Action: "Restart", Err: err} + + // Launcher is running — write target and send SIGHUP for hot-reload. + if id != "" { + _ = os.WriteFile("run/reload.txt", []byte(id), 0o644) + } + err := syscall.Kill(pid, syscall.SIGHUP) + if err != nil { + return puretui.MsgActionDone{AgentID: id, Action: "Restart", Err: err} + } + time.Sleep(1 * time.Second) + return puretui.MsgActionDone{AgentID: id, Action: "Restart", Err: nil} } }