Highlights
Force-summary respects the active model (#1979) — context-guard and stuck-state recovery no longer hard-code deepseek-v4-flash. Sessions on third-party DeepSeek-compatible endpoints (mimo, self-hosted, Azure forks) that don't expose flash now recover cleanly instead of crashing the summary turn.
Brave Search backend for web_search (#1916) — alternative to the existing Bing / Tavily / Ollama-cloud paths.
Desktop — workspace switcher (#1908) — multiple project roots in the sidebar, no relaunch required.
Desktop fixes — per-tab hook firing (#1984), pending-assistant clears on error so the spinner stops (#1985), /skill and /skills slash commands wired (#1978), context token meter refreshes per turn (#1964), preserve context across abort (#1938), \[ \] / \( \) math delimiters render in markdown (#1923), Windows path separator normalization (#1914), settings allow clearing base URL / editor (#1905), 余额显示支持多币种 (#1930).
Networking — web_fetch falls back to DNS-over-HTTPS when system DNS returns RFC1918 / link-local addresses (#1944); doctor accepts a custom /models endpoint (#1972).
Truncation / encoding — slice boundaries align to UTF-16 codepoints (#1976, includes #1970); truncated-result-saver falls back to ~/.reasonix when rootDir is the FS root (#1974); lone surrogates sanitized in chat payloads (#1939).
Other — /qq defaults to markdown replies (#1941); CardStream measure→render→measure loop broken (#1958); structured errorDetail propagation through loop / transcript / ACP (#1965); ink runtime fully in-tree as a workspace package (#1947); config saveApiKey overrides stale env (#1982); dashboard session refresh (#1917); New Chat label on one line (#1924).
Full changelog: CHANGELOG.md