From b9f5797b9edf01a9f422d7bfc65f40fb045a18c8 Mon Sep 17 00:00:00 2001 From: aleiby Date: Wed, 21 Jan 2026 19:11:39 -0800 Subject: [PATCH] fix(refinery): use role-specific runtime config for startup (#756) (#847) Use ResolveRoleAgentConfig instead of LoadRuntimeConfig to properly resolve role-specific agent settings (like ready_prompt_prefix) when starting the refinery. This fixes timeout issues when role_agents.refinery is configured with a non-default agent. Also move AcceptBypassPermissionsWarning before WaitForRuntimeReady to avoid a race condition where the bypass dialog can block prompt detection. Co-authored-by: Claude Opus 4.5 --- internal/refinery/manager.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/refinery/manager.go b/internal/refinery/manager.go index b5bcbd8d..4159e0c5 100644 --- a/internal/refinery/manager.go +++ b/internal/refinery/manager.go @@ -128,13 +128,13 @@ func (m *Manager) Start(foreground bool, agentOverride string) error { // Ensure runtime settings exist in refinery/ (not refinery/rig/) so we don't // write into the source repo. Runtime walks up the tree to find settings. refineryParentDir := filepath.Join(m.rig.Path, "refinery") - runtimeConfig := config.LoadRuntimeConfig(m.rig.Path) + townRoot := filepath.Dir(m.rig.Path) + runtimeConfig := config.ResolveRoleAgentConfig("refinery", townRoot, m.rig.Path) if err := runtime.EnsureSettingsForRole(refineryParentDir, "refinery", runtimeConfig); err != nil { return fmt.Errorf("ensuring runtime settings: %w", err) } // Build startup command first - townRoot := filepath.Dir(m.rig.Path) var command string if agentOverride != "" { var err error @@ -173,6 +173,10 @@ func (m *Manager) Start(foreground bool, agentOverride string) error { theme := tmux.AssignTheme(m.rig.Name) _ = t.ConfigureGasTownSession(sessionID, theme, m.rig.Name, "refinery", "refinery") + // Accept bypass permissions warning dialog if it appears. + // Must be before WaitForRuntimeReady to avoid race where dialog blocks prompt detection. + _ = t.AcceptBypassPermissionsWarning(sessionID) + // Wait for Claude to start and show its prompt - fatal if Claude fails to launch // WaitForRuntimeReady waits for the runtime to be ready if err := t.WaitForRuntimeReady(sessionID, runtimeConfig, constants.ClaudeStartTimeout); err != nil { @@ -181,9 +185,6 @@ func (m *Manager) Start(foreground bool, agentOverride string) error { return fmt.Errorf("waiting for refinery to start: %w", err) } - // Accept bypass permissions warning dialog if it appears. - _ = t.AcceptBypassPermissionsWarning(sessionID) - // Wait for runtime to be fully ready runtime.SleepForReadyDelay(runtimeConfig) _ = runtime.RunStartupFallback(t, sessionID, "refinery", runtimeConfig)