Keep composer mode preferences stable (#1658)

* fix(app): preserve composer mode preferences

Treat undefined provider preference updates as no-ops, and keep saved mode selections instead of silently defaulting them when provider metadata is incomplete or does not list the saved mode.

* fix(app): document mode preference preservation
This commit is contained in:
Mohamed Boudra
2026-06-23 09:22:26 +00:00
committed by GitHub
parent c03e7b82b4
commit d9cd6ea0fd
4 changed files with 153 additions and 45 deletions
@@ -511,6 +511,59 @@ describe("resolveFormState", () => {
expect(resolved.thinkingOptionId).toBe("xhigh");
});
it("preserves the saved mode while provider modes are absent from a loading snapshot", () => {
const loadingEntries: ProviderSnapshotEntry[] = [
{
provider: "codex",
status: "loading",
enabled: true,
label: TEST_CODEX_DEFINITION.label,
description: TEST_CODEX_DEFINITION.description,
defaultModeId: TEST_CODEX_DEFINITION.defaultModeId,
},
];
const providerDefinitions = buildProviderDefinitions(loadingEntries);
const resolvableProviderMap = buildProviderDefinitionMapForStatuses({
snapshotEntries: loadingEntries,
providerDefinitions,
statuses: new Set<ProviderSnapshotEntry["status"]>(["ready", "loading"]),
});
const resolved = resolveFormState(
undefined,
{
provider: "codex",
providerPreferences: { codex: { mode: "full-access", model: "gpt-5.3-codex" } },
},
null,
INITIAL_USER_MODIFIED,
makeState({ provider: "codex", modeId: "full-access", model: "gpt-5.3-codex" }).form,
resolvableProviderMap,
);
expect(resolved.provider).toBe("codex");
expect(resolved.modeId).toBe("full-access");
});
it("preserves a saved mode that is not in the current mode list", () => {
const resolved = resolveFormState(
undefined,
{
provider: "codex",
providerPreferences: { codex: { mode: "workspace-write", model: "gpt-5.3-codex" } },
},
CODEX_MODELS,
INITIAL_USER_MODIFIED,
makeState({ provider: "codex" }).form,
codexProviderMap,
);
expect(resolved.provider).toBe("codex");
expect(resolved.modeId).toBe("workspace-write");
});
it("ignores disabled ready providers when resolving selectable defaults", () => {
const entries: ProviderSnapshotEntry[] = [
{