refactor(desktop): migrate coding-agent defaults onto the design system

Merged
CH
5d ago
+39-31

D23 of the design-system migration (Desktop stack, base feature/desktop-d22-workspace-leave-ownership-transfer-flow, #3401).

What

  • Settings › Coding agents › Default model is @luke/ui's SettingsSection (replacing the desktop's SettingsGroup), as API keys below it has been since D16.
  • Effort and Context are each a SettingsRow holding the shared Segmented (through the desktop's anchor adapter, so the settings search still lands on Effort). Context's cost note ("On 1M, prompts over 200K tokens cost more.") is the row's description. These replace the hand-rolled settings-row settings-row-wrapping divs.
  • Model and Fast were already the shared row (PickerRow, SwitchRow, D14) and are untouched.
  • A refusal of the model, effort or context write still says why once, under all the rows, as a role="alert"; a new rule (.luke-settings-section-card > .luke-settings-row + .error-message) keeps it inside the last row's rule, as the old .settings-card rule did.
  • Behaviour is unchanged: the picker's search, Fast following the model's fast version (and resting with "Request access" on the account's own key), effort kept where the next model lists it, the standard window kept across a model change, rows resting while a write is out, and the refusal clearing once any row's save lands.
  • This page imported nothing from @luke/ui/compat, so there was no compat caller to move.

Selectors

  • None removed: .settings-row-wrapping, .settings-card > .settings-row + .error-message, .settings-detail-act, .settings-note and .settings-card-line all still have other callers (inbox, diff settings, Updates, Experimental, This Mac, API keys).

Visible changes

  • The "Default model" heading is the shared section heading, the same as "API keys" below it (was the old 12px/600 group title).
  • Effort and Context labels use the label role (13/18, 500; was 13px/1.35, 500), and Context's note the caption role (12/16, subtle ink; was 12px/1.4 tertiary).
  • Below a 380px row, the segments drop below the label to the row's end, per the shared row contract (before, they wrapped whenever they did not fit).
  • Row padding, 52px min height, card edges and rules, and the refusal's placement are unchanged.

Tests

  • coding-agents-page.test.ts passes as is (6/6): Effort and Context are still radio groups named by their legends, and the refusal is still one alert.
  • No new tests: no user-visible behaviour changed.
  • pnpm check:affected exits 0.

Evidence

Captured on Linux with headless Chrome at 1280×840, animations held still. The real CodingAgentsPage was rendered in jsdom by a throwaway, uncommitted copy of the page's test with a synthetic catalog and key, inside SettingsPage, and placed in the built desktop stylesheet. The OpenAI mark shows as a broken image only because the capture loads the page from file://; it is not part of this change.

LightDark
Opus on the account's own key, Fast available, two context windows
Fast resting with Request access, and a refused effort write under the rows

Not verified on a Mac

  • SF Pro rendering of the rows and segments
  • Reading and writing the default against the live service, which only the tests cover
  • The search-result ring landing on the Effort row in the real window

🤖 Generated with Claude Code