fix(desktop): show readable Claude Code model names and descriptions - #8053
Conversation
claude-agent-acp labels config options with `name`, but discovery and the
session-config parser read `displayName`, so model rows and effort choices
showed raw IDs ("opus[1m]", "low"). Discovery also dropped each model's
description and ignored the stable option's `currentValue` as the default.
The create and edit pickers now show the description as a second line.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
🔐 Codex Security Review
Review SummaryOverall Risk: LOW
Findings[LOW]
|
The Edit dialog always passes `globalModel`, which routes options through `buildTemplateModelDropdownOptions`; that mapping dropped `description`. Mounted tests open the real create and edit menus. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
…tter
Claude Code's own names drop versions ("Sonnet" for claude-sonnet-5). The
Databricks label grammar already parses bare Claude ids once its wrapper is
removed, so expose that body parse and use it for the claude runtime, keeping
[1m] as "(1M context)". Short names like opus stay as the adapter labels them.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
The readable models output read displayName and configId, which no ACP adapter sends, so it printed raw IDs. The doc comment and test data carried the same wrong field name. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
trim() strips Unicode whitespace before the formatter's ASCII check, so padded ids got generated labels. Reject on the raw id, including the default row, and cover the hook's runtime wiring with a mounted test. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
The template option builder relabeled every empty-ID option with the inherited label, which is the generic "Default model" when no global model is set, hiding the adapter's "Default model (Opus)". Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
wesbillman
left a comment
There was a problem hiding this comment.
Carl, an automated reviewer, commenting via Wes’s GitHub account.
No material correctness or security blockers found. One optional wording suggestion is inline; this is a comment review, not approval.
Reviewed head 39e8e7d69db7bed3c81a3fa67d3bb35d44294cf2 against base/merge-base 448407a972ca9da0c1e13d49ee2c2170821be8a2.
- Traced discovery, default precedence, and create/edit/defaults label propagation. Targeted source-extracted probes preserved Databricks grammar outputs on 378 inputs and checked Claude fallback/ID preservation; these are not package-suite or live-UI results.
- The existing bot’s Cursor compatibility claim does not hold for Cursor
2026.10.01-e373342: its ACP builders translate internaldisplayNameinto wirename(buildModelSelectOption,buildVariantModelConfigOptions,getConfigOptionValuesin3351.index.js, published bundle). Claude v0.36.1 and the ACP v1 schema also usename. Other adapter/version combinations were not exhaustively checked. - Current CI has passed Rust unit tests/lint and desktop Windows/macOS builds; Desktop Core, remaining smoke/integration jobs, and Windows Rust are still running. Let those finish. No native picker or VoiceOver session was exercised in this review.
When the adapter's default is its own "default" entry (named e.g. "Default (recommended)"), the row read "Default model (Default (recommended))". Show plain "Default model" and keep that entry's description. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
…del-labels * origin/main: fix(acp): steer running turns with edited mentions (#6132) fix(mcp): support Goose discovery handshake (#8037) test(agent): synchronize handoff steering with tool approval (#8042) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
Brings 16 upstream block/buzz commits (a14107a) into the fork integration branch: ACP mention/edit steering (block#6131, block#6132), quiet-host recovery wakes (block#7459), relay NIP-FI shadow mode (block#8034, block#8062), writer lock foundations (block#7706), Goose MCP handshake (block#8037), Claude model names (block#8053), summarized thinking (block#8051) and mobile iOS changes. Merged cleanly without textual conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Arnoldinh0 <arnaudlafosse92100@gmail.com>
Claude Code agents' model dropdown showed raw IDs (
opus[1m],claude-fable-5-1[1m],haiku) and its effort choices showedlow/xhigh. Claude Code's ACP adapter labels config options and choices withname, but Buzz readdisplayName, which no adapter sends.Adapter labels and descriptions
normalize_agent_modelsreadsname, keeps each model'sdescription, and uses the model option'scurrentValueas the agent's default model (ahead of the unstablecurrentModelId).parse_config_options/parse_option_valuesreadnamefor option and choice labels, so effort shows "Low"/"Xhigh".PersonaModelCombobox) and edit (PersonaDropdownField) model pickers show the description as a muted second line, through both option builders (modelDropdownOptionsandbuildTemplateModelDropdownOptions).Generated names for full Claude model IDs
claude-sonnet-5). The desktop's Databricks label grammar already parses a bare Claude ID once its wrapper is removed, so that body parse is exposed asgenerateBareModelLabel; Databricks entry points and outputs are unchanged.clauderuntime,claudeCodeModelLabelformats full IDs and keeps a[1m]suffix as "(1M context)". Short names (opus,haiku,opus[1m]), unknown bracket suffixes, and IDs containing any non-ASCII character keep the adapter's name.defaultentry (e.g. "Default (recommended)"), the row reads plain "Default model" and keeps that entry's description.modelsdebug commandmodelsoutput reads option and choice labels fromnameand the option id fromid(falling back toconfigId), so it no longer prints raw IDs for Claude Code. JSON output is unchanged.opus[1m]opus[1m]claude-fable-5-1[1m]claude-fable-5-1[1m]claude-sonnet-5claude-sonnet-5claude-sonnet-4-6claude-sonnet-4-6claude-sonnet-4-6[1m]claude-sonnet-4-6[1m]haikuhaiku🤖