feat: surface resolved model name in default model option description (#982)

## Summary

- When the SDK's `"default"` model entry carries a `resolvedModel` (e.g.
`"claude-sonnet-5"`), `buildConfigOptions` now sets the option's
`description` to the human-readable `displayName` of the matching named
model (e.g. `"Claude Sonnet 5"`)
- Falls back to the raw `resolvedModel` string if no named entry shares
that resolved ID
- No behaviour change when `resolvedModel` is absent

This lets ACP clients show the actual model behind "Default" — e.g.
"Default (Claude Sonnet 5)" — instead of just "Default (recommended)".

## Test plan

- [ ] `buildConfigOptions model option resolved description > sets
description to the named model's displayName when resolvedModel matches`
- [ ] `buildConfigOptions model option resolved description > falls back
to resolvedModel itself when no named model shares it`
- [ ] `buildConfigOptions model option resolved description > leaves
description undefined when default model has no resolvedModel`
- [ ] All 753 existing tests still pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nikita-ashihmin
2026-08-11 13:21:42 +04:00
committed by GitHub
parent 8157ee113e
commit ec73cd8560
2 changed files with 94 additions and 5 deletions

View File

@@ -6946,11 +6946,23 @@ export function buildConfigOptions(
category: "model", category: "model",
type: "select", type: "select",
currentValue: models.currentModelId, currentValue: models.currentModelId,
options: models.availableModels.map((m) => ({ options: models.availableModels.map((m) => {
value: m.modelId, if (m.modelId === "default") {
name: m.name, const defaultInfo = modelInfos.find((mi) => mi.value === "default");
description: m.description ?? undefined, const resolvedModel = defaultInfo?.resolvedModel;
})), if (resolvedModel) {
const namedMatch = modelInfos.find(
(mi) => mi.value !== "default" && mi.resolvedModel === resolvedModel,
);
return {
value: m.modelId,
name: m.name,
description: namedMatch?.displayName ?? resolvedModel,
};
}
}
return { value: m.modelId, name: m.name, description: m.description ?? undefined };
}),
}, },
]; ];

View File

@@ -13462,6 +13462,83 @@ describe("agent selection config option", () => {
}); });
}); });
describe("buildConfigOptions model option resolved description", () => {
const modes = { currentModeId: "default", availableModes: [] };
const models = {
currentModelId: "default",
availableModels: [{ modelId: "default", name: "Default", description: "" }],
};
it("sets description to the named model's displayName when resolvedModel matches", () => {
const modelInfos = [
{
value: "default",
displayName: "Default",
description: "",
resolvedModel: "claude-sonnet-5",
},
{
value: "sonnet",
displayName: "Claude Sonnet 5",
description: "Balanced",
resolvedModel: "claude-sonnet-5",
},
];
const options = buildConfigOptions(
modes,
models,
modelInfos as any,
undefined,
[],
"default",
);
const modelOption = options.find((o) => o.id === "model");
const defaultEntry = (modelOption as any).options.find((o: any) => o.value === "default");
expect(defaultEntry.description).toBe("Claude Sonnet 5");
});
it("falls back to resolvedModel itself when no named model shares it", () => {
const modelInfos = [
{
value: "default",
displayName: "Default",
description: "",
resolvedModel: "claude-opus-5-20251201",
},
];
const options = buildConfigOptions(
modes,
models,
modelInfos as any,
undefined,
[],
"default",
);
const modelOption = options.find((o) => o.id === "model");
const defaultEntry = (modelOption as any).options.find((o: any) => o.value === "default");
expect(defaultEntry.description).toBe("claude-opus-5-20251201");
});
it("leaves description undefined when default model has no resolvedModel", () => {
const modelsNoDesc = {
currentModelId: "default",
availableModels: [{ modelId: "default", name: "Default" }],
};
const modelInfos = [{ value: "default", displayName: "Default", description: "" }];
const options = buildConfigOptions(
modes,
modelsNoDesc,
modelInfos as any,
undefined,
[],
"default",
);
const modelOption = options.find((o) => o.id === "model");
const defaultEntry = (modelOption as any).options.find((o: any) => o.value === "default");
expect(defaultEntry.description).toBeUndefined();
});
});
describe("switching the agent", () => { describe("switching the agent", () => {
function createMockAgent() { function createMockAgent() {
const mockClient = { sessionUpdate: async () => {} } as unknown as AcpClient; const mockClient = { sessionUpdate: async () => {} } as unknown as AcpClient;