fix(sessions): reject empty provider/model IDs in model override selection

This commit is contained in:
杨艺韬(yangyitao) 2026-03-15 02:54:29 +00:00
parent 5e417b44e1
commit fa09321ef2
2 changed files with 34 additions and 0 deletions

View File

@ -92,6 +92,34 @@ describe("applyModelOverrideToSessionEntry", () => {
expect(entry.updatedAt).toBe(before);
});
it("rejects empty provider or model IDs without mutating the entry", () => {
const before = Date.now() - 5_000;
const entry: SessionEntry = {
sessionId: "sess-empty",
updatedAt: before,
providerOverride: "anthropic",
modelOverride: "claude-sonnet-4-6",
};
const emptyProvider = applyModelOverrideToSessionEntry({
entry,
selection: { provider: "", model: "gpt-5.2" },
});
expect(emptyProvider.updated).toBe(false);
expect(entry.providerOverride).toBe("anthropic");
expect(entry.modelOverride).toBe("claude-sonnet-4-6");
expect(entry.updatedAt).toBe(before);
const emptyModel = applyModelOverrideToSessionEntry({
entry,
selection: { provider: "openai", model: " " },
});
expect(emptyModel.updated).toBe(false);
expect(entry.providerOverride).toBe("anthropic");
expect(entry.modelOverride).toBe("claude-sonnet-4-6");
expect(entry.updatedAt).toBe(before);
});
it("clears stale contextTokens when switching back to the default model", () => {
const before = Date.now() - 5_000;
const entry: SessionEntry = {

View File

@ -17,6 +17,12 @@ export function applyModelOverrideToSessionEntry(params: {
let updated = false;
let selectionUpdated = false;
// Guard against empty/whitespace-only provider or model IDs that can result
// from truncated picker payloads or malformed directive parsing (#46700).
if (!selection.isDefault && (!selection.provider.trim() || !selection.model.trim())) {
return { updated: false };
}
if (selection.isDefault) {
if (entry.providerOverride) {
delete entry.providerOverride;