opencoder v1.0.4
[1.0.4]
Added
-
Desktop UI audit report (docs):
docs/ui-audit-2026-08.md— a Playwright-driven pass over every desktop screen (21 evidence screenshots indocs/screenshots/audit-2026-08/) covering layout/design, desktop-operation convenience, performance (prod bundle re-measured) and the settings center, with a prioritized findings table. (docs) -
Rail sidebar toggle button (feat(desktop)): the server rail gains a sidebar-toggle button above the settings gear — the collapsed sidebar is restorable with a click instead of only ⌘/Ctrl+B, and the button doubles as a discoverable collapse control. (desktop)
Changed
-
Providers edit on double-click (feat(settings)): double-clicking a provider row opens an edit dialog with the API key field, Save, Remove (when connected) and Authorize (for OAuth providers) — the key and connection become editable without hunting for the inline form. (settings)
-
Config section re-laid out around one model editor (feat(settings)): the opencode.json
modeldual-select row is gone — the "Default model" row is the single model editor (its hint now explains it wins over the config-file key, which stays editable through the JSON editor); all config rows now drop their control BELOW the label on narrow windows instead of squeezing it into a fixed-width box where it clipped against the dialog edge. Config rows are now fully STACKED — label, hint, then the control in a bounded column below — replacing the side-by-side grid whose right-aligned controls kept clipping against the dialog edge at real-world widths (select intrinsic widths grow with the longest option text; the zh "未设置——采用服务端默认" made every select ~250px). One vertical lane cannot clip horizontally at any width, language or UI scale, and the section body forbids horizontal overflow. (settings) -
Providers collapse to the connected set (feat(settings)): the Providers section now lists only connected providers; known-but-unconnected ones hide behind a "Show {{count}} more" toggle (with no connection at all the full list stays visible). (settings)
-
The opencode.json model editor is "Config file model" (fix(settings)): the Config section had two adjacent rows both titled "Default model" (the client-side default and the
modelkey of opencode.json); the config-file one is renamed with a hint explaining the override order, and the effective-default chip is width-capped so it no longer crowds the dialog edge on narrow windows. (settings)
Fixed
-
UI scale slider commits on release (fix(settings)): dragging the Appearance scale slider applied the scale on every input event, which re-scaled the root font size, re-laid-out the centered dialog and moved the slider under the pointer — a jitter loop that made the slider undraggable. The drag now only previews the readout; the value applies and persists on release. (settings)
-
Pet controls sit on one row with their labels (fix(settings)): the pet type/movement selects and size/opacity sliders were stacked full-width blocks under their labels; they now render as label-left / control-right rows matching the toggle rows below. (settings)
-
Search / diff / changes refinements (feat(vcs)): the Changes panel's "Apply patch" moved from a permanent bottom box into a dialog opened from the header (the change list gets the full panel height; the confirm step stays), stats-only diff files render a styled empty block with an explanation instead of a bald text row, and the search "No matches" state names the directory that was searched. (vcs)
-
Instant default-shell terminal (feat(terminal)): the "+" button now spawns the server's default shell immediately — the shell picker moves to a chevron next to it and the empty state gains a "New terminal" button (docs/ui-audit-2026-08 §3: creating a terminal no longer requires routing through the picker). (terminal)
-
Status-bar chip labels on wide windows (feat(desktop)): the branch / LSP / formatter / usage chips gain a brief text label at window widths ≥1280px (hidden below, where the dense icon+value form and the hover tooltips remain). (desktop)
-
CI startup-bundle size guard (chore(ci)):
pnpm build && pnpm check:bundlenow runs in CI — the vite startup chunk fails the build once its gzip size leaves the 330 KB budget (2026-08 audit measured 320.46 KB with +57 KB raw drift since 2026-08-05), turning further bundle drift into a hard signal. (ci) -
Deduplicated settings sections (refactor(settings)): the About section merged into General (server version/status, license and copyright now live there — both sections showed the same identity, version and links), and the Models section folded into Config as a "Default model" row (the nav entry was a single row duplicating Config's editor); the settings search keywords now index the sections' control labels ("accent", "default model"…) so queries land on the right section. Nav shrinks from 15 to 13 entries. (settings)
-
Sidebar tree tab renamed and ignored entries hidden (feat(files)): the sidebar's second tab is now "Tree" instead of a second "Files" (the main pane's Files viewer kept the name — one label for two scopes was confusing), and the file tree hides ignored entries (
node_modules, build output) behind a persisted "Show ignored" toggle by default. (files) -
Command palette hints and honest grouping (feat(desktop)): the palette gains a keyboard-hint footer (↑↓ Navigate · ↵ Open · Esc Close) and the section holding "New session / Open settings / Toggle sidebar / Open terminal / Open session diff" is now labeled "Actions" instead of "Settings" — it never contained settings entries. (desktop)
-
Composed server-home empty state (fix(servers)): with no servers saved, the home page now centers one block — guide copy plus a primary "Add server" button — instead of a dashed card in the corner with a detached hint line below it. The e2e/L2 entry points (testids) are unchanged. (servers)
-
Grouped settings navigation (feat(settings)): the desktop settings sidebar renders four group headers — App, Connections, System, Advanced — instead of a flat 15-entry list, and the settings search now collapses to the matching group (headers of empty groups hide). The Servers section's per-server switch gains a visible "Notifications" label (it carried only an aria-label before). (settings)
Fixed
-
Defer provider-id validation hints (fix(settings)): the Add-provider dialog no longer shows "Provider ID is required" on a pristine form — the hint appears once the field was typed into (or cleared), matching when validation is actually actionable. (settings)
-
Dispatch ⌘/Ctrl shortcuts while typing (fix(desktop)): the input guard no longer blocks ⌘/Ctrl combos — ⌘K (command palette), ⌘P (quick open), ⌘⇧F (search), ⌘D (diff), ⌘J (terminal) and ⌘, (settings) now work from inside any text field (composer, search boxes), since a modifier combo types nothing into the control. Plain-key shortcuts (Tab, ↑, Esc) keep the guard. (desktop)
-
Localize the desktop workspace chrome (fix(desktop)): the "Select a session" empty state (chat and diff views) no longer ships the dev placeholder "Select a session — M2", and the "Back to servers" button, the sidebar Workspaces/Files tabs and the main Chat/Files tabs now render through i18n — all follow the app language instead of hardcoded English. (desktop)