Commit 93f2d7a
chore: release main (#2792)
🤖 I have created a release *beep* *boop*
---
<details><summary>0.35.0</summary>
##
[0.35.0](v0.34.0...v0.35.0)
(2026-08-12)
### Features
* **beacon:** allowlist the routing summary key
([#2818](#2818))
([7940c05](7940c05))
* **beacon:** hourly R2 compaction, per-strategy savings, and a stack
that reports
([#2853](#2853))
([e0870ef](e0870ef))
* **cli,pricing:** add CLI extension seam and prompt-cache TTL pricing
([#2802](#2802))
([6ec3e34](6ec3e34))
### Bug Fixes
* **anthropic:** strip first-party tool search on custom upstreams
([#2539](#2539))
([7f6950b](7f6950b))
* **backends/anyllm:** convert Anthropic tools and tool_choice to OpenAI
shape
([0d6866b](0d6866b))
* **backends/anyllm:** stream tool_use blocks and map finish_reason on
the streaming path
([e4904e2](e4904e2))
* **backends/litellm:** None-guard core token counts in OpenAI usage
block ([#2324](#2324))
([12f9f58](12f9f58))
* **beacon:** report all-layers savings, not context-compression only
([#2796](#2796))
([e9a24f3](e9a24f3))
* **beacon:** split session failures by status code
([#2815](#2815))
([2954e37](2954e37))
* **cache:** bound compression cache bookkeeping
([0ae948c](0ae948c))
* **cache:** enforce Anthropic's 1h-before-5m cache_control ordering
before forwarding
([#2941](#2941))
([3752458](3752458))
* **cache:** mirror client cache_control positions instead of
single-marker consolidation
([def3d76](def3d76))
* **cache:** stabilize Anthropic block-growing lineages
([#2917](#2917))
([1a04c95](1a04c95))
* **ccr:** avoid injecting tool on chat streaming
([d0c1f5b](d0c1f5b))
* **ccr:** preserve exact SQLite TTL boundary
([#2669](#2669))
([d0a86d4](d0a86d4))
* **ccr:** report embedded hashes from compress endpoint
([#717](#717))
([685ebe4](685ebe4))
* **ccr:** resolve <<ccr:...>> markers inline when no
retrieve-tool path exists
([#2512](#2512))
([ce8ce83](ce8ce83))
* **ccr:** tolerate null/malformed OpenAI data in response handling
([#2467](#2467))
([e583e08](e583e08))
* **ci:** publish latest from the root Docker manifest
([#2252](#2252))
([5568d73](5568d73))
* **claude:** stop forcing tool search on Foundry
([#2477](#2477))
([7981396](7981396))
* **cli/update:** let install ownership win over bare /.dockerenv so
venv installs self-update
([#2830](#2830))
([7092b53](7092b53))
* **codex:** route alpha search through the Codex backend
([#2538](#2538))
([a540eb2](a540eb2))
* **content-router:** protect custom-tag blocks before mixed-content
section split
([d7bc1e2](d7bc1e2))
* **deps:** bump h2 to 4.4.1 for CVE-2026-71554
([#2839](#2839))
([564e0a8](564e0a8))
* **deps:** enforce audited transitive dependency floors
([#2791](#2791))
([64e2039](64e2039))
* **doctor:** flag `ollama launch claude` proxy bypass instead of
misdirecting
([#2566](#2566))
([7f24d69](7f24d69))
* emit SSE ping before message_start on Bedrock streaming path (issue
[#902](#902))
([#1080](#1080))
([4dab254](4dab254))
* **gemini:** resolve native CCR retrieval calls
([#2253](#2253))
([2483f57](2483f57))
* **health:** label kompress as degraded/optional when not yet loaded
([#2865](#2865))
([8949371](8949371))
* **image:** decouple routing types from trained_router so importing the
compressor doesn't import torch
([#2513](#2513))
([#2537](#2537))
([d7cf981](d7cf981))
* **install/windows:** register persistent-task from S4U hidden XML
([#2453](#2453))
([#2459](#2459))
([1edaeb8](1edaeb8))
* **install:** don't crash the PowerShell installer when $PROFILE is
unset ([#2469](#2469))
([fc5c4e2](fc5c4e2))
* **install:** trust Docker bridge for dashboard metadata
([e044139](e044139))
* **install:** use --userns=keep-id under Podman so bind-mount writes
don't fail
([#2846](#2846))
([3488f8d](3488f8d))
* **learn/gemini:** stop double-counting session tokens
([#2230](#2230))
([29d8a5e](29d8a5e))
* **learn/grok:** detect a Windows absolute project path
([#2283](#2283))
([e240df2](e240df2))
* **learn:** stop classifying a successful exit code 0 as an error
([#2289](#2289))
([a24fe7d](a24fe7d))
* **litellm:** add async_post_call_success_hook to HeadroomCallback
([#1322](#1322))
([3107994](3107994))
* **litellm:** don't forward a caller key the target cannot accept
([#2883](#2883))
([2f2950a](2f2950a))
* **memory:** bound the TrafficLearner pending-pattern accumulator
(memory leak)
([#2579](#2579))
([1f5feff](1f5feff))
* **memory:** close DirectMem0 resources
([6596182](6596182))
* **memory:** close MCP backend on shutdown
([4bd8ecd](4bd8ecd))
* **memory:** don't crash inline memory extraction on a non-object
<memory> block
([#2470](#2470))
([e00c6ff](e00c6ff))
* **memory:** keep vector metadata in sync
([#2295](#2295))
([c471800](c471800))
* **memory:** make explicit-project and user store keys
collision-resistant
([#2231](#2231))
([f840d5f](f840d5f))
* **memory:** skip <system-reminder> blocks when building the
retrieval query
([#2195](#2195))
([#2541](#2541))
([4e5a67a](4e5a67a))
* **memory:** sync FTS5 and vector indexes on CLI
delete/edit/prune/purge
([fd4628d](fd4628d))
* **oauth2:** make repository lint checks pass
([c85abf7](c85abf7))
* **observability:** aggregate tool savings in OTEL
([#2936](#2936))
([941c25d](941c25d))
* **onnx:** stop ONNX thread pools from spinning idle cores
([#2495](#2495))
([#2540](#2540))
([5c561bd](5c561bd))
* **openai:** skip Responses tool-search deferral for clients that
cannot execute it
([#2696](#2696))
([54ea28d](54ea28d))
* **opencode:** ship the transport hook-shim so wheel installs route
Node child traffic
([702dbc5](702dbc5))
* **providers/anthropic:** don't crash token estimation on null
tool_calls
([#2472](#2472))
([08466f3](08466f3))
* **providers/openai:** bound tiktoken vocab loads with the guarded
loader
([#2554](#2554))
([0805e8e](0805e8e))
* **proxy/anthropic:** inject headroom_retrieve whenever a CCR marker is
present, not only for new markers
([#2848](#2848))
([3808f60](3808f60))
* **proxy/anthropic:** None-guard usage token counts on the direct
buffered path
([#2434](#2434))
([2b5ee7c](2b5ee7c))
* **proxy/anthropic:** run tool-search history repair after turn hooks
([c6f9948](c6f9948))
* **proxy/batch:** don't crash an OpenAI batch on a valid-JSON
non-object line
([#2316](#2316))
([1f2c681](1f2c681))
* **proxy/bedrock:** report uncached input tokens from backend usage,
not the live-zone count
([#2318](#2318))
([c19e412](c19e412))
* **proxy/gemini:** keep streaming-parity baseline so eligible_pct can't
exceed 100
([#2824](#2824))
([b97c7c6](b97c7c6))
* **proxy/metrics:** cap client-supplied model label cardinality
([#2480](#2480))
([e24a7e6](e24a7e6))
* **proxy/metrics:** escape label values in the Prometheus export
([#2463](#2463))
([6a53861](6a53861))
* **proxy/openai:** don't crash the Responses memory tool loops on null
arguments
([#2273](#2273))
([a30db2c](a30db2c))
* **proxy/openai:** feed Codex WS traffic into the traffic learner
([#2334](#2334))
([f669149](f669149))
* **proxy/openai:** run response hooks on Responses, and bill their
re-drives
([#2872](#2872))
([675d13f](675d13f))
* **proxy:** allow settings routes for trusted gateway/dashboard clients
([#2491](#2491))
([a5b0a8f](a5b0a8f))
* **proxy:** cache litellm model resolution to stop repeated Provider
List spam
([99f07e7](99f07e7))
* **proxy:** cancel periodic TOIN task on shutdown
([739fdef](739fdef))
* **proxy:** close the upstream stream when a streaming body is never
consumed
([0951663](0951663))
* **proxy:** compress cache-mode cold starts and tag prefix-mismatch
passthrough
([#2365](#2365))
([aaeba0a](aaeba0a))
* **proxy:** emit request log timestamps in UTC
([620028f](620028f))
* **proxy:** enable tool search by default and repair poisoned
transcripts
([#2807](#2807))
([0237cbf](0237cbf))
* **proxy:** gate mid-turn message coalescing to Claude Code clients
([#1643](#1643))
([a4bd2e6](a4bd2e6))
* **proxy:** give each Codex /v1/responses WS turn a unique request_id
([#2164](#2164))
([d02df10](d02df10))
* **proxy:** graceful shutdown and reliable Ctrl+C exit
([#621](#621))
([17cdb18](17cdb18))
* **proxy:** guard telemetry and TOIN endpoints
([cde1513](cde1513))
* **proxy:** include tool_search_deferral savings in the savings ledger
([12149f7](12149f7))
* **proxy:** pass through cross-region prefixed Bedrock model IDs
directly
([#2330](#2330))
([64cb46e](64cb46e))
* **proxy:** port session-sticky beta headers to the Rust proxy
([#2381](#2381))
([f6398a6](f6398a6))
* **proxy:** preserve merged session and quarantine contracts
([#2943](#2943))
([039cd24](039cd24))
* **proxy:** preserve signed Anthropic thinking blocks on outbound
re-serialize
([#2254](#2254))
([dc163bc](dc163bc))
* **proxy:** stop discarding compressed Codex WS later-frame payloads
([#2823](#2823))
([4ec416d](4ec416d))
* **proxy:** time-cap the compression timeout-debt quarantine
([#2360](#2360))
([#2412](#2412))
([c5a08d2](c5a08d2))
* **proxy:** unwrap Hermes tool_call bridge in tool name map
([#2717](#2717))
([a97b824](a97b824))
* publish headroom-opencode in release workflow
([#2372](#2372))
([7859154](7859154))
* **settings:** accept documented HEADROOM_* env names as settings keys
([#2833](#2833))
([de9e052](de9e052))
* **subscription:** dedup transcript usage by message id
([#2340](#2340) token
inflation)
([#2408](#2408))
([74275b7](74275b7))
* **toin:** bound private query and pattern retention
([8cd1380](8cd1380))
* **tokenizer:** coerce non-string tool_call fields before counting
([#2801](#2801))
([b6f9877](b6f9877))
* **tokenizer:** price CJK in the Rust fixed-ratio estimator (Python
parity)
([#2260](#2260))
([6840153](6840153))
* **transforms/adaptive-sizer:** honor max_k on small-input fast path
([#2319](#2319))
([8a90523](8a90523))
* **transforms/smart_crusher:** don't crash on a tool call with a null
function
([#2232](#2232))
([3bb02f8](3bb02f8))
* Vertex model pricing shows $0.00 for versioned model names and
vertex:anthropic provider
([#2517](#2517))
([eb5b5e4](eb5b5e4))
* **wrap/claude:** keep --1m effective when an explicit --model is
passed through
([c093bf1](c093bf1))
* **wrap/opencode:** verify the opencode binary before mutating config
([ae38486](ae38486))
* **wrap/serena:** install Serena from the serena-agent PyPI wheel, not
the git source
([d7b25ae](d7b25ae))
* **wrap:** honor Copilot OAuth wire-api override and model default
([#2387](#2387))
([1db6d88](1db6d88))
* **wrap:** serialize shared proxy startup
([#2946](#2946))
([e540d64](e540d64))
* **wrap:** stop the launch cwd from shadowing the installed package in
the proxy subprocess
([#2843](#2843))
([c49be26](c49be26))
### Performance Improvements
* cut hot-path latency 27% (token-count memo, startup preloads, JSON
scan memo)
([#2838](#2838))
([53af90d](53af90d))
* **proxy:** bound upstream calls and hot-path costs
([#2852](#2852))
([f624d3a](f624d3a))
* **subscription:** skip transcripts older than the window in
compute_window_tokens
([#2861](#2861))
([91d6bf3](91d6bf3))
### Dependencies
* bump brace-expansion from 5.0.7 to 5.0.9 in /docs
([#2751](#2751))
([56ee57b](56ee57b))
* bump bytesize from 1.3.3 to 2.4.2
([#2286](#2286))
([6448545](6448545))
* bump hf-hub from 0.4.3 to 0.5.0
([#2285](#2285))
([4925bf6](4925bf6))
* bump next from 16.2.10 to 16.3.0 in /docs
([#2750](#2750))
([0fd0b99](0fd0b99))
* bump postcss from 8.5.19 to 8.5.25 in /plugins/openclaw
([#2749](#2749))
([cd60ee9](cd60ee9))
* bump postcss from 8.5.19 to 8.5.25 in /plugins/opencode
([#2748](#2748))
([ff4e016](ff4e016))
* bump postcss from 8.5.19 to 8.5.25 in /sdk/typescript
([#2747](#2747))
([267c2bd](267c2bd))
* bump postcss from 8.5.19 to 8.5.26 in /docs
([#2881](#2881))
([e6e5826](e6e5826))
* bump ruff from 0.15.17 to 0.15.22 in the pip-minor-patch group
([#2501](#2501))
([ecf130d](ecf130d))
* bump rusqlite from 0.32.1 to 0.40.1
([#2287](#2287))
([522faa1](522faa1))
* bump the cargo-minor-patch group across 1 directory with 22 updates
([#2916](#2916))
([148d860](148d860))
</details>
---
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: JD Davis <mxjerrett@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>1 parent 148d860 commit 93f2d7a
15 files changed
Lines changed: 198 additions & 25 deletions
File tree
- .claude-plugin
- .github/plugin
- headroom
- plugins
- headroom-agent-hooks
- .claude-plugin
- .github/plugin
- openclaw
- opencode
- sdk/typescript
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
245 | 246 | | |
246 | 247 | | |
247 | 248 | | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
253 | | - | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
254 | 267 | | |
255 | 268 | | |
256 | 269 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
0 commit comments