claudekit / updates / claude-code-2-1-239
[ PATCH · ]

Claude Code 2.1.239

The headline fix is Bedrock streaming behind proxies that strip the response Content-Type header, which silently doubled billed API calls by re-running every turn non-streaming. Cost estimates (`/cost`, status line, `--max-budget-usd`) now include the 1.1× US-only-inference premium for data-residency workspaces, and a new `/claude-api upgrade` migrates Python projects from `anthropic` 0.x to 1.x. Windows gains cross-session messaging, so sessions across your machines can reach each other with `SendMessage` and `ListAgents` as on macOS and Linux, and plugins synced from claude.ai now show as `name@synced` in cloud sessions. More than 50 changes land in total, clustered around `/resume` session pickup and titles, fullscreen rendering, and prompt-input editing.

Official announcement →

This article is a summary based on official documentation.

What changed

Claude Code 2.1.239 shipped on August 21, 2026. It is a fix-heavy release: most of its 50-plus changes are bug fixes. The one with real money attached is Bedrock streaming behind proxies that strip the response Content-Type header — every turn was re-run non-streaming, silently doubling billed API calls. Cost reporting was corrected too, so the 1.1× US-only-inference premium for data-residency workspaces now shows up in the numbers. The rest clusters around /resume, fullscreen rendering, and prompt-input editing.

New features

  • /claude-api upgrade

    Migrating a Python project from anthropic 0.x to 1.x meant finding and rewriting each changed call yourself. /claude-api upgrade now performs that migration, and the skill’s Python reference was updated for 1.x — timeouts use anthropic.Timeout, not httpx.Timeout.

  • Windows: cross-session messaging

    Cross-session messaging was macOS and Linux only, so Windows sessions couldn’t find or reach each other. Claude Code sessions across your machines can now message each other with SendMessage and find each other with ListAgents, as on macOS and Linux.

Key improvements

  • Cost estimates include the data-residency premium

    Data-residency workspaces are billed at 1.1× for US-only inference, but /cost, the status line, and --max-budget-usd left that multiplier out, so estimates read low against the actual bill. All three now include it.

  • Fullscreen renderer offer on Bedrock, Vertex, and Foundry

    These setups were excluded from the one-time fullscreen renderer offer, so it never appeared. The offer now shows there, and new installs on those setups start in fullscreen.

  • Synced plugins are distinguishable in cloud sessions

    Plugins synced from claude.ai were indistinguishable by name from ones you installed, so a same-named pair could clobber each other. Synced plugins now show as name@synced, work with claude plugin enable/disable <name>@synced, and never override a same-named plugin you installed.

  • Alpine/musl add-ons load

    On Alpine and other musl systems, the native image paste, clipboard, and audio-capture add-ons were glibc-built and the runtime refused them. Musl-built binaries now ship, so the add-ons load.

  • Usage-limit message names the session and weekly resets

    The message shown when your monthly spend limit is already used up stated only that fact, with no indication of when you could work again. It now also says when your session or weekly limit resets.

  • Post-compaction reminder — the reminder shown after compaction could get a skill’s original arguments re-run as a new request. Its wording was improved so that no longer happens.

  • /goal check-in cadence — repeat check-ins on long-running background work now back off (30 min, then 1 h, then every 2 h) instead of repeating every 30 minutes. Resuming a session from the claude --resume picker also restores its active goal.

  • ListAgents reports your own name and your teammates — a session had no way to learn the name its peers use to message it. ListAgents now tells a session its own name, and SendMessage to your own name says so instead of “no agent named …”. ListAgents and /list-agents also list your live teammates; previously only subagents and other sessions appeared, so a reachable teammate looked absent.

  • keybindingFlavor: "readline" word keys — the readline flavor still diverged from Bash on word motions. It now also matches Bash for word keys: Alt+F and Ctrl/Option+→ stop at the end of the word, Alt+D deletes to it (Ctrl+Y pastes it back), and punctuation separates words.

  • Persistent retry mode fails fast on spend limits — CLAUDE_CODE_RETRY_WATCHDOG waited indefinitely for a reset on organization spend-limit and out-of-credits errors. It now fails immediately on both.

  • Keep-alives during long startup hooks — remote sessions keep sending keep-alives while a long SessionStart or Setup hook runs, so the container is not idle-reaped mid-hook.

  • Mobile image uploads carry a file path — images uploaded from mobile to a remote session had no saved path, so Claude couldn’t copy them into files it creates. They now include their saved file path.

  • Claude in Chrome tab-group cleanup — /clear now closes the session’s Chrome tab group, and empty groups are closed on /resume and when Claude Code exits.

  • Web sessions route non-API anthropic.com traffic through the proxy — on Claude Code on the web, requests from Bash and other tools to non-API anthropic.com hosts (e.g. www, docs) bypassed the session’s network proxy. They now go through it, so your environment’s allowed domains apply.

  • Remote Control availability messaging — clearer message and claude doctor wording when Remote Control isn’t enabled for your account.

  • Long file paths on tool-use rows — they now truncate in the middle to stay on one line.

  • [VSCode] usage-limit banner — “View usage” now sits inline with the warning text instead of floating mid-banner.

Bug fixes

Bedrock & proxies

  • Bedrock streaming behind proxies that strip the response Content-Type header — fixed; this silently doubled billed API calls by re-running every turn non-streaming.
  • Claude Code hanging at startup behind an HTTPS proxy when using Bedrock with an SSO profile and awsAuthRefresh — fixed; the credential pre-check now honors HTTPS_PROXY.
  • A request rejected by an organization policy check being re-sent before the rejection was shown — fixed.

Session resume & session lists

  • Custom session titles disappearing from /resume after more than ~64 KB of conversation was written following the rename — fixed.
  • claude -c/resume picking up sessions from a different directory whose path differed only by characters like _, -, or . — fixed.
  • /resume and the agents view showing a session as recently changed (and reordering it) when only its file was touched or it was merely reopened — fixed.
  • /resume in all-projects mode telling you to cd into a deleted directory (e.g. a removed worktree) — fixed; such sessions now resume in the current directory.
  • A race where pressing Esc with a prompt queued could let the next turn finish early — fixed; this left the session idle while Claude was still working, and let a later resubmit repeat actions.
  • Cloud sessions (Claude Code on the web, desktop and mobile apps) resuming out of plan mode after an idle worker restart — fixed.
  • Runaway session-title syncing to Remote Control when two Claude Code processes shared one background job’s state (a 2.1.232 regression) — fixed; title updates are now deduplicated and rate-limited.
  • Sessions whose title starts with / being unaddressable by SendMessage and shown as “(untitled)” in ListAgents — fixed.

MCP

  • MCP elicitation forms taller than the terminal being clipped in fullscreen mode — fixed; the form now fits the window, with hidden fields reachable by scrolling and Accept/Decline always visible.
  • Remote MCP servers staying failed after a transient 5xx on a mid-session reconnect — fixed; this affected cloud sessions and SDK setMcpServers().

Rendering & fullscreen

  • The dark-ansi theme rendering expanded tool results in fullscreen mode with text the same color as the background — fixed.
  • The fullscreen renderer prompt reappearing on every launch when it could never be answered — fixed; it now stops after being shown on three launches.
  • Mouse movement in browser-based terminals inserting text like "35;150;7M" into the prompt — fixed; this happened when a mouse report arrived split across writes.
  • Custom theme overrides for the effort/ultracode status badge colors being ignored — fixed.
  • Fullscreen mode answering a permission prompt or pressing a button when you clicked the terminal window only to bring it back into focus — fixed.
  • Slash-command panels (e.g. /config, /model) in fullscreen mode covering the latest messages — fixed; the conversation now stays pinned above the panel.
  • The /workflows detail dialog overflowing the terminal and losing its header off-screen when opened while Claude is still responding — fixed.
  • Edit and Write calls pausing for about 5 seconds in JetBrains IDE terminals when the Claude Code plugin is connected — fixed.

Prompt input editing

  • Vim mode in the agent view clearing the prompt on Escape — fixed; Escape now switches to NORMAL mode and keeps your text.
  • The selection:copy keybinding silently dropping a text selection that had been extended with Shift+Arrow keys — fixed.
  • Ctrl+W, Ctrl+U, Ctrl+K, Option+Backspace, Option+D and vim df/dt leaving a broken [Pasted text #N] placeholder when the cursor was inside it — fixed.
  • Masked (password-style) inputs such as the login code field letting their text be pasted back with Ctrl+Y elsewhere or saved to prompt history when cleared with double Esc — fixed.
  • Ctrl+Backspace deleting one character instead of a word in search boxes — fixed.
  • Shell-mode (!) Tab completion dropping the ./ from a ./script path — fixed; this left a command the shell couldn’t run.
  • The /voice startup tip still appearing after voice dictation was enabled via the voice.enabled setting — fixed.

Config files & execution environment

  • .worktreeinclude patterns starting with **/ silently matching nothing when the target lived in a gitignored directory — fixed.
  • Agents, skills, and commands whose .md file starts with a UTF-8 BOM being silently ignored — fixed.
  • Marketplace metadata.pluginRoot having no effect — fixed; bare plugin source names now resolve under it as the docs describe.
  • claudeMdExcludes not excluding a symlinked .claude/rules file when the pattern names the rules directory or the symlink rather than its target — fixed.
  • The Linux sandbox making a nonexistent .git/config.worktree unreadable — fixed; this broke every sandboxed git command in repos with extensions.worktreeConfig set.
  • Hooks failing with “posix_spawn ENOENT” after the session’s working directory was deleted — fixed; they now run from the project root or home directory instead.
  • A raw crash dump when starting Claude Code from a directory that no longer exists — fixed; it now prints a clear message.
  • WebFetch retaining expired page content in memory for the whole session instead of the intended 15 minutes — fixed.
  • /insights echoing literal <message> tags in its response on some models — fixed.
  • OpenTelemetry trace fragmentation — fixed; tool executions deferred by a PreToolUse hook now resume in the original turn’s trace instead of starting a new trace.

Notes

  • If you run Bedrock behind a proxy, check your recent bill — behind proxies that strip the response Content-Type header, every turn was re-run non-streaming, so billed API calls were silently doubled until this release.
  • A higher /cost figure is not a price increase — data-residency workspaces were already billed at 1.1× for US-only inference; this release adds that multiplier to /cost, the status line, and --max-budget-usd.
  • The fullscreen offer now stops after three launches — on Bedrock, Vertex, and Foundry it appears for the first time in this release, and new installs there start in fullscreen.
  • Cross-session messaging is available on Windows — SendMessage and ListAgents work across your machines as they do on macOS and Linux.
  • Synced plugins are addressed as name@synced — use claude plugin enable/disable <name>@synced, and a same-named plugin you installed yourself is never overridden.
  • CLAUDE_CODE_RETRY_WATCHDOG no longer waits out spend limits — organization spend-limit and out-of-credits errors now fail immediately rather than being retried, so they need a billing or limit change.