diff --git a/apps/web/src/composerDraftStore.ts b/apps/web/src/composerDraftStore.ts index 59188ac8d7958..38712e0187ded 100644 --- a/apps/web/src/composerDraftStore.ts +++ b/apps/web/src/composerDraftStore.ts @@ -1114,8 +1114,9 @@ export function deriveEffectiveComposerModelState(input: { const instanceSelection = input.selectedInstanceId ? input.draft?.modelSelectionByProvider?.[input.selectedInstanceId] : undefined; + // Driver-keyed drafts predate instances and belong to the default instance; custom instances + // (an OpenCode instance limited to one provider, another Antigravity account) have other catalogs. const legacySelection = - input.selectedProvider === "antigravity" && input.selectedInstanceId && input.selectedInstanceId !== defaultInstanceIdForDriver(input.selectedProvider) ? undefined diff --git a/apps/web/src/modelSelection.test.ts b/apps/web/src/modelSelection.test.ts index 05a7e76b6b25b..e803a14c4116f 100644 --- a/apps/web/src/modelSelection.test.ts +++ b/apps/web/src/modelSelection.test.ts @@ -604,6 +604,37 @@ describe("instance-scoped model selection", () => { ).toEqual(createModelSelection(instanceId, "openai/gpt-5.5")); }); + it("keeps the default instance's draft model off a custom instance of the same driver", () => { + const driver = ProviderDriverKind.make("opencode"); + const defaultInstanceId = ProviderInstanceId.make("opencode"); + const kimiInstanceId = ProviderInstanceId.make("kimi_api"); + const kimiModel = "kimi-code-plan-global/k3.1-pro"; + const providers = [ + provider({ + provider: driver, + instanceId: defaultInstanceId, + models: ["opencode-go/kimi-k3.1-pro"], + }), + provider({ provider: driver, instanceId: kimiInstanceId, models: [kimiModel] }), + ]; + const state = deriveEffectiveComposerModelState({ + draft: { + activeProvider: kimiInstanceId, + modelSelectionByProvider: { + [defaultInstanceId]: createModelSelection(defaultInstanceId, "opencode-go/kimi-k3.1-pro"), + }, + }, + providers, + selectedProvider: driver, + selectedInstanceId: kimiInstanceId, + threadModelSelection: null, + projectModelSelection: null, + settings: DEFAULT_UNIFIED_SETTINGS, + }); + + expect(state.selectedModel).toBe(kimiModel); + }); + it("self-heals a persisted selection pointing at a text-generation-incapable instance", () => { const providers = [ provider({