fix: honor rig agent when starting witness/refinery
This commit is contained in:
@@ -371,7 +371,7 @@ func ensureRefinerySession(rigName string, r *rig.Rig) (bool, error) {
|
||||
|
||||
// Launch Claude directly (no respawn loop - daemon handles restart)
|
||||
// Export GT_ROLE and BD_ACTOR in the command since tmux SetEnvironment only affects new panes
|
||||
if err := t.SendKeys(sessionName, config.BuildAgentStartupCommand("refinery", bdActor, "", "")); err != nil {
|
||||
if err := t.SendKeys(sessionName, config.BuildAgentStartupCommand("refinery", bdActor, r.Path, "")); err != nil {
|
||||
return false, fmt.Errorf("sending command: %w", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -1118,6 +1118,53 @@ func TestBuildCrewStartupCommandWithAgentOverride(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildStartupCommand_UsesRigAgentWhenRigPathProvided(t *testing.T) {
|
||||
townRoot := t.TempDir()
|
||||
rigPath := filepath.Join(townRoot, "testrig")
|
||||
|
||||
townSettings := NewTownSettings()
|
||||
townSettings.DefaultAgent = "gemini"
|
||||
if err := SaveTownSettings(TownSettingsPath(townRoot), townSettings); err != nil {
|
||||
t.Fatalf("SaveTownSettings: %v", err)
|
||||
}
|
||||
|
||||
rigSettings := NewRigSettings()
|
||||
rigSettings.Agent = "codex"
|
||||
if err := SaveRigSettings(RigSettingsPath(rigPath), rigSettings); err != nil {
|
||||
t.Fatalf("SaveRigSettings: %v", err)
|
||||
}
|
||||
|
||||
cmd := BuildStartupCommand(map[string]string{"GT_ROLE": "witness"}, rigPath, "")
|
||||
if !strings.Contains(cmd, "codex") {
|
||||
t.Fatalf("expected rig agent (codex) in command: %q", cmd)
|
||||
}
|
||||
if strings.Contains(cmd, "gemini --approval-mode yolo") {
|
||||
t.Fatalf("did not expect town default agent in command: %q", cmd)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetRuntimeCommand_UsesRigAgentWhenRigPathProvided(t *testing.T) {
|
||||
townRoot := t.TempDir()
|
||||
rigPath := filepath.Join(townRoot, "testrig")
|
||||
|
||||
townSettings := NewTownSettings()
|
||||
townSettings.DefaultAgent = "gemini"
|
||||
if err := SaveTownSettings(TownSettingsPath(townRoot), townSettings); err != nil {
|
||||
t.Fatalf("SaveTownSettings: %v", err)
|
||||
}
|
||||
|
||||
rigSettings := NewRigSettings()
|
||||
rigSettings.Agent = "codex"
|
||||
if err := SaveRigSettings(RigSettingsPath(rigPath), rigSettings); err != nil {
|
||||
t.Fatalf("SaveRigSettings: %v", err)
|
||||
}
|
||||
|
||||
cmd := GetRuntimeCommand(rigPath)
|
||||
if !strings.HasPrefix(cmd, "codex") {
|
||||
t.Fatalf("GetRuntimeCommand() = %q, want prefix %q", cmd, "codex")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadRuntimeConfigFromSettings(t *testing.T) {
|
||||
// Create temp rig with custom runtime config
|
||||
dir := t.TempDir()
|
||||
|
||||
@@ -436,12 +436,17 @@ func (d *Daemon) getStartCommand(roleConfig *beads.RoleConfig, parsed *ParsedIde
|
||||
return beads.ExpandRolePattern(roleConfig.StartCommand, d.config.TownRoot, parsed.RigName, parsed.AgentName, parsed.RoleType)
|
||||
}
|
||||
|
||||
rigPath := ""
|
||||
if parsed != nil && parsed.RigName != "" {
|
||||
rigPath = filepath.Join(d.config.TownRoot, parsed.RigName)
|
||||
}
|
||||
|
||||
// Default command for all agents - use runtime config
|
||||
defaultCmd := "exec " + config.GetRuntimeCommand("")
|
||||
defaultCmd := "exec " + config.GetRuntimeCommand(rigPath)
|
||||
|
||||
// Polecats need environment variables set in the command
|
||||
if parsed.RoleType == "polecat" {
|
||||
return config.BuildPolecatStartupCommand(parsed.RigName, parsed.AgentName, "", "")
|
||||
return config.BuildPolecatStartupCommand(parsed.RigName, parsed.AgentName, rigPath, "")
|
||||
}
|
||||
|
||||
return defaultCmd
|
||||
@@ -972,4 +977,3 @@ Action needed: Either restart the agent or reassign the work.`,
|
||||
d.logger.Printf("Notified %s of orphaned work for %s", witnessAddr, agentID)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -205,7 +205,7 @@ func (m *Manager) Start(foreground bool) error {
|
||||
// NOTE: No gt prime injection needed - SessionStart hook handles it automatically
|
||||
// Restarts are handled by daemon via LIFECYCLE mail, not shell loops
|
||||
// Export GT_ROLE and BD_ACTOR in the command since tmux SetEnvironment only affects new panes
|
||||
command := config.BuildAgentStartupCommand("refinery", bdActor, "", "")
|
||||
command := config.BuildAgentStartupCommand("refinery", bdActor, m.rig.Path, "")
|
||||
if err := t.SendKeys(sessionID, command); err != nil {
|
||||
// Clean up the session on failure (best-effort cleanup)
|
||||
_ = t.KillSession(sessionID)
|
||||
@@ -566,7 +566,6 @@ func (m *Manager) pushWithRetry(targetBranch string, config MergeConfig) error {
|
||||
return fmt.Errorf("push failed after %d retries: %v", config.PushRetryCount, lastErr)
|
||||
}
|
||||
|
||||
|
||||
// formatAge formats a duration since the given time.
|
||||
func formatAge(t time.Time) string {
|
||||
d := time.Since(t)
|
||||
|
||||
Reference in New Issue
Block a user