refactor(desktop): migrate coding-agent defaults onto the design system
Merged
CH
5d ago+39+39+01234567890123456789-31-31-01234567890123456789
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'sSettingsSection(replacing the desktop'sSettingsGroup), as API keys below it has been since D16. - Effort and Context are each a
SettingsRowholding the sharedSegmented(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-rolledsettings-row settings-row-wrappingdivs. - 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-cardrule 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-noteand.settings-card-lineall 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.tspasses 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:affectedexits 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.
| Light | Dark | |
|---|---|---|
| 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



