
### Added
- **Sync Models button in Settings** — the Models panel in the Configuration dialog now includes a "Sync Models" section. Users can sync their local models list from the upstream registry with one click. A toggle switch selects between merge mode (add new models, keep existing) and override mode (replace entirely). After sync, the result summary shows how many providers and models were added, and the model list refreshes automatically.
- **Localhost auto-discovery on first launch** — when no saved servers exist, the client silently probes `localhost:8742` to check if a server is running without authentication. If found, it is automatically added to the server list as "Home", giving localhost users a seamless first-time experience without manual setup.
- **@mention file references now persist across session switches** — mentions are derived directly from `@path` patterns in the input text instead of being held in separate React state. This means file references survive session switching (since the draft text is persisted), and also work automatically with copy-paste — any `@path` in the text becomes a mention chip.

### Changed
- **Removed `open` dependency** — the client package no longer depends on the `open` npm package. Browser opening is handled by the server via native platform commands (`open`, `cmd /c start`, `xdg-open`). The `--no-open` CLI flag has been removed as well.
- **SPA static file server rewritten without external dependencies** — `cli.ts` now uses `node:http` directly for serving static files, with no external imports.

### Fixed
- **Pending/queued user messages now visible in both light and dark themes** — queued messages had invisible text due to `text-primary-foreground` (the contrast color for `bg-primary`) being used on `bg-muted`. In dark mode this was dark-on-dark, in light mode light-on-light. Queued messages now correctly use `text-foreground` against `bg-muted` for proper contrast in both themes.
- **User message newlines are now preserved in rendered output** — single line breaks typed in the input were collapsed into spaces by the markdown renderer (standard markdown behavior). User messages now convert single `\n` to paragraph breaks so the rendered text matches what was typed.
- **SPA refresh on nested routes no longer causes MIME type errors** — refreshing the page on a nested route (e.g. `/sessions/abc`) with relative base (`./`) caused the browser to request `/sessions/assets/foo.js`, which returned `index.html` with the wrong content type. Both the client CLI and the server's inline HTTP server now detect these missed asset paths and redirect to `/assets/<filename>`.
