Skip to content

Tags: headroomlabs-ai/headroom

Tags

v0.42.0

Toggle v0.42.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.42.0 (#4228)

🤖 I have created a release *beep* *boop*
---


##
[0.42.0](v0.41.0...v0.42.0)
(2026-10-26)


### Features

* **pipeline:** put per-request saved tokens on OutcomeSnapshot
([#4231](#4231))
([8cedf7b](8cedf7b))
* **proxy:** let turn hooks rewrite OpenAI Responses requests on HTTP
and WebSocket
([#4232](#4232))
([fbf7bc3](fbf7bc3))
* **proxy:** report the same tool savings on gateway /v1/compress as the
proxy path
([#4467](#4467))
([a904210](a904210))
* **savings:** add the per-request counterfactual savings record
([#4236](#4236))
([2912b7b](2912b7b))


### Bug Fixes

* **batch:** preserve live contexts during capacity cleanup
([#4210](#4210))
([2cbdd22](2cbdd22))
* **batch:** preserve native Gemini continuation tools
([#4211](#4211))
([8757458](8757458))
* **cache:** bound the router's compression cache, keep the rest in
SQLite
([#4357](#4357))
([b196424](b196424))
* **cache:** keep indented lines intact in OpenAI whitespace
normalization
([#4343](#4343))
([2480100](2480100))
* **cache:** keep prefix-tracker state across a graceful proxy restart
([#4299](#4299))
([62b3bed](62b3bed))
* **ccr:** recognize client-owned MCP retrieval aliases
([#4165](#4165))
([89545fb](89545fb))
* **ccr:** stream the buffered CCR upstream request so idle-killing
networks cannot cut it
([#4206](#4206))
([ca6ba34](ca6ba34))
* **ci:** pin checkout in release notification smoke workflow
([#4399](#4399))
([70273db](70273db))
* **copilot:** detect COPILOT_API_URL in cli-main.js for Copilot CLI
>= 1.0.93
([#4450](#4450))
([043fe09](043fe09))
* **copilot:** preserve native inline OAuth identity
([#4144](#4144))
([ad62166](ad62166))
* **deps:** bump rustls to 0.23.46 for RUSTSEC-2026-0346..0349
([#4222](#4222))
([132dbc7](132dbc7))
* **deps:** patch OpenClaw Undici and narrow E2E audit exceptions
([#4453](#4453))
([1be699f](1be699f))
* **deps:** require hf-xet>=1.6.0 so a Hub download can't crash
Python at exit
([#4192](#4192))
([9e5dac7](9e5dac7))
* **deps:** require mcp>=1.30.0 for CVE-2026-59951
([#4239](#4239))
([2f7a83a](2f7a83a))
* **gateway:** keep input_includes_cache when re-drive usage is merged
([#4423](#4423))
([3f94144](3f94144))
* **gemini:** keep snake_case inline_data and function parts when
compressing
([#4290](#4290))
([4bf1bf5](4bf1bf5))
* **image:** clear last_result before each compress() call
([#4341](#4341))
([19c91a8](19c91a8))
* **image:** flatten transparent images onto white before re-encoding as
JPEG ([#4296](#4296))
([9f5cfcf](9f5cfcf))
* **install:** keep the HuggingFace cache on a writable mount in Docker
presets
([#4207](#4207))
([#4209](#4209))
([7b6cb77](7b6cb77))
* **kompress:** skip the local model download when a remote endpoint is
set ([#4234](#4234))
([ff36931](ff36931))
* **kompress:** time each model-load stage and stop false not-ready
warnings during warm-up
([#4195](#4195))
([89b229c](89b229c))
* **learn:** anchor the managed block on its last start marker, append
when no end marker
([#4342](#4342))
([45dacc1](45dacc1))
* **learn:** keep the digest's loop section inside its budget
([#4269](#4269))
([506ba16](506ba16))
* **logs:** count omitted levels from dropped lines
([#4141](#4141))
([023dd1b](023dd1b))
* **mcp:** accept the JSONC opencode config that wrap and install
already accept
([#4297](#4297))
([9202948](9202948))
* **memory:** bound retrieval queries before embedding
([#4244](#4244))
([8c07cf4](8c07cf4))
* **memory:** ignore incidental cwd prose
([#4166](#4166))
([3765439](3765439))
* **memory:** log storage and SQLite failures that currently make
retrieval miss silently
([#4111](#4111))
([4e6e955](4e6e955))
* **memory:** resolve partial IDs beyond the first 1000 records
([#4389](#4389))
([c4ea31b](c4ea31b))
* **memory:** treat a cwd with no UTF-8 form as unresolved instead of
raising
([#4167](#4167))
([760c05e](760c05e))
* **openai:** read Responses cache_write_tokens instead of inferring
writes
([#4237](#4237))
([4630602](4630602))
* **openai:** recompress cached Responses units whose CCR entries
expired
([#4146](#4146))
([8f7b419](8f7b419))
* **opencode:** do not rewrite an OpenCode config that fails to parse
([#4424](#4424))
([0fe0a59](0fe0a59))
* **opencode:** restore process env keys on transport dispose
([#4430](#4430))
([d17bac8](d17bac8))
* **pricing:** suppress litellm's Provider List banner that corrupts
perf JSON
([#4197](#4197))
([e01ad35](e01ad35))
* **proxy:** accept HEADROOM_MEMORY_INJECTION_MODE=tool
([#4395](#4395))
([f89c928](f89c928))
* **proxy:** bound per-model state keyed by the client model string
([#4407](#4407))
([33e5f67](33e5f67))
* **proxy:** copy cached tool compaction results (hardening)
([#4410](#4410))
([a256231](a256231))
* **proxy:** count output tokens from CRLF-framed SSE streams too
([#4298](#4298))
([755293d](755293d))
* **proxy:** do not rebuild a failed turn-hook re-drive as HTTP 200
([#4398](#4398))
([f59c8ff](f59c8ff))
* **proxy:** drop web_search_call history from a Responses request with
no web_search tool
([#4202](#4202))
([2a70d12](2a70d12))
* **proxy:** honor bypass header and license gate in Anthropic batch
create
([#4411](#4411))
([4fd9cdd](4fd9cdd))
* **proxy:** import Response at runtime in the Bedrock handler
([#4397](#4397))
([51e4ae3](51e4ae3))
* **proxy:** judge NAT64 upstream addresses by their embedded IPv4
([#4179](#4179))
([486afaa](486afaa))
* **proxy:** keep in-period costs in the budget ledger when the entry
cap is reached
([#4448](#4448))
([41c15b3](41c15b3))
* **proxy:** keep negative compression savings across restart
([#4406](#4406))
([bebe24c](bebe24c))
* **proxy:** keep tool deferral for GitHub Copilot upstream
([#4356](#4356))
([217b658](217b658))
* **proxy:** let HEADROOM_LOG_LEVEL=debug turn on Headroom's own debug
logs ([#4137](#4137))
([00093ce](00093ce))
* **proxy:** make handler failures debuggable from the logs
([#4127](#4127))
([7dc20b6](7dc20b6))
* **proxy:** net tools a turn hook adds against the saving it books
([#4057](#4057))
([85520c2](85520c2))
* **proxy:** record a stream the client closes after its terminal event
as completed
([#4286](#4286))
([762a337](762a337))
* **proxy:** record outcome when a passthrough stream ends mid-character
([#4429](#4429))
([75cfbba](75cfbba))
* **proxy:** report disabled Kompress at startup
([#4217](#4217))
([430ea4f](430ea4f))
* **proxy:** report read maturation as inert in cache mode
([#4198](#4198))
([ba82453](ba82453))
* **proxy:** show turn-hook savings in /stats extension_savings, incl.
Codex WS
([#4233](#4233))
([1d112cd](1d112cd))
* **proxy:** snapshot the original messages when a turn hook can edit
them ([#4241](#4241))
([df11f27](df11f27))
* **relevance:** load the default embedder from one pinned snapshot
([#4152](#4152))
([f380692](f380692))
* **savings:** key a Responses conversation on its thread, not the
shared session
([#4440](#4440))
([11f743d](11f743d))
* **sdk:** preserve Vercel AI SDK file and image parts through
compression
([#4048](#4048))
([1668a6c](1668a6c))
* **security:** restrict the Windows runtime log via NTFS ACL, not just
warn ([#4135](#4135))
([125a703](125a703))
* **smart-crusher:** match audit-safe protected_patterns against
unescaped text
([#4294](#4294))
([e11afdb](e11afdb))
* **storage:** normalize timezone-aware JSONL time filters
([#4063](#4063))
([bf34ccf](bf34ccf))
* **tabular:** pass tables with repeated header names through verbatim
([#4278](#4278))
([ed3195b](ed3195b))
* **telemetry:** give empty-item compressions a stable tool signature
([#4396](#4396))
([a79def4](a79def4))
* **telemetry:** let HEADROOM_TELEMETRY=off stop the anonymous beacon
([#4235](#4235))
([1a40b3c](1a40b3c))
* **transforms:** keep the fences of a code block passed through for a
protected tag
([#4292](#4292))
([02958c6](02958c6))
* **transforms:** log the compression failures that silently become "no
savings"
([#4092](#4092))
([580cc83](580cc83))
* **zcode:** skip providers that point at the Headroom proxy itself
([#4413](#4413))
([9ac1b52](9ac1b52))


### Dependencies

* Bump base64 from 0.22.1 to 0.23.1
([#4029](#4029))
([8d468d4](8d468d4))
* Bump ruff from 0.16.8 to 0.17.0 in the pip-minor-patch group across 1
directory
([#4026](#4026))
([de3f639](de3f639))
* Bump the cargo-minor-patch group across 1 directory with 12 updates
([#4186](#4186))
([683c9a6](683c9a6))
* Bump the npm-minor-patch group across 2 directories with 16 updates
([#4218](#4218))
([07c8bbf](07c8bbf))
* Bump the npm-minor-patch group across 3 directories with 12 updates
([#4219](#4219))
([1f71cb3](1f71cb3))
* Update huggingface-hub requirement from <2.0,>=1.5.0 to
>=1.5.0,<3.0
([#4027](#4027))
([fcf3db8](fcf3db8))


### Code Refactoring

* **integrations:** share the local/cloud compress backend of asgi and
litellm_callback
([#4124](#4124))
([58caafb](58caafb))
* **transforms:** share one CCR persist helper for the Rust-backed
compressors
([#4094](#4094))
([ea947ca](ea947ca))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.41.0

Toggle v0.41.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.41.0 (#4002)

🤖 I have created a release *beep* *boop*
---


##
[0.41.0](v0.40.0...v0.41.0)
(2026-10-13)


### Features

* **antigravity:** add native Google Antigravity IDE integration
([#3817](#3817))
([cd4367b](cd4367b))
* **opencode:** support the OpenCode 2.x plugin API
([#3999](#3999))
([1d4b357](1d4b357))
* **plugins:** add headroom-snip Claude Code mod that animates
compression
([#3980](#3980))
([17abee2](17abee2))
* **proxy:** native spend/savings stats + dashboard for the Rust proxy
([#2321](#2321))
([70b21c1](70b21c1))
* **router:** add max_output_tokens condition to ModelRoute
([#3898](#3898))
([01185e3](01185e3))
* **savings:** per-agent attribution in history checkpoints and rollups
([#2627](#2627))
([489de46](489de46))
* show the Headroom for Teams offer in the dashboard, docs, llms.txt and
release notes
([#3991](#3991))
([1ad92f0](1ad92f0))


### Bug Fixes

* **anthropic:** route /api/hello connectivity probes to Anthropic
([#3336](#3336))
([#4059](#4059))
([931e5b9](931e5b9))
* **beacon:** stop Cloudflare logging senders' IP addresses
([#4018](#4018))
([db983ba](db983ba))
* **cache:** keep cache mode when Claude Code re-serializes its last
reply ([#4003](#4003))
([aeb09f8](aeb09f8))
* **cache:** retain prefix trackers for the provider cache lifetime
([#4023](#4023))
([9553d42](9553d42))
* **cache:** stop Claude Code forks from cold-starting the
conversation's lineage
([#4043](#4043))
([1cf4d05](1cf4d05))
* **ccr:** serve headroom_retrieve when the model calls it alongside
client tools
([#4034](#4034))
([01d9194](01d9194))
* **cli:** name the broken Codex config, write init configs atomically,
keep the identity check
([#4129](#4129))
([976aa71](976aa71))
* **cli:** pass configured SSL context to stdlib urlopen calls
([#4011](#4011))
([22d0905](22d0905))
* **cli:** say why the proxy failed to start
([#4120](#4120))
([f3d240b](f3d240b))
* **codex:** make unwrap codex remove headroom init routing
([#3920](#3920))
([3260795](3260795))
* **codex:** preserve auth.json API keys through Headroom
([#3355](#3355))
([a6523b1](a6523b1))
* **copilot:** honour GitHub's advertised Business/Enterprise host by
default
([#4155](#4155))
([1dc7a18](1dc7a18))
* **copilot:** send VS Code next-edit requests to the completions host
([#4188](#4188))
([22a1296](22a1296))
* **dashboard:** keep savings profile visible in light mode
([#2544](#2544))
([4e4f49d](4e4f49d))
* **dashboard:** show the effective value in settings enum selects
([#4032](#4032))
([20ce054](20ce054))
* **deps:** bump quinn-proto to 0.11.19 for RUSTSEC-2026-0338..0342
([#4178](#4178))
([49751ec](49751ec))
* **deps:** clear the two high npm advisories failing the Security
workflow
([#4004](#4004))
([5a516b5](5a516b5))
* **deps:** recommend headroom-ai for optional extras
([#4046](#4046))
([f1bc260](f1bc260))
* **deps:** support Intel macOS ONNX Runtime resolution
([#3823](#3823))
([51ec6e8](51ec6e8))
* **docker:** adds mount for the litellm config dir
([#2454](#2454))
([64a661d](64a661d))
* **gateway:** report why /v1/compress/response rejected a body
([#4081](#4081))
([5cac7ab](5cac7ab))
* **grok:** attribute api.x.ai chat outcomes as provider xai, recognize
grok-shell UA
([#2626](#2626))
([b1fb162](b1fb162))
* **install/windows:** back persistent-service with an always-on task
([#1866](#1866))
([#2460](#2460))
([5682883](5682883))
* **install:** distinguish protocol targets in status
([#4040](#4040))
([79f2c27](79f2c27))
* **install:** keep an explicitly empty dashboard allowlist on Windows
PowerShell 5.1
([#4012](#4012))
([c195a12](c195a12))
* **install:** preserve OpenCode edits during reactivation
([#4022](#4022))
([40955b0](40955b0))
* **learn:** decode sanitized pattern-id markers and keep visible-text
dedup keys
([#3956](#3956))
([ec1ba70](ec1ba70))
* **learn:** make live traffic learning use the shared error classifier
([#4110](#4110))
([e6eaa41](e6eaa41))
* **learn:** pin the learned verbosity level on a cache-mode proxy
([#4033](#4033))
([71663b4](71663b4))
* **logging:** add payload-safe helpers for exceptions, URLs, ids and
repeat warnings
([#4138](#4138))
([bebe559](bebe559))
* **onnx:** stop magika's ORT intra-op pool from spinning idle cores
([#4189](#4189))
([2016dc6](2016dc6))
* **openclaw:** preserve tool-call thought signatures
([#4038](#4038))
([37f3f9e](37f3f9e))
* **plugins/openclaw:** keep compression system-prompt notice
cache-stable
([#3811](#3811))
([f885187](f885187))
* **pricing:** reconcile cache billing with model-specific LiteLLM rates
([#3033](#3033))
([463c1a4](463c1a4))
* **providers:** drop the shadowed POST /v1/messages route spec
([#4075](#4075))
([69a16cb](69a16cb))
* **proxy/bedrock:** record the real upstream status on InvokeModel
outcomes
([#4025](#4025))
([159daa2](159daa2))
* **proxy/streaming:** tolerate malformed upstream SSE events
([#2558](#2558))
([d091fbd](d091fbd))
* **proxy:** astgrep disk verify truncation
([#3192](#3192))
([1fb4cba](1fb4cba))
* **proxy:** break the compact-every-turn loop near the real context
window
([#2942](#2942))
([76cceeb](76cceeb))
* **proxy:** classify failed streams as failed requests
([#3747](#3747))
([42d4f58](42d4f58))
* **proxy:** don't retry a 429/529 that cannot succeed within the
backoff cap
([#3992](#3992))
([a961a6f](a961a6f))
* **proxy:** don't send a memory continuation with unanswered client
tool calls
([#4009](#4009))
([#4013](#4013))
([87e05b6](87e05b6))
* **proxy:** forward x-litellm-key-* headers on streaming path
([#2532](#2532))
([33ade5b](33ade5b))
* **proxy:** ignore defer_loading when measuring a turn hook's tool
delta ([#4056](#4056))
([f8212a3](f8212a3))
* **proxy:** keep Claude Haiku 5.5 mid-conversation system messages in
place ([#4153](#4153))
([a9eb2a7](a9eb2a7))
* **proxy:** keep leading Anthropic system payloads valid
([#3671](#3671))
([d9e29bb](d9e29bb))
* **proxy:** log the savings and metrics failures that currently vanish
([#4084](#4084))
([2800932](2800932))
* **proxy:** read stream cache usage from message_delta; keep Fireworks
sessions on one replica
([#4174](#4174))
([30b22df](30b22df))
* **proxy:** record the provider's billed input count on streamed turns
([#4052](#4052))
([a9815bb](a9815bb))
* **proxy:** say why proxy.log is missing and why a knob or extension
was ignored
([#4088](#4088))
([72302a3](72302a3))
* **release:** synchronize editable uv lock version
([#4054](#4054))
([3f99066](3f99066))
* **router:** bound ML compression per request, not just per block
([#3721](#3721))
([f37980f](f37980f))
* **router:** preserve nested JSON records through compression
([#3680](#3680))
([fd06703](fd06703))
* **savings,ccr:** log the ledger and MCP failures that are swallowed
silently
([#4105](#4105))
([97680e7](97680e7))
* **savings:** don't let a thin holdout arm decide the headline number
([#3127](#3127))
([2a12e03](2a12e03))
* **security:** resolve 23 open CodeQL alerts
([#4045](#4045))
([a88e2d5](a88e2d5))
* **security:** resolve high-severity CodeQL alerts
([#4005](#4005))
([dea9092](dea9092))
* **smart-crusher:** preserve wrapped retrieval results in apply
([#4149](#4149))
([9762a14](9762a14))
* **subscription:** log a failed OTEL window update instead of passing
silently
([#4131](#4131))
([7d9dd55](7d9dd55))
* **toin:** make diagnostic pattern identifiers addressable
([#4021](#4021))
([def6d41](def6d41))
* **transforms:** log failed transforms with tracebacks
([#3981](#3981))
([a654558](a654558))
* **wrap:** carry the shared proxy's extensions over to a dedicated
Copilot proxy
([#4154](#4154))
([feea130](feea130))
* **wrap:** let `wrap opencode` target a third-party OpenAI-compatible
upstream
([#3125](#3125))
([0d7d61d](0d7d61d))
* **wrap:** reject saved bob gateway URLs the proxy would not route
([#3975](#3975))
([944eafc](944eafc))
* **wrap:** trim the wrap claude startup banner
([#3900](#3900))
([aba75cb](aba75cb))
* **wrap:** warn when reused proxy ignores compression settings
([#4019](#4019))
([278bbc8](278bbc8))


### Performance Improvements

* **proxy:** avoid eager dependency imports
([#3546](#3546))
([59bd482](59bd482))


### Code Refactoring

* **backends:** reuse the LiteLLM tool converters in the any-llm backend
([#4076](#4076))
([03538f2](03538f2))
* **cli:** one missing-binary error for every wrap command
([#4122](#4122))
([2c2357a](2c2357a))
* **cli:** remove test-only and dead helpers from wrap, proxy and mcp
([#4118](#4118))
([73f59a3](73f59a3))
* **compression:** deprecate the test-only UniversalCompressor package
([#4095](#4095))
([fc8ff5a](fc8ff5a))
* **core:** remove unreferenced helpers, attributes and a shadowed
module
([#4091](#4091))
([08fce18](08fce18))
* **graph:** drop the bespoke codebase-memory-mcp downloader nothing
calls ([#4102](#4102))
([30d23fb](30d23fb))
* **mcp_registry:** share spec helpers and fold GrokRegistrar onto the
Codex TOML registrar
([#4121](#4121))
([6e14ee0](6e14ee0))
* **memory,learn,cache:** remove unreferenced classes, methods and
constants
([#4112](#4112))
([abbf36f](abbf36f))
* **memory:** deprecate the never-wired agent memory writers
([#4101](#4101))
([2e497cb](2e497cb))
* **memory:** deprecate the orphaned Mem0SystemAdapter
([#4114](#4114))
([7387b8c](7387b8c))
* **memory:** drop the unused extraction prompts and tool schemas
([#4100](#4100))
([6d23895](6d23895))
* **memory:** remove the unused memory budget manager
([#4099](#4099))
([e7ac6ca](e7ac6ca))
* **proxy:** delete the unused memory_tool_adapter module
([#4071](#4071))
([7e5d97f](7e5d97f))
* **proxy:** drop the test-only memory ranker and file-backed native
memory ops
([#4072](#4072))
([fc5ac70](fc5ac70))
* **proxy:** parse HEADROOM_OUTPUT_HOLDOUT in one place
([#4082](#4082))
([1a4e419](1a4e419))
* **proxy:** remove dead aliases and wrappers from helpers,
body_forwarding, forwarded_headers
([#4080](#4080))
([63cc9af](63cc9af))
* **proxy:** remove dead wiring and unused re-exports from server.py
([#4073](#4073))
([58387c1](58387c1))
* **proxy:** remove test-only and dead helpers from the handlers
([#4117](#4117))
([31d378b](31d378b))
* **proxy:** remove the unreachable debug branches from the Responses
payload compressor
([#4116](#4116))
([132cd58](132cd58))
* **proxy:** remove the unreachable debug branches from the Responses
unit router
([#4115](#4115))
([25cc2d5](25cc2d5))
* **proxy:** remove unreferenced and test-only helpers
([#4074](#4074))
([e5cbec5](e5cbec5))
* remove test-only compatibility helpers in rollout and agent_savings
([#4089](#4089))
([310c108](310c108))
* remove write-only and test-only code in subscription and install
([#4123](#4123))
([c191bee](c191bee))
* **transforms:** deprecate the unused Python AnchorSelector port
([#4104](#4104))
([9b1971d](9b1971d))
* **transforms:** deprecate unused compress_with_stats, extract_batch
and align_for_cache
([#4098](#4098))
([e4a1ec1](e4a1ec1))
* **transforms:** drop the Python mirror of the Rust log selector
([#4096](#4096))
([a20c76c](a20c76c))
* **transforms:** drop the Python mirror of the Rust search selector
([#4103](#4103))
([47f8710](47f8710))
* **transforms:** remove the unused summarize_dropped_items
([#4093](#4093))
([eaa7308](eaa7308))
* **transforms:** remove unused convenience wrappers and helpers
([#4097](#4097))
([5c72d82](5c72d82))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.40.0

Toggle v0.40.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.40.0 (#3833)

🤖 I have created a release *beep* *boop*
---


##
[0.40.0](v0.39.1...v0.40.0)
(2026-10-06)


### ⚠ BREAKING CHANGES

* **proxy:** read HEADROOM_LICENSE and make usage reporting opt-in
([#3857](#3857))
* drop the crewai extra to remove chromadb from the lockfile
([#3870](#3870))

### Features

* **compress:** add per-message compression diagnostics
([#3058](#3058))
([fef99cc](fef99cc))
* **compress:** live-agent densify mode, lossless and cache-safe
([#1402](#1402))
([84f0e84](84f0e84))
* **dashboard:** add CO₂ Saved card to dashboard and /stats API
([#1369](#1369))
([2bc9419](2bc9419))
* **dashboard:** give savings metrics one canonical home
([#3320](#3320))
([6af7efe](6af7efe))
* **learn:** add agy (Antigravity CLI) as an analysis backend
([#3939](#3939))
([4ba231a](4ba231a))
* **live-zone:** wire the SourceCode and PlainText dispatch arms
([#3227](#3227))
([49f69be](49f69be))
* **memory:** persist TrafficLearner pending evidence across restarts +
expose learner stats
([#3104](#3104))
([4257ed4](4257ed4))
* **proxy:** add x-headroom-keep-last-turns header for per-request
context trimming (issue
[#2858](#2858))
([#3059](#3059))
([246162d](246162d))
* **proxy:** route Gemini plugin traffic through native transforms
([#2697](#2697))
([0ad996a](0ad996a))
* **proxy:** serve on a Unix domain socket (--uds)
([#3151](#3151))
([e7b3baf](e7b3baf))
* **wrap:** add headroom wrap bob for IBM Bob CLI
([#3801](#3801))
([0b7dab4](0b7dab4))
* **wrap:** extend reduce-at-source quiet defaults to telemetry/nag
banners
([#2550](#2550))
([3a3a465](3a3a465))


### Bug Fixes

* **anthropic:** preserve failed CCR continuations
([#3843](#3843))
([94bb055](94bb055))
* **backends/anyllm:** map Anthropic tool_choice none to OpenAI none
([#3963](#3963))
([d722a64](d722a64))
* **backends/litellm:** align streaming usage tokens with the
non-streaming path
([#2688](#2688))
([90a68e0](90a68e0))
* **backends/litellm:** keep the upstream 4xx status on send_message
errors
([#3944](#3944))
([e0e41cd](e0e41cd))
* **backends/litellm:** map Anthropic tool_choice none to OpenAI none
([#2689](#2689))
([57a5708](57a5708))
* **backends/litellm:** match the caller-key Bearer scheme
case-insensitively (RFC 7235)
([#3965](#3965))
([848d7a0](848d7a0))
* **backends/litellm:** report requested model in OpenAI streaming
chunks
([#2690](#2690))
([8538a83](8538a83))
* **cache:** keep prefix lineage across a replaced system tail
([#3934](#3934))
([16eaec1](16eaec1))
* **ccr:** answer headroom_retrieve on the direct chat path instead of
forwarding it
([#3816](#3816))
([126e144](126e144))
* **ccr:** inject headroom_retrieve before the prefix is warm, not after
([#3810](#3810))
([bb8c285](bb8c285))
* **ccr:** only proactively expand compressions present in the
requesting conversation
([#3924](#3924))
([9b9a883](9b9a883))
* **ccr:** unwrap Hermes batched tool_call so headroom_retrieve stays
exempt
([#3839](#3839))
([2f07668](2f07668))
* **ci:** clear dependency audit and gate Docker publishing
([#3984](#3984))
([67ce7d0](67ce7d0))
* **ci:** keep hard watchdog out of pytest shards
([#3845](#3845))
([2527431](2527431))
* **ci:** tolerate missing Docker cache blobs
([#3945](#3945))
([540f4da](540f4da))
* clarify CCR marker content preservation
([#3175](#3175))
([005a4e1](005a4e1))
* **cli:** honor CODEX_HOME and align wrap/init/doctor with the live
proxy port
([#3855](#3855))
([5bf6612](5bf6612))
* **cli:** strip unmarked headroom_memory TOML table before injecting
([#3490](#3490))
([08dda4c](08dda4c))
* **codex:** explain why wrapped Codex runs without the shared server
([#3899](#3899))
([1982b3a](1982b3a))
* **codex:** preserve remote compaction in init config
([#3410](#3410))
([6df4a96](6df4a96))
* **codex:** resolve per-turn project context
([#2636](#2636))
([0396ea2](0396ea2))
* **codex:** strip stale compression framing on the Responses subpath
passthrough
([#3792](#3792))
([0eba65c](0eba65c))
* **copilot:** defer keychain auth lookup
([#2739](#2739))
([81a8a28](81a8a28))
* **copilot:** read timezone-naive token expiry as UTC, not host local
time ([#3216](#3216))
([2b2dc1b](2b2dc1b))
* **copilot:** warn when a VS Code profile cannot see the proxy settings
([#3919](#3919))
([7b68fc2](7b68fc2))
* **deps:** patch brace-expansion in wrap E2E lockfile
([#3873](#3873))
([5e0435d](5e0435d))
* **deps:** patch urllib3 and Next.js advisories
([#3896](#3896))
([573e385](573e385))
* **doctor:** recognize Azure Foundry routing for Claude Code
([#1339](#1339))
([d5318ac](d5318ac))
* **grok:** route CLI traffic to api.x.ai on shared proxies
([#2693](#2693))
([ef1c528](ef1c528))
* honor configured port in container startup and healthcheck
([#2436](#2436))
([1b7977c](1b7977c))
* **install/apply:** add --no-rate-limit flag, persist in proxy_args
([#1350](#1350))
([#1365](#1365))
([31d0344](31d0344))
* **install:** parse Windows Task Scheduler XML output
([#3830](#3830))
([c32a4f4](c32a4f4))
* **install:** replace the launchd wrapper with the proxy listener
([#3224](#3224))
([44db755](44db755))
* **install:** use safe model backends for persistent services
([#3646](#3646))
([7287589](7287589))
* **integrations:** record metric timestamps in UTC, not naive local
time ([#3117](#3117))
([76ef2c3](76ef2c3))
* **kompress:** degrade when a native dep is installed but unloadable
([#3133](#3133))
([8f3d677](8f3d677))
* **kompress:** pin ModernBERT tokenizer and encoder revisions
([#3808](#3808))
([2de5828](2de5828))
* **learn:** drop the echoed prompt from a failed cli's error
([#3928](#3928))
([f00d425](f00d425))
* **learn:** keep CLAUDE.local.md out of git via .git/info/exclude
([#3108](#3108))
([c072251](c072251))
* **learn:** keep transcript-derived content inside the managed block
([#3850](#3850))
([c46e74d](c46e74d))
* **learn:** merge git worktree sessions into the repo's project
([#3854](#3854))
([3fdf18e](3fdf18e))
* **learn:** preserve stable traffic pattern items
([#2293](#2293))
([1631cde](1631cde))
* **learn:** recognize escaped persisted pattern IDs
([#3951](#3951))
([2e74f06](2e74f06))
* **learn:** run the claude-cli analysis with hooks disabled
([#3926](#3926))
([2a4d34c](2a4d34c))
* **learn:** run the claude-cli analysis with no tools
([#3892](#3892))
([db90b93](db90b93))
* **log_compressor:** keep and name pytest short-summary failures
([#3828](#3828))
([d90b320](d90b320))
* make Headroom work behind Zscaler and other TLS-inspecting networks
([#3831](#3831))
([66258c4](66258c4))
* **mcp:** bound version-detection git subprocess
([#3038](#3038))
([0712e04](0712e04))
* **mcp:** escape control characters when rendering TOML server blocks
([#3964](#3964))
([a96154f](a96154f))
* **mcp:** keep other apps' tables when replacing the Codex/Grok MCP
span ([#3877](#3877))
([d0fd56e](d0fd56e))
* **mcp:** resolve opencode.jsonc for MCP registration
([#2496](#2496))
([f824a27](f824a27))
* **memory:** align project routing with wrap headers
([#3603](#3603))
([b1b005a](b1b005a))
* **memory:** avoid injecting tools into tool-free requests
([#3677](#3677))
([46755b5](46755b5))
* **memory:** close SQLite connections in memory/fts5/graph adapters
([#3153](#3153))
([231a627](231a627))
* **memory:** handle list-shaped system content in inline memory
injection
([#3794](#3794))
([717527b](717527b))
* **memory:** ignore leading cd prefix when pairing Bash error
recoveries
([#3776](#3776))
([143a38d](143a38d))
* **memory:** pin LF on memory writers and guard the learn-writer
newline contract
([#3706](#3706))
([b10dd8d](b10dd8d))
* **oauth2:** mint and inject only on requests that go upstream
([#3849](#3849))
([f977d52](f977d52))
* **offline:** make HEADROOM_OFFLINE a real air-gap via one chokepoint
([#3729](#3729))
([119d1a1](119d1a1))
* **opencode:** hide spawned Windows console windows
([#3743](#3743))
([2157400](2157400))
* **opencode:** route only LLM traffic through Headroom
([#3884](#3884))
([d75eecd](d75eecd))
* **output-savings:** seed the holdout key on the whole first user
message
([#3209](#3209))
([117ff72](117ff72))
* **parser:** stop counting HTML comments twice in waste signals
([#3942](#3942))
([d0e9c4c](d0e9c4c))
* **parser:** whitespace waste signal always reported zero
([#1102](#1102))
([f19bc9a](f19bc9a))
* **plugin:** resolve hook CLI through plugin-root launcher
([#3053](#3053))
([ef7605f](ef7605f))
* **plugins/openclaw:** return messages the proxy did not change exactly
as they came in
([#3826](#3826))
([d1ad189](d1ad189))
* prevent HF tokenizer downloads in offline mode
([#3783](#3783))
([d503c57](d503c57))
* **pricing:** add Claude Sonnet 5.5 / Opus 5.5 / Fable 5.1, correct
Sonnet 5 rates
([#3841](#3841))
([0d99c56](0d99c56))
* protect file reads in chained shell commands
([#2668](#2668))
([ffc3599](ffc3599))
* **providers/vertex:** Vertex route multi-region locations
([#3802](#3802))
([a9c1ac5](a9c1ac5))
* **proxy/anthropic:** keep tool_result blocks first when neutralizing
headroom_retrieve history
([#3874](#3874))
([ccd9fff](ccd9fff))
* **proxy/batch:** honor x-headroom-bypass on the batch paths
([#2570](#2570))
([9b26a49](9b26a49))
* **proxy:** add same-origin check to /v1/retrieve/tool_call
([#3955](#3955))
([2297b50](2297b50))
* **proxy:** bill the whole prompt on the gateway path so savings read
true ([#3632](#3632))
([befdb52](befdb52))
* **proxy:** carry safeguard_results through SSE resynthesis
([#3958](#3958))
([f37ef59](f37ef59))
* **proxy:** classify Pi Codex Responses alias
([#2583](#2583))
([a493f55](a493f55))
* **proxy:** do not cache error replies delivered as http 200
([#3930](#3930))
([1132a54](1132a54))
* **proxy:** drop a tool_reference naming the search tool itself
([#3172](#3172))
([b73adaa](b73adaa))
* **proxy:** F3 — per-tenant TOIN learning key
([#404](#404))
([f90a56b](f90a56b))
* **proxy:** forward operator-listed guarded upstreams through a proxy
([#3804](#3804))
([4b7e5d2](4b7e5d2))
* **proxy:** freeze and replay the forwarded prefix on Gemini paths
([#3394](#3394))
([#3865](#3865))
([dd84321](dd84321))
* **proxy:** gate the raw request body, not just its Content-Length
header
([#3338](#3338))
([c946b6b](c946b6b))
* **proxy:** hard watchdog that dumps and exits when a native call
seizes the GIL
([#3180](#3180))
([79daeb5](79daeb5))
* **proxy:** inject memory context past a trailing system message
([#3948](#3948))
([3948dbe](3948dbe))
* **proxy:** keep cache_control outside content blocks where the Chat
Completions client put it
([#3895](#3895))
([a6d6c14](a6d6c14))
* **proxy:** keep exception text and the proxy token out of client
output
([#3851](#3851))
([861e94d](861e94d))
* **proxy:** keep the newest user message verbatim in cache-mode delta
compression
([#3923](#3923))
([613ae92](613ae92))
* **proxy:** key rate limits by peer unless the caller authenticated
([#3860](#3860))
([6fb7cad](6fb7cad))
* **proxy:** kill the image worker a timed-out call abandons
([#3940](#3940))
([793bb85](793bb85))
* **proxy:** label plain OpenAI chat traffic openai, not custom
([#3912](#3912))
([7df8bd8](7df8bd8))
* **proxy:** log response_content_length in proxy_inbound_response
([#2701](#2701))
([cfa479a](cfa479a))
* **proxy:** preserve Bedrock body-limit error dialect
([#3871](#3871))
([ffc6edb](ffc6edb))
* **proxy:** preserve Windows service when Rust core is blocked
([#2989](#2989))
([eaa16d9](eaa16d9))
* **proxy:** quarantine compression only once half the pool is stuck
([#3932](#3932))
([be2b205](be2b205))
* **proxy:** read HEADROOM_LICENSE and make usage reporting opt-in
([#3857](#3857))
([7460389](7460389))
* **proxy:** reap wrap-spawned proxies once no wrap clients remain
([#3202](#3202))
([4227bd2](4227bd2))
* **proxy:** redact upstream error detail and add opt-in /metrics
loopback gate
([#2589](#2589))
([a05717f](a05717f))
* **proxy:** refuse token-less non-loopback binds, gate operator routes
([#3852](#3852))
([ee731d7](ee731d7))
* **proxy:** reset the cc-switch upstream when Claude Official is
selected
([#3166](#3166))
([fed7281](fed7281))
* **proxy:** run extension middleware inside the security gate and body
ceiling
([#3847](#3847))
([1854fd7](1854fd7))
* **proxy:** run injected memory tools server-side on streaming turns
([#3947](#3947))
([1cf4966](1cf4966))
* **proxy:** share one compression deadline across a Responses request
([#3938](#3938))
([4d27d02](4d27d02))
* **proxy:** skip pricing lookup for passthrough:* models
([#2585](#2585))
([f87848c](f87848c))
* **proxy:** stop headroom logger from suppressing propagation to
stdout/stderr
([#3096](#3096))
([f78e66f](f78e66f))
* **relevance:** bound segment size by max_chars
([#2518](#2518))
([0ef7b2a](0ef7b2a))
* **reporting:** price the savings tile instead of fabricating $0.00
([#3821](#3821))
([f519fa8](f519fa8))
* **router:** fall back to built-ins when an external compressor passes
through
([#3893](#3893))
([2c4b20f](2c4b20f))
* **router:** keep ccr_retrieve exemption through orchestrator wrappers
([#3915](#3915))
([6151ed1](6151ed1))
* **rust-proxy:** forward request paths verbatim and pin the rustls
provider
([#3853](#3853))
([9d98ea5](9d98ea5))
* **savings:** record tool-schema dollars disjointly beside the folded
headline
([#3170](#3170))
([c719d4a](c719d4a))
* **savings:** stop scoring unobserved strata against the global mean
([#3128](#3128))
([f864525](f864525))
* **sdk:** keep tool names on Vercel tool-result parts through the
OpenAI round trip
([#3883](#3883))
([b715671](b715671))
* **sdk:** preserve Gemini media parts in message conversion instead of
dropping the turn
([#3882](#3882))
([038c923](038c923))
* **sdk:** stop JSON-wrapping structured tool_result content in the
Anthropic adapter
([#3797](#3797))
([2e4a60a](2e4a60a))
* **search:** stop a context line's body from becoming its line marker
([#3788](#3788))
([f3f2e00](f3f2e00))
* **security:** create memory stores and other state files owner-only
([#3848](#3848))
([5119b6e](5119b6e))
* **security:** exempt only GET health probes from the proxy token
([#3921](#3921))
([d99779d](d99779d))
* **security:** partition the response cache by credential and principal
([#3862](#3862))
([ee6cfcc](ee6cfcc))
* **security:** poll usage only with the operator's own credential
([#3863](#3863))
([65e63c0](65e63c0))
* **security:** stop forwarding the proxy token to upstream providers
([#3891](#3891))
([0147cf0](0147cf0))
* **settings:** report live proxy configuration
([#3177](#3177))
([58b1454](58b1454))
* **smart-crusher:** recurse at adaptive array limit
([#3770](#3770))
([7790bde](7790bde))
* **storage:** page JSONL queries after sorting
([#3872](#3872))
([91237ca](91237ca))
* **subscription:** match the Bearer scheme case-insensitively for the
Codex usage poll (RFC 7235)
([#3966](#3966))
([fe88461](fe88461))
* **subscription:** poll with the refreshed credentials-file OAuth token
([#3916](#3916))
([2dc9fc2](2dc9fc2))
* surface Codex responses traffic in dashboard
([#399](#399))
([ecc4967](ecc4967))
* **telemetry:** label custom-base chat upstreams from a fixed provider
set ([#3759](#3759))
([f0ec2bb](f0ec2bb))
* **thinking:** don't read the model's date suffix as its minor version
([#3791](#3791))
([afaaaa8](afaaaa8))
* **transforms/kompress:** preserve line boundaries and tabular output
in Kompress
([#3119](#3119))
([fe2ed2b](fe2ed2b))
* **transforms:** judge a Codex exec envelope read by its output
([#3878](#3878))
([922924e](922924e))
* **transforms:** judge the code_aware Kompress fallback in tokens
([#3881](#3881))
([6326965](6326965))
* **transforms:** keep record-bearing JSON out of Kompress
([#3673](#3673))
([#3880](#3880))
([8dbbd1d](8dbbd1d))
* **wrap:** never reuse a non-Headroom listener on the proxy port
([#3799](#3799))
([3ffa57e](3ffa57e))
* **wrap:** never reuse a proxy with incompatible routing config
([#3201](#3201))
([f69e246](f69e246))
* **wrap:** preserve pre-set ANTHROPIC_BASE_URL as proxy upstream
([#1358](#1358))
([bb1ab6a](bb1ab6a))
* **wrap:** scope Serena's MCP registration to the wrapped project
([#2787](#2787))
([#2992](#2992))
([8cfeb69](8cfeb69))
* **wrap:** set ANTHROPIC_HOST so `wrap goose` actually proxies
Anthropic
([#2619](#2619))
([c07fad0](c07fad0))
* **wrap:** strip -dev from running proxy version in restart check
([#3200](#3200))
([bd0296b](bd0296b))


### Performance Improvements

* add savings audit output
([#1211](#1211))
([9a72bc0](9a72bc0))
* **compression/code:** avoid a UTF-8 copy per code block in
byte-to-char mapping
([#3169](#3169))
([d5e5534](d5e5534))
* **image:** OCR and SigLIP each image once, not once per turn
([#3941](#3941))
([a8561fb](a8561fb))
* **memory:** bound traffic-learner _persisted_ids with the dedup window
([#3341](#3341))
([7e73438](7e73438))
* **metrics:** cap inbound request-path cardinality to bound memory
([#3340](#3340))
([88a1f4e](88a1f4e))
* **proxy:** lighter request path: alias the message snapshot, keep the
token cache on re-counts, decompress off the event loop
([#3909](#3909))
([c873d13](c873d13))
* **tokenizer:** memoize OpenAI token counts like the Anthropic counter
([#3168](#3168))
([0a2c80d](0a2c80d))


### Dependencies

* bump pyjwt 2.13.0 -&gt; 2.15.1 for CVE-2026-102274
([#3861](#3861))
([37b9c46](37b9c46))
* Bump source-map-js from 1.2.1 to 1.2.2 in /docs
([#3986](#3986))
([e06631a](e06631a))
* Bump source-map-js from 1.2.1 to 1.2.2 in /plugins/openclaw
([#3988](#3988))
([4be83b3](4be83b3))
* Bump source-map-js from 1.2.1 to 1.2.2 in /plugins/opencode
([#3987](#3987))
([478dd9e](478dd9e))
* Bump source-map-js from 1.2.1 to 1.2.2 in /sdk/typescript
([#3985](#3985))
([62cde35](62cde35))
* bump the npm-minor-patch group across 2 directories with 11 updates
([#3903](#3903))
([afe4f4e](afe4f4e))
* bump the npm-minor-patch group across 3 directories with 11 updates
([#3910](#3910))
([ff1a0d6](ff1a0d6))
* bump webpki-roots from 0.26.11 to 1.0.8
([#3905](#3905))
([fee53b4](fee53b4))
* drop the crewai extra to remove chromadb from the lockfile
([#3870](#3870))
([59b8cef](59b8cef))


### Code Refactoring

* **ccr:** read the expansion query through extract_user_query
([#2707](#2707))
([dcec845](dcec845))
* **wrap:** generate goose/openhands/openclaude from a WrapTarget
registry
([#3800](#3800))
([de4cf7e](de4cf7e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.39.1

Toggle v0.39.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.39.1 (#3807)

🤖 I have created a release *beep* *boop*
---


##
[0.39.1](v0.39.0...v0.39.1)
(2026-09-26)


### Bug Fixes

* **proxy:** stop the 0.39.0 TPM limiter from refusing large-context
requests forever
([#3806](#3806))
([7968122](7968122))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.39.0

Toggle v0.39.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.39.0 (#3713)

🤖 I have created a release *beep* *boop*
---


##
[0.39.0](v0.38.0...v0.39.0)
(2026-09-25)


### Features

* **compression:** describe what CCR compression dropped, not just how
much ([#3635](#3635))
([62d1cc0](62d1cc0))
* **hooks:** add protect_messages, a hard per-message compression veto
([#3772](#3772))
([d17ac6a](d17ac6a))
* **opencode:** exclude hosts from transport plugin routing
([#3668](#3668))
([0024b57](0024b57))
* **proxy:** let /transformations/feed omit message bodies for
number-only pollers
([#3672](#3672))
([46ac52d](46ac52d))
* **savings:** carry exact cache-read cost in history rollups
([#3734](#3734))
([1cb779e](1cb779e))
* **savings:** show the new-input savings basis beside the whole-wire
figure
([#3485](#3485))
([e92cccc](e92cccc))
* **savings:** track lifetime output spend so a bill-share rate has a
denominator
([#3520](#3520))
([c766bdb](c766bdb))
* **sdk:** support per-call config override in compress()
([#3370](#3370))
([c3e8a1e](c3e8a1e))
* **wrap:** support 1m context in vscode claude
([#3361](#3361))
([fc5a09e](fc5a09e))


### Bug Fixes

* **anthropic:** reject ping-only SSE from buffered CCR
([#3682](#3682))
([000fefc](000fefc))
* **anthropic:** stop the spurious compaction warning and drop dead
handler code
([#3678](#3678))
([6e71267](6e71267))
* **backends/litellm:** stop dropping image blocks from /v1/messages
requests
([#3753](#3753))
([577336d](577336d))
* **binaries:** fail closed when a download carries no sha256 pin
([#3724](#3724))
([26a2c49](26a2c49))
* **cache/google:** tolerate timezone-aware cache expiry timestamps
([#3210](#3210))
([7ce2580](7ce2580))
* **cache:** default CCR payload previews off; harden the log when they
are on
([#3728](#3728))
([5cb87bc](5cb87bc))
* **cache:** never batch-compress already-forwarded small Responses
outputs in cache mode
([#3756](#3756))
([ab62b9e](ab62b9e))
* **cache:** preserve cache_control schema properties
([#3348](#3348))
([b84c4c9](b84c4c9))
* **cache:** preserve the forwarded OpenAI chat prefix across turns
([#3757](#3757))
([deca575](deca575))
* **cache:** stop prefix transforms from busting the provider cache
([#3735](#3735))
([a2bf5ed](a2bf5ed))
* **cache:** stop skipping tool compaction on a pinned tools array
([#3750](#3750))
([a6a9cef](a6a9cef))
* **cli:** keep non-ASCII working directory names out of the init
profile slug
([#3718](#3718))
([f3d95ee](f3d95ee))
* **cli:** report anonymous beacon status accurately in the banner, log,
and /stats
([#3533](#3533))
([fa9edb3](fa9edb3))
* **content_detector:** detect CMTrace (SCCM/Intune) logs as
BUILD_OUTPUT
([#3712](#3712))
([6feb1fb](6feb1fb))
* **dashboard:** separate rolling cache economics by owner
([#3319](#3319))
([a29162b](a29162b)),
closes [#960](#960)
* **docker:** support OpenCode in native wrapper
([#3547](#3547))
([d90dadf](d90dadf))
* fall back for non-admin Windows task installs
([#3437](#3437))
([b958509](b958509))
* **graph:** fetch and extract the zip codebase-memory-mcp asset on
Windows
([#3730](#3730))
([b776983](b776983))
* **grok:** preserve xAI model context metadata
([#3312](#3312))
([#3315](#3315))
([c81378c](c81378c))
* **init:** raise the ensure hook's timeout above cold-start latency
([#3438](#3438))
([9a11109](9a11109))
* **install:** apply managed env vars added after a deployment was
installed
([#3740](#3740))
([a4cb2bc](a4cb2bc))
* **install:** wait for the old process to stop before restarting
([#3670](#3670))
([11c7320](11c7320))
* **kompress:** bound the inference deadline to the request, not each
block ([#3693](#3693))
([7f2766c](7f2766c))
* **kompress:** keep the boolean connectives that hold a condition
together
([#3687](#3687))
([bf290ba](bf290ba))
* **learn:** treat an unreadable project memory dir as absent instead of
crashing
([#3710](#3710))
([ff60d57](ff60d57))
* **mcp:** accept an empty install ledger instead of failing mutations
as malformed
([#3235](#3235))
([19ddfe1](19ddfe1))
* **memory/graph:** apply relation_type filter to both sides of a BOTH
subgraph query
([#3236](#3236))
([1a6f941](1a6f941))
* **memory:** fail closed for unresolved tools
([#3655](#3655))
([7c3cbc8](7c3cbc8))
* **memory:** make extract_system_prompt concatenative, not first-match
([#3644](#3644))
([3f3cf19](3f3cf19))
* **memory:** tolerate None message content in inline memory parser
([#3211](#3211))
([5ccec67](5ccec67))
* **metrics:** split rate-limited by source and label failures by
provider
([#3707](#3707))
([5ff4ea1](5ff4ea1))
* **openclaw:** declare transcriptSemantics and implement commitTurn
([#3442](#3442))
([a28dd4e](a28dd4e))
* **perf:** make budget checks constant-time
([#3368](#3368))
([ed08069](ed08069))
* **perf:** make rate limiter bucket checks constant-time
([#3373](#3373))
([a8bd9be](a8bd9be))
* preserve null and empty strings in lossless CSV compaction
([#3665](#3665))
([7ad9f80](7ad9f80))
* **proxy:** admit container host gateway on compress routes
([#3715](#3715))
([a8ae0a6](a8ae0a6))
* **proxy:** bound request-log message payloads to the feed window; trim
glibc too
([#3717](#3717))
([994a89f](994a89f))
* **proxy:** count a ceiling-stopped stream exactly instead of
estimating its text
([#3771](#3771))
([b36e59a](b36e59a))
* **proxy:** discard partial SSE tails during finalization
([#3411](#3411))
([6c0e817](6c0e817))
* **proxy:** enforce configured TPM limits
([#3350](#3350))
([138736c](138736c))
* **proxy:** fall back when forced Kompress is cold
([#3381](#3381))
([ca54c2a](ca54c2a))
* **proxy:** make the output shaper actually reduce output in the
default mode
([#3773](#3773))
([c029298](c029298))
* **proxy:** partition response cache by upstream
([#3349](#3349))
([dfdc725](dfdc725))
* **proxy:** pin the validated address so DNS rebinding cannot move an
upstream
([#3731](#3731))
([a102e05](a102e05))
* **proxy:** preserve Claude Code auto-mode protocol
([#3784](#3784))
([12c1579](12c1579))
* **proxy:** preserve empty transport error context
([#3675](#3675))
([ca02f28](ca02f28))
* **proxy:** preserve OpenCode Headroom retrieve results
([#3782](#3782))
([c7ebaed](c7ebaed))
* **proxy:** protect Codex exec reads whose argument is a JavaScript
object literal
([#3737](#3737))
([ecb5e5a](ecb5e5a))
* **proxy:** reject Anthropic batch operations on Copilot
([#3318](#3318))
([871bbde](871bbde))
* **proxy:** repair client-side tool_search tool_reference blocks
([#3443](#3443))
([f12e3fb](f12e3fb))
* **proxy:** resolve Codex custom_tool_call names for Responses tool
exclusion
([#3755](#3755))
([55c78de](55c78de))
* **proxy:** restrict urlopen SSL context ALPN to http/1.1
([#3567](#3567))
([5baa439](5baa439))
* **proxy:** scope OpenAI rate limits by api-key
([#3365](#3365))
([b9e8462](b9e8462))
* **proxy:** stamp x-headroom-* compression metrics on streaming
responses
([#3769](#3769))
([2c4dc44](2c4dc44))
* remove deprecated Apache license classifier
([#3566](#3566))
([b2d9275](b2d9275))
* **savings:** report negative savings instead of flooring them at zero
([#3744](#3744))
([1455f00](1455f00))
* **sdk:** enforce dormant public type tests
([#3424](#3424))
([95cbbb8](95cbbb8))
* **sdk:** preserve Anthropic image blocks in message conversion instead
of dropping the turn
([#3439](#3439))
([63676e6](63676e6))
* **sdk:** preserve proxy authentication alongside provider credentials
([#3450](#3450))
([ca4b47a](ca4b47a))
* **security:** create credential files private instead of narrowing
after write
([#3215](#3215))
([9b8cae8](9b8cae8))
* **security:** reject unauthenticated public proxy binds
([#3316](#3316))
([b0c19a2](b0c19a2))
* **smart-crusher:** disclose dropped scalar-array items with a
retrievable ccr sentinel
([#3692](#3692))
([c1fc84a](c1fc84a))
* **spreadsheet:** stop .xls integer rendering fabricating digits above
2^53 ([#3704](#3704))
([e8a5109](e8a5109))
* **spreadsheet:** stop inventing digits for .xls cells above 2**53
([#3700](#3700))
([1a7c5bb](1a7c5bb))
* **tests:** ask litellm for a model it prices instead of naming a
retired one
([#3722](#3722))
([0ad5e68](0ad5e68))
* **tool-search:** detect every wire shape of client-side deferral
([#3746](#3746))
([665b73d](665b73d))
* **tool-search:** don't orphan deferred tools, and stop overstating the
saving
([#3739](#3739))
([85f9e01](85f9e01))
* **tool-search:** make the core-tools override authoritative and the
warning recurrent
([#3745](#3745))
([a9757c9](a9757c9))
* **transforms:** detect fixed-width command output as tabular and keep
it out of Kompress
([#3786](#3786))
([6c9aef1](6c9aef1))
* **transforms:** stop embedded JSON pre-pass short-circuiting HTML
extraction
([#3620](#3620))
([195910b](195910b))
* **transforms:** stop routing timestamped log rows as grep matches
([#3748](#3748))
([d971f7c](d971f7c))
* **wrap:** handle SIGHUP on the shared proxy paths, not just `claude`
([#3331](#3331))
([c4df2dd](c4df2dd))
* **wrap:** stop blocking the launch on the Serena pre-index
([#3557](#3557))
([df8ebdf](df8ebdf))


### Performance Improvements

* **cache:** drop eager full-backend TTL sweep on every new-key store()
([#3256](#3256))
([2fed685](2fed685))
* **cache:** LRU-bound the compression-feedback tool-pattern map
([#3342](#3342))
([2d10b10](2d10b10))
* **memory:** reindex FTS5 a page at a time instead of a record at a
time ([#3466](#3466))
([3e36aef](3e36aef))
* **providers:** cache Google/Cohere token counters across requests
([#3273](#3273))
([cc6a07c](cc6a07c))
* **relevance:** order BM25 query terms once, not once per document
([#3468](#3468))
([6880984](6880984))


### Dependencies

* bump dotenv from 17.4.2 to 18.0.1 in /sdk/typescript
([#3765](#3765))
([56edfbc](56edfbc))
* bump ruff from 0.16.7 to 0.16.8 in the pip-minor-patch group
([#3761](#3761))
([b9ded1a](b9ded1a))
* bump the cargo-minor-patch group with 3 updates
([#3762](#3762))
([fbbe8b8](fbbe8b8))
* bump the npm-minor-patch group across 2 directories with 19 updates
([#3763](#3763))
([54357ff](54357ff))
* bump the npm-minor-patch group across 3 directories with 9 updates
([#3764](#3764))
([6311332](6311332))


### Code Refactoring

* **sdk:** route _fetch through rawFetch instead of duplicating it
([#3473](#3473))
([b2b5847](b2b5847))
* **smart-crusher:** drop the dead crush_object clone from the object
path ([#3705](#3705))
([7221724](7221724))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.38.0

Toggle v0.38.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.38.0

Release Headroom 0.38.0.

v0.37.0

Toggle v0.37.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.37.0 (#3228)

🤖 I have created a release *beep* *boop*
---


##
[0.37.0](v0.36.5...v0.37.0)
(2026-08-27)


### Features

* **compress:** session-aware /v1/compress (sidecar mode) + /v1/usage
relay ([#3270](#3270))
([4fa8802](4fa8802))
* **proxy:** self-limiting session state for the compression-cache
registry
([#3261](#3261))
([826b600](826b600))
* **proxy:** unify proxy and sidecar compression on one session engine
([#3271](#3271))
([d12ea50](d12ea50))


### Bug Fixes

* **cache/semantic:** don't semantic-match an empty query across
contexts
([#3226](#3226))
([455f4f2](455f4f2))
* **copilot:** preserve native enterprise model routing
([#2998](#2998))
([997a479](997a479))
* **kimi:** route managed Kimi Code through the proxy
([#3223](#3223))
([701e461](701e461))
* **learn:** surface Codex analysis failures
([#3016](#3016))
([632cb81](632cb81))
* **mcp:** add explicit Serena reconciliation
([#3222](#3222))
([7550efb](7550efb))
* **proxy/anthropic:** authenticate and attribute buffered Copilot turns
([#3277](#3277))
([4f2e70a](4f2e70a))
* **proxy:** enforce HEADROOM_PROXY_TOKEN on WebSocket handshakes
([#3305](#3305))
([27b4e2d](27b4e2d))
* **proxy:** make output-savings flush atomic and keep it off the event
loop ([#3231](#3231))
([b9d7dcc](b9d7dcc))
* **proxy:** protect file reads from lossy compression on the Responses
API path (Copilot view + HEADROOM_PROTECT_READS)
([#3238](#3238))
([4408e88](4408e88))
* **transforms:** stop compression garbling mixed subagent output
([#3286](#3286))
([8884d87](8884d87))
* **transforms:** stop folding datetime-prefixed user messages as search
results
([#3221](#3221))
([7784bb1](7784bb1))
* **vertex:** validate location region to close a path-parameter SSRF
([#3304](#3304))
([7c0b886](7c0b886))
* **windows:** terminate native proxy process tree
([#3313](#3313))
([91d4fc8](91d4fc8))
* **wrap:** stop concurrent wrap sessions clobbering settings.local.json
([#3232](#3232))
([f27f235](f27f235))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.36.5

Toggle v0.36.5's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.36.5 (#3214)

🤖 I have created a release *beep* *boop*
---


##
[0.36.5](v0.36.4...v0.36.5)
(2026-08-22)


### Bug Fixes

* **codex:** detect ChatGPT auth from id_token claims so wrap/init emit
requires_openai_auth
([#3212](#3212))
([2f81fa5](2f81fa5))
* **doctor:** report project-scoped Claude routing instead of a false
negative
([#3213](#3213))
([8f3e33a](8f3e33a))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.36.4

Toggle v0.36.4's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.36.4 (#3189)

🤖 I have created a release *beep* *boop*
---


##
[0.36.4](v0.36.3...v0.36.4)
(2026-08-22)


### Bug Fixes

* **dashboard:** pin MIME types for the vendored static assets
([#3193](#3193))
([b485768](b485768))
* **proxy/responses:** keep the Codex additional_tools carrier on the
wire ([#3194](#3194))
([1617f83](1617f83))
* **security:** validate caller-supplied upstreams on every resolution
path ([#3195](#3195))
([3e3c409](3e3c409))
* skip cross-turn dedup pointers on OpenAI chat streaming
([#3191](#3191))
([9c30b62](9c30b62))
* **wrap:** make the Serena pre-index stall budget configurable
([#3183](#3183))
([202c189](202c189))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v0.36.3

Toggle v0.36.3's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release 0.36.3 (#3188)

🤖 I have created a release *beep* *boop*
---


##
[0.36.3](v0.36.2...v0.36.3)
(2026-08-21)


### Bug Fixes

* **proxy/responses:** lift Codex &gt;= 0.149.0 additional_tools into
top-level tools
([#3186](#3186))
([25ca580](25ca580))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>