From 5a965fb44f1e92aa3219f98b6396a76f6baa620e Mon Sep 17 00:00:00 2001 From: William Obino Date: Thu, 21 May 2026 02:55:18 +0300 Subject: [PATCH] fix(background-agent): skip disconnected explicit-provider fallbacks --- .../background-agent/fallback-retry-handler.test.ts | 12 ++++++------ .../background-agent/fallback-retry-handler.ts | 6 +----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/features/background-agent/fallback-retry-handler.test.ts b/src/features/background-agent/fallback-retry-handler.test.ts index fc86f554f..b3732e245 100644 --- a/src/features/background-agent/fallback-retry-handler.test.ts +++ b/src/features/background-agent/fallback-retry-handler.test.ts @@ -431,26 +431,26 @@ describe("tryFallbackRetry", () => { }) describe("#given disconnected fallback providers with connected preferred provider", () => { - test("keeps fallback entry and selects connected preferred provider", async () => { + test("skips explicit-provider fallback entries when none of their providers are connected", async () => { readProviderModelsCacheMock.mockReturnValueOnce({ connected: ["provider-a"], models: {}, updatedAt: new Date("2026-05-16T00:00:00.000Z").toISOString(), }) - selectFallbackProviderMock.mockImplementationOnce( - (_providers: string[], preferredProviderID?: string) => preferredProviderID ?? "provider-b", - ) const args = createDefaultArgs({ fallbackChain: [{ model: "fallback-model-1", providers: ["provider-b"], variant: undefined }], model: { providerID: "provider-a", modelID: "original-model" }, }) + const providerCallsBefore = selectFallbackProviderMock.mock.calls.length + const result = await tryFallbackRetry(args) - expect(result).toBe(true) + expect(result).toBe(false) expect(args.task.model?.providerID).toBe("provider-a") - expect(args.task.model?.modelID).toBe("fallback-model-1") + expect(args.task.model?.modelID).toBe("original-model") + expect(selectFallbackProviderMock.mock.calls.length).toBe(providerCallsBefore) }) }) }) diff --git a/src/features/background-agent/fallback-retry-handler.ts b/src/features/background-agent/fallback-retry-handler.ts index 92a92de95..8e85ee952 100644 --- a/src/features/background-agent/fallback-retry-handler.ts +++ b/src/features/background-agent/fallback-retry-handler.ts @@ -73,14 +73,10 @@ export async function tryFallbackRetry(args: { const providerModelsCache = deps.readProviderModelsCache() const connectedProviders = providerModelsCache?.connected ?? deps.readConnectedProvidersCache() const connectedSet = connectedProviders ? new Set(connectedProviders.map(p => p.toLowerCase())) : null - const preferredProvider = task.model?.providerID?.toLowerCase() const isReachable = (entry: FallbackEntry): boolean => { if (!connectedSet) return true - if (entry.providers.some((provider) => connectedSet.has(provider.toLowerCase()))) { - return true - } - return preferredProvider ? connectedSet.has(preferredProvider) : false + return entry.providers.some((provider) => connectedSet.has(provider.toLowerCase())) } let selectedAttemptCount = attemptCount