fix(witness): Kill tmux session on Stop()
The witness manager's Stop() method was only updating runtime JSON state without killing the tmux session, causing 'gt rig shutdown' to leave witness sessions running. Added sessionName() method and tmux kill-session logic to match the refinery's existing implementation. Fixes: bd-gxaf 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,11 +2,13 @@ package witness
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/steveyegge/gastown/internal/agent"
|
"github.com/steveyegge/gastown/internal/agent"
|
||||||
"github.com/steveyegge/gastown/internal/rig"
|
"github.com/steveyegge/gastown/internal/rig"
|
||||||
|
"github.com/steveyegge/gastown/internal/tmux"
|
||||||
"github.com/steveyegge/gastown/internal/util"
|
"github.com/steveyegge/gastown/internal/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -52,6 +54,11 @@ func (m *Manager) saveState(w *Witness) error {
|
|||||||
return m.stateManager.Save(w)
|
return m.stateManager.Save(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sessionName returns the tmux session name for this witness.
|
||||||
|
func (m *Manager) sessionName() string {
|
||||||
|
return fmt.Sprintf("gt-%s-witness", m.rig.Name)
|
||||||
|
}
|
||||||
|
|
||||||
// Status returns the current witness status.
|
// Status returns the current witness status.
|
||||||
// ZFC-compliant: trusts agent-reported state, no PID inference.
|
// ZFC-compliant: trusts agent-reported state, no PID inference.
|
||||||
// The daemon reads agent bead state for liveness checks.
|
// The daemon reads agent bead state for liveness checks.
|
||||||
@@ -95,12 +102,23 @@ func (m *Manager) Stop() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.State != StateRunning {
|
// Check if tmux session exists
|
||||||
|
t := tmux.NewTmux()
|
||||||
|
sessionID := m.sessionName()
|
||||||
|
sessionRunning, _ := t.HasSession(sessionID)
|
||||||
|
|
||||||
|
// If neither state nor session indicates running, it's not running
|
||||||
|
if w.State != StateRunning && !sessionRunning {
|
||||||
return ErrNotRunning
|
return ErrNotRunning
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kill tmux session if it exists (best-effort: may already be dead)
|
||||||
|
if sessionRunning {
|
||||||
|
_ = t.KillSession(sessionID)
|
||||||
|
}
|
||||||
|
|
||||||
// If we have a PID, try to stop it gracefully
|
// If we have a PID, try to stop it gracefully
|
||||||
if w.PID > 0 && w.PID != os.Getpid() {
|
if w.PID > 0 && w.PID != os.Getpid() && util.ProcessExists(w.PID) {
|
||||||
// Send SIGTERM (best-effort graceful stop)
|
// Send SIGTERM (best-effort graceful stop)
|
||||||
if proc, err := os.FindProcess(w.PID); err == nil {
|
if proc, err := os.FindProcess(w.PID); err == nil {
|
||||||
_ = proc.Signal(os.Interrupt)
|
_ = proc.Signal(os.Interrupt)
|
||||||
|
|||||||
Reference in New Issue
Block a user