Skip to content

Commit 93f2d7a

Browse files
chopratejasJerrettDavisgithub-actions[bot]
authored
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 &lt;&lt;ccr:...&gt;&gt; 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 &lt;memory&gt; 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 &lt;system-reminder&gt; 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/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
},
66
"metadata": {
77
"description": "Headroom marketplace for Claude Code and GitHub Copilot CLI plugins.",
8-
"version": "0.34.0"
8+
"version": "0.35.0"
99
},
1010
"plugins": [
1111
{
1212
"name": "headroom",
1313
"source": "./plugins/headroom-agent-hooks",
1414
"description": "Headroom startup hooks for Claude Code and GitHub Copilot CLI.",
15-
"version": "0.34.0",
15+
"version": "0.35.0",
1616
"author": {
1717
"name": "Headroom Contributors",
1818
"url": "https://github.com/chopratejas/headroom"

.github/plugin/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
},
66
"metadata": {
77
"description": "Headroom marketplace for Claude Code and GitHub Copilot CLI plugins.",
8-
"version": "0.34.0"
8+
"version": "0.35.0"
99
},
1010
"plugins": [
1111
{
1212
"name": "headroom",
1313
"source": "./plugins/headroom-agent-hooks",
1414
"description": "Headroom startup hooks for Claude Code and GitHub Copilot CLI.",
15-
"version": "0.34.0",
15+
"version": "0.35.0",
1616
"author": {
1717
"name": "Headroom Contributors",
1818
"url": "https://github.com/chopratejas/headroom"

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.34.0"
2+
".": "0.35.0"
33
}

.releasemetadata

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
2-
"version": "0.34.0",
2+
"version": "0.35.0",
33
"packages": {
4-
"pypi": "0.34.0",
5-
"npm-sdk": "0.34.0",
6-
"npm-openclaw": "0.34.0",
7-
"agent-hooks-plugin": "0.34.0"
4+
"pypi": "0.35.0",
5+
"npm-sdk": "0.35.0",
6+
"npm-openclaw": "0.35.0",
7+
"npm-opencode": "0.35.0",
8+
"agent-hooks-plugin": "0.35.0"
89
}
910
}

CHANGELOG.md

Lines changed: 131 additions & 0 deletions
Large diffs are not rendered by default.

headroom/binaries.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import sys
3030
import tarfile
3131
import tempfile
32+
import time
3233
import urllib.error
3334
import urllib.parse
3435
import urllib.request
@@ -245,12 +246,24 @@ def _download(url: str, dest: Path, *, progress: bool = True) -> None:
245246
raise OSError(f"binary cache directory is not writable: {dest.parent}")
246247
final_url = _mirror_url(url)
247248
req = urllib.request.Request(final_url, headers={"User-Agent": "headroom-binaries/1"})
248-
try:
249-
with urllib.request.urlopen(req, timeout=60) as resp: # noqa: S310 (https)
250-
total = int(resp.headers.get("Content-Length") or 0)
251-
_stream_to(resp, dest, total, label=dest.name, show_progress=progress)
252-
except urllib.error.URLError as e:
253-
raise BinaryFetchError(f"failed to download {final_url}: {e}") from e
249+
attempts = 3
250+
for attempt in range(1, attempts + 1):
251+
try:
252+
with urllib.request.urlopen(req, timeout=60) as resp: # noqa: S310 (https)
253+
total = int(resp.headers.get("Content-Length") or 0)
254+
_stream_to(resp, dest, total, label=dest.name, show_progress=progress)
255+
return
256+
except urllib.error.URLError as e:
257+
dest.unlink(missing_ok=True)
258+
if attempt == attempts:
259+
raise BinaryFetchError(
260+
f"failed to download {final_url} after {attempts} attempts: {e}"
261+
) from e
262+
# GitHub release assets occasionally return a transient 5xx or
263+
# reset while redirecting to the object store. A short bounded
264+
# retry keeps proxy startup reliable without hiding persistent
265+
# credential, mirror, or connectivity failures.
266+
time.sleep(0.25 * attempt)
254267

255268

256269
def _stream_to(src: Any, dest: Path, total: int, *, label: str, show_progress: bool) -> None:

plugins/headroom-agent-hooks/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "headroom",
3-
"version": "0.34.0",
3+
"version": "0.35.0",
44
"description": "Headroom startup hooks for Claude Code and GitHub Copilot CLI.",
55
"author": {
66
"name": "Headroom Contributors",

plugins/headroom-agent-hooks/.github/plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "headroom",
3-
"version": "0.34.0",
3+
"version": "0.35.0",
44
"description": "Headroom startup hooks for Claude Code and GitHub Copilot CLI.",
55
"author": {
66
"name": "Headroom Contributors",

plugins/openclaw/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "headroom-openclaw",
3-
"version": "0.34.0",
3+
"version": "0.35.0",
44
"description": "Headroom context compression plugin for OpenClaw — 70-90% token savings with zero LLM calls",
55
"type": "module",
66
"main": "./dist/index.js",

plugins/opencode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "headroom-opencode",
3-
"version": "0.32.0",
3+
"version": "0.35.0",
44
"description": "Headroom proxy integration plugin for OpenCode - routes LLM traffic through the Headroom proxy for token compression",
55
"type": "module",
66
"main": "./dist/index.js",

0 commit comments

Comments
 (0)