From a82bec43123e4f82293fbacd88891ab961c72046 Mon Sep 17 00:00:00 2001 From: Lakshman Patel Date: Mon, 13 Jul 2026 08:12:07 +0530 Subject: [PATCH] fix(engine): preserve explicit provider overrides --- engine/selection.go | 4 +++- engine/selection_contract_test.go | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/engine/selection.go b/engine/selection.go index 0e0398d..11c3850 100644 --- a/engine/selection.go +++ b/engine/selection.go @@ -22,11 +22,13 @@ func (e *Engine) EffectiveSelection(ctx context.Context, opts SelectionOptions) active := e.ActiveSelection(ctx) provider := NormalizeProviderID(active.Provider) model := strings.TrimSpace(active.Model) + hasProviderOverride := false if override := NormalizeProviderID(opts.ProviderOverride); override != "" { if override != provider && strings.TrimSpace(opts.ModelOverride) == "" { model = "" } provider = override + hasProviderOverride = true } if override := strings.TrimSpace(opts.ModelOverride); override != "" { model = override @@ -53,7 +55,7 @@ func (e *Engine) EffectiveSelection(ctx context.Context, opts SelectionOptions) if provider == "" && hasConfigured { provider = preferredConfiguredGateway(gateways, configured) } - if provider != "" && hasConfigured && !configured[provider] { + if provider != "" && hasConfigured && !configured[provider] && !hasProviderOverride { provider = preferredConfiguredGateway(gateways, configured) model = "" } diff --git a/engine/selection_contract_test.go b/engine/selection_contract_test.go index 3f4aea7..0bedbc2 100644 --- a/engine/selection_contract_test.go +++ b/engine/selection_contract_test.go @@ -63,6 +63,29 @@ func TestEffectiveSelectionClearsModelWhenProviderOverrideChanges(t *testing.T) } } +func TestEffectiveSelectionPreservesUnconfiguredProviderOverride(t *testing.T) { + ctx := context.Background() + store := &credentials.MapStore{} + if err := store.Set(ctx, credentials.AccountForEnv("CLINE_API_KEY"), "cline-live-secret-1234567890"); err != nil { + t.Fatal(err) + } + eng, err := New(Options{SecretStore: store, StateDir: t.TempDir()}) + if err != nil { + t.Fatal(err) + } + + selection := eng.EffectiveSelection(ctx, SelectionOptions{ + ProviderOverride: "anthropic", + ModelOverride: catalog.ClaudeOpusV4_6, + }) + if selection.Provider != "anthropic" { + t.Fatalf("explicit provider override was replaced by a configured provider: %+v", selection) + } + if !selection.HasConfiguredDeployment { + t.Fatal("configured deployment state was lost while preserving the explicit override") + } +} + func TestCustomProviderOverrideDoesNotReuseOtherCustomModel(t *testing.T) { ctx := context.Background() eng, err := New(Options{