## 1jehuang/jcode — v0.90.0…v0.90.1

_130 commits._

### Features
- **Merge pull request #1660: Add .gitattributes so line endings do not depend on each contributor's global config (@gdamprint-cmyk)** (e178593)
- **feat(usage): show Kimi Code, Cursor, and Z.ai Coding Plan quota in /usage** (da0f496)
- **feat(tui): Esc with a pending follow-up prompt stops the turn and runs it** (be9e75b)
- **feat(gmail): add update_draft, list_drafts, and delete_draft actions** (f26037b)
- **Add .gitattributes so line endings do not depend on each contributor's global config** (4583840)

### Fixes
- **fix(tui): edit rows show intent, expand badge in every diff mode** (d980b62)
- **fix(anthropic): advertise registry tool schemas on Claude OAuth, renamed only** (ec85ee9)
- **Merge pull request #1711 from SK-DEV-AI/fix/upstream-crash-detector-idle-close** (0a74e5b)
- **Merge pull request #1714 from mg-mg-mg/fix/korean-undo-coalescing** (8441779)
- **fix(pricing): keep local profiles out of the cross-provider fallback (follow-up to #1658)** (73f5fdf)
- **fix(usage): query Z.ai quota on the profile's region host (follow-up to #1699)** (f6194cb)
- **fix(provider): retry every 5xx from OpenAI-compatible providers, including 529 (fixes #1596)** (22d3ced)
- **fix(auth): keep every saved API key out of the process env (fixes #1386)** (f18ffee)
- **fix: invoke auth resolver before applying ?** (5db10f4)
- **fix: make env files the source of truth for API keys** (4a03475)
- **fix(openrouter): use env-applied profile's default model instead of OpenRouter default (fixes #1625)** (026dd5d)
- **fix(gmail): keep the action description under the tool-schema token cap** (796aa53)
- **fix(copilot): honor catalog-advertised reasoning effort (fixes #1643)** (985d1de)
- **fix(palette): apply configured roles on 256-color terminals (fixes #1663)** (66205a2)
- **fix(update): patch the Termux glibc ELF interpreter after in-app updates (fixes #1630)** (400bf78)
- **fix: self-heal image 400s and drain session saves on SIGTERM (#1712, #1632)** (32ec9ec)
- **fix(tui): keep #1712 inside the guardrail budgets and de-flake drop tests** (41620b2)
- **fix(images): never store or send image formats providers reject (#1712)** (d1e38a6)
- **Merge pull request #1565: fix(anthropic): rewrite orphaned tool_results as text instead of 400ing (@SiavZ)** (a1a9c4c)
- **Merge pull request #1572: fix(anthropic): move late tool_results up to directly follow their tool_use (@SiavZ)** (03de3bf)
- **fix(markdown): don't render escaped-bracket prose as display math** (ec35c0c)
- **fix(session): make journal replay idempotent so an interrupted checkpoint cannot duplicate history (#1632)** (d129f25)
- **Merge pull request #1691: fix(agent): bound malformed tool call recovery and stop coercing null arguments (@SiavZ)** (e511106)
- **Merge pull request #1431: fix(gemini): default to non-dated gemini-pro-latest alias (@adminwat)** (cf6c4cd)
- **fix: idle-vs-interrupted disposition in PID crash detector (extends #988)** (5c98e34)
- **Merge pull request #1576: fix(tools): conversation_search snippets no longer split multi-byte chars (@SiavZ)** (f8040e1)
- **Merge pull request #1575: fix(openrouter): name the billing limit on 402 instead of blaming the network (@SiavZ)** (c02de8c)
- **Merge pull request #1458: fix(id): avoid occupied session names under concurrent allocation (@Kenmege)** (c735916)
- **Merge pull request #1253: fix(server): create runtime directory before acquiring spawn lock (@shua0326)** (581aed0)
- **Merge pull request #1434: fix(anthropic): refresh OAuth model catalog behind custom base URL proxies (@adminwat)** (b2c8f60)
- **Merge pull request #1444: Fix /accounting slash-command boundary (@dajiaohuang)** (19aea52)
- **Merge pull request #1603: fix(update): explain git-managed auto-update skip (@dajiaohuang)** (ff3d27a)
- **Merge pull request #1602: fix(provider): classify GLM-5.3 context window (@dajiaohuang)** (18213c0)
- **fix(tui): don't announce a model switch when resume re-reports the same model** (1648b91)
- **Merge pull request #1645: fix: recover orphaned Anthropic native web searches (@Soham-o)** (bdf053d)
- **Merge pull request #1696: fix(herdr): close spawned panes on clean exit, keep state reports on herdr < 0.9.2 (@ddiawara)** (1d57329)
- **Merge pull request #1674: fix(provider): explicit worker model transport beats inherited session route (@SiavZ)** (45f4684)
- **Merge pull request #1677: fix(test): make accepted mock sockets blocking on macOS (@Ha1baraA11)** (77e0f45)
- **Merge pull request #1653: Fix cargo test -p jcode-app-core: Stream does not implement Debug (@gdamprint-cmyk)** (981f923)
- **Merge pull request #1676: fix(ci): clear clippy 1.99 and macOS warning-budget failures (@SiavZ)** (bdbbba2)
- **fix(usage): address second round of Greptile findings** (65518d0)
- **fix(usage): address Greptile review findings on quota fallbacks** (948a2d0)
- **fix(herdr): close spawned panes when jcode exits cleanly** (68d42e0)
- **fix(herdr): keep reporting state when herdr rejects the resume command** (7f6afa2)
- **fix(openrouter): keep non-string streamed tool arguments for validation** (830ce4b)
- **fix(agent): keep non-object streamed tool arguments so malformed calls get corrected** (b303eb7)
- **fix: bound malformed tool call recovery across turn loops** (1123940)
- **fix(test): restore blocking mode on accepted sockets** (91b864a)
- **fix(ci): clear clippy 1.99 and macOS warning-budget failures** (0d002d2)
- **fix(provider): explicit worker model transport beats inherited session route** (2f467f9)
- **fix(tui): scrub late OSC 11 color replies from the composer (#970)** (da2c1ba)
- **Fix cargo test -p jcode-app-core: Stream does not implement Debug** (9c61dd5)
- **Fix cargo test -p jcode-app-core: Stream does not implement Debug** (1f37a13)
- **Fix cargo test -p jcode-app-core: Stream does not implement Debug** (1d2f3b4)
- **fix(anthropic): drop orphaned native web searches** (4ad8569)
- **fix(anthropic): repair orphaned native web searches** (5a39b12)
- **fix(update): clarify git checkout update advice** (2ac098c)
- **fix(update): explain git-managed auto-update skip** (b7a6105)
- **fix(provider): classify GLM-5.3 context window** (083df88)
- **fix(anthropic): answer tool_uses whose result was displaced to a later turn** (63349ba)
- **fix(anthropic): move a late tool_result together with its image, label and tool references** (616623d)
- **fix(tools): conversation_search snippet matches like the search and maps offsets without a byte table** (022319b)
- **fix(anthropic): move late tool_results up to directly follow their tool_use** (f6c32b5)
- **fix(openrouter): name the billing limit on 402 instead of blaming the network** (80b8c02)
- **fix(tools): conversation_search snippets no longer split multi-byte chars** (f0003c3)
- **fix(anthropic): rewrite orphaned tool_results as text instead of 400ing** (be129e8)
- **fix(id): never reuse an occupied session identity while one is free** (43bc436)
- **fix(anthropic): refresh OAuth model catalog behind custom base URL proxies** (94fddc5)
- **fix(gemini): default to non-dated gemini-pro-latest alias** (81c0ce3)
- **fix(server): create runtime directory before acquiring spawn lock** (e327451)

### Backend
- **release: v0.90.1** (b0e48d8)
- **Merge pull request #1658: pricing: cross-provider fallback for openai-compatible profiles (@ogodevonline)** (153faa9)
- **Merge pull request #1699: feat(usage): show Kimi Code, Cursor, and Z.ai Coding Plan quota in /usage (@ghoker143)** (056a300)
- **compile_remote: make tool description static, report account state only in results** (68f1524)
- **Revert "compile_remote: keep cached access state on transient check failure to stop prompt-cache invalidation"** (ce9dab2)
- **compile_remote: keep cached access state on transient check failure to stop prompt-cache invalidation** (9f8262c)
- **Merge pull request #1682: feat(tui): Esc with a pending follow-up prompt stops the turn and runs it (@SiavZ)** (c6a3b9c)
- **Keep external composer edits outside typing undo bursts** (9e43df7)
- **Group contiguous composer typing into one undo step** (1358df8)
- **subscription_api: native subscribe checkout and in-place plan change** (08ae8f4)
- **Stop a remote client from downgrading the server-reported context window** (a74b3d8)
- **Merge pull request #1655: Carry the resolved context window to the client; match a pinned @Provider variant against the catalog (@gdamprint-cmyk)** (68acbbb)
- **Merge pull request #1662: Stop the empty-post-tool continuation from keeping its own trigger condition true (@gdamprint-cmyk)** (4e32cb7)
- **Merge pull request #1657: Re-arm auto-poke when open work appears, so the completion-gate breaker cannot silence it (@gdamprint-cmyk)** (a392452)
- **Merge pull request #1678: test(tui): scope no-dot assertion to Changes rows (@Ha1baraA11)** (98e685d)
- **subscription_api: billing status, hard cap, billing portal, and sign-out helpers for desktop account menu** (fc51382)
- **Merge pull request #1672: ci: let fork PRs build without the SSH deploy key (@SiavZ)** (2a9e29a)
- **pricing: scope cross-provider fallback and split missing cache rates** (f177a1b)
- **rustfmt: apply formatting to the recovery predicate change** (aeeddc0)
- **rustfmt: apply formatting across the context-window changes** (a86a745)
- **Stop the empty-post-tool continuation from keeping its own signal true** (2f86adc)
- **Keep the compaction budget in step with the panel's context window** (07118e9)
- **Honour a configured context_window over the static Claude table on a custom endpoint** (7c898ac)
- **Display the server-resolved context window instead of the client placeholder** (24bc8b5)
- **Report the restored route to a resuming client so it learns the real context window** (708722b)
- **pricing: fall back to cross-provider catalog match for openai-compatible profiles** (467d624)
- **Cover the context_window protocol field and update test call sites** (752f342)
- **Carry the server-resolved context window to the client on ModelChanged** (ff623f1)
- **Read the context window live instead of a field only refreshed on account switch** (5a5b4c8)
- **Match a pinned @Provider variant against the catalog by its base id** (4014cc2)
- **Re-arm auto-poke when open work appears, so the completion-gate breaker cannot silence it** (7d60ddb)
- **Guard account command token boundaries** (091f665)

### Tests
- **test(openrouter): keep the zai cached-context regression on a 200K GLM model** (639cd0b)
- **test(openrouter): pin tool-call markup in structured args as inert (refs #1702)** (70991b0)
- **test(tui): isolate default auto-poke tests from concurrent config writes** (7aaab86)
- **test(herdr): make the fake herdr fixture independent of TMPDIR** (7b7bef4)
- **test(tui): limit clean Changes assertion to file rows** (051481d)
- **test(anthropic): cover dropped orphaned native searches** (bd0dfb5)
- **test(anthropic): register native web-search repair tests** (8b5d5e3)
- **test(anthropic): cover orphaned native web-search history** (07c0933)
- **test(id): force cursor interference deterministically** (5c74ffe)

### Docs
- **docs(anthropic): restore split doc comment on dedupe_tool_results** (8a7e5a9)
- **docs: update weekly stars chart** (9f04d17)
- **docs: update weekly stars chart** (2df1f77)

### Chore
- **chore(ci): accept size growth from #1711, #1714 and the edit-row intent fix** (cab6951)
- **chore(ci): shrink oversized files and fix clippy redundant_closure for Quality Guardrails** (790d6d7)
- **chore(ci): restore Quality Guardrails (clippy redundant_closure, split oversized files, swallowed-error baseline)** (3bad065)
- **chore(startup): log launched binary version and path (refs #1626)** (e32597b)
- **chore(ci): accept size growth from #1682 Esc redirect** (ee11380)
- **refactor(anthropic): split history repairs into their own module** (9eefcf8)
- **chore(ci): refresh test-size, panic and swallowed-error baselines** (9917388)
- **refactor(agent): move turn loop unit tests into sibling files** (222359d)
- **chore(ci): refresh code-size baseline to current master** (a259905)
- **style(id): return the session-name selection directly (clippy let_and_return)** (77f4f9d)
- **ci: allow fork PR builds without an unused SSH deploy key** (0274343)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/1jehuang/jcode?utm_source=github-action)._