What's Changed
- fix: emit SSE ping before message_start on Bedrock streaming path (issue #902) by @MrAshRhodes in #1080
- fix(litellm): add async_post_call_success_hook to HeadroomCallback by @khaosdoctor in #1322
- deps: bump brace-expansion from 5.0.7 to 5.0.9 in /docs by @dependabot[bot] in #2751
- deps: bump next from 16.2.10 to 16.3.0 in /docs by @dependabot[bot] in #2750
- deps: bump postcss from 8.5.19 to 8.5.25 in /plugins/openclaw by @dependabot[bot] in #2749
- deps: bump postcss from 8.5.19 to 8.5.25 in /plugins/opencode by @dependabot[bot] in #2748
- deps: bump postcss from 8.5.19 to 8.5.25 in /sdk/typescript by @dependabot[bot] in #2747
- fix(proxy): unwrap Hermes tool_call bridge in tool name map by @pgjh in #2717
- fix(ccr): preserve exact SQLite TTL boundary by @Agistaris in #2669
- fix(tokenizer): coerce non-string tool_call fields before counting by @Parideboy in #2801
- fix(beacon): report all-layers savings, not context-compression only by @chopratejas in #2796
- test(ccr): cross SQLite max lifetime boundary by @JerrettDavis in #2794
- fix(deps): enforce audited transitive dependency floors by @JerrettDavis in #2791
- feat(cli,pricing): add CLI extension seam and prompt-cache TTL pricing by @chopratejas in #2802
- fix(opencode): don't preload a missing transport shim into child processes by @chopratejas in #2806
- fix(proxy): enable tool search by default and repair poisoned transcripts by @chopratejas in #2807
- Per-request backend selection for routing extensions by @chopratejas in #2809
- fix(beacon): split session failures by status code by @chopratejas in #2815
- fix(proxy): graceful shutdown and reliable Ctrl+C exit by @neogenix in #621
- feat(beacon): allowlist the routing summary key by @chopratejas in #2818
- fix(deps): bump h2 to 4.4.1 for CVE-2026-71554 by @chopratejas in #2839
- perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) by @chopratejas in #2838
- fix(proxy): stop discarding compressed Codex WS later-frame payloads by @ashishpatel26 in #2823
- test(openclaw): match inherited PATH shell check by @JerrettDavis in #2821
- fix(proxy/gemini): keep streaming-parity baseline so eligible_pct can't exceed 100 by @abhay-codes07 in #2824
- fix(memory): bound the TrafficLearner pending-pattern accumulator (memory leak) by @abhay-codes07 in #2579
- fix(proxy/anthropic): inject headroom_retrieve whenever a CCR marker is present, not only for new markers by @abhay-codes07 in #2848
- fix(install): stop baking the host memory DB path into a container deployment by @abhay-codes07 in #2845
- fix(install): use --userns=keep-id under Podman so bind-mount writes don't fail by @abhay-codes07 in #2846
- fix(wrap): stop the launch cwd from shadowing the installed package in the proxy subprocess by @abhay-codes07 in #2843
- fix(openai): skip Responses tool-search deferral for clients that cannot execute it by @rodboev in #2696
- fix(onnx): stop ONNX thread pools from spinning idle cores (#2495) by @abhay-codes07 in #2540
- fix(anthropic): strip first-party tool search on custom upstreams by @rodboev in #2539
- perf(subscription): skip transcripts older than the window in compute_window_tokens by @romulomorgan in #2861
- fix(proxy/openai): run response hooks on Responses, and bill their re-drives by @chopratejas in #2872
- Beacon: hourly R2 compaction, per-strategy savings, and a stack that reports by @chopratejas in #2853
- perf(proxy): bound upstream calls and hot-path costs by @chopratejas in #2852
- fix(litellm): don't forward a caller key the target cannot accept by @chopratejas in #2883
- deps: bump postcss from 8.5.19 to 8.5.26 in /docs by @dependabot[bot] in #2881
- build(deps): bump gitpython from 3.1.50 to 3.1.54 in the uv group across 1 directory by @dependabot[bot] in #2575
- deps: bump ruff from 0.15.17 to 0.15.22 in the pip-minor-patch group by @dependabot[bot] in #2501
- deps: bump rusqlite from 0.32.1 to 0.40.1 by @dependabot[bot] in #2287
- deps: bump bytesize from 1.3.3 to 2.4.2 by @dependabot[bot] in #2286
- deps: bump hf-hub from 0.4.3 to 0.5.0 by @dependabot[bot] in #2285
- fix(cache): stabilize Anthropic block-growing lineages by @chopratejas in #2917
- fix(proxy/anthropic): run tool-search history repair after turn hooks by @gglucass in #2889
- fix(wrap/serena): install Serena from the serena-agent PyPI wheel, not the git source by @abhay-codes07 in #2877
- fix(opencode): ship the transport hook-shim so wheel installs route Node child traffic by @abhay-codes07 in #2878
- fix(opencode): keep Claude models off OpenAI provider by @SulimanAbdulrazzaq in #2913
- fix(proxy): cancel periodic TOIN task on shutdown by @abhinavkr26104 in #2906
- fix(cache): bound compression cache bookkeeping by @Robert2547 in #2875
- fix(proxy): emit request log timestamps in UTC by @SulimanAbdulrazzaq in #2912
- fix(memory): close MCP backend on shutdown by @abhinavkr26104 in #2905
- fix(proxy): cache litellm model resolution to stop repeated Provider List spam by @connectsudhindra-gif in #2860
- fix(litellm): close shared cloud client by @abhinavkr26104 in #2903
- fix(oauth2): make repository lint checks pass by @abhinavkr26104 in #2902
- fix(install): trust Docker bridge for dashboard metadata by @SulimanAbdulrazzaq in #2914
- fix(memory): close DirectMem0 resources by @abhinavkr26104 in #2904
- fix(memory): sync FTS5 and vector indexes on CLI delete/edit/prune/purge by @gingeekrishna in #2869
- fix(settings): accept documented HEADROOM_* env names as settings keys by @axelray-dev in #2833
- fix(cli/update): let install ownership win over bare /.dockerenv so venv installs self-update by @abhay-codes07 in #2830
- fix(toin): bound private query and pattern retention by @chopratejas in #2929
- fix(proxy): guard telemetry and TOIN endpoints by @chopratejas in #2930
- fix(ccr): avoid injecting tool on chat streaming by @chopratejas in #2931
- fix(wrap/opencode): verify the opencode binary before mutating config by @abhay-codes07 in #2923
- fix(wrap/claude): keep --1m effective when an explicit --model is passed through by @abhay-codes07 in #2922
- fix(cache): mirror client cache_control positions instead of single-marker consolidation by @gglucass in #2919
- fix(backends/anyllm): convert Anthropic tools and tool_choice to OpenAI shape by @abhay-codes07 in #2892
- fix(backends/anyllm): stream tool_use blocks and map finish_reason on the streaming path by @abhay-codes07 in #2890
- fix(content-router): protect custom-tag blocks before mixed-content section split by @gglucass in #2887
- fix(proxy): close the upstream stream when a streaming body is never consumed by @abhay-codes07 in #2882
- fix(proxy): include tool_search_deferral savings in the savings ledger by @abhay-codes07 in #2880
- fix: Vertex model pricing shows $0.00 for versioned model names and vertex:anthropic provider by @yossiovadia in #2517
- fix(proxy): allow settings routes for trusted gateway/dashboard clients by @Parideboy in #2491
- fix(ccr): report embedded hashes from compress endpoint by @Alexsun1one in #717
- fix(health): label kompress as degraded/optional when not yet loaded by @gingeekrishna in #2865
- fix(proxy): gate mid-turn message coalescing to Claude Code clients by @tenderdeve in #1643
- fix(proxy): give each Codex /v1/responses WS turn a unique request_id by @rodboev in #2164
- fix(learn/gemini): detect the project path for JSONL sessions by @abhay-codes07 in #2229
- fix(learn/gemini): stop double-counting session tokens by @abhay-codes07 in #2230
- fix(memory): make explicit-project and user store keys collision-resistant by @abhay-codes07 in #2231
- fix(transforms/smart_crusher): don't crash on a tool call with a null function by @abhay-codes07 in #2232
- fix(ci): publish latest from the root Docker manifest by @rodboev in #2252
- fix(gemini): resolve native CCR retrieval calls by @rodboev in #2253
- fix(tokenizer): price CJK in the Rust fixed-ratio estimator (Python parity) by @lifeodyssey in #2260
- fix(proxy/openai): don't crash the Responses memory tool loops on null arguments by @abhay-codes07 in #2273
- fix(learn/grok): detect a Windows absolute project path by @abhay-codes07 in #2283
- fix(learn): stop classifying a successful exit code 0 as an error by @abhay-codes07 in #2289
- fix(memory): keep vector metadata in sync by @superdiaodiao in #2295
- fix(proxy/batch): don't crash an OpenAI batch on a valid-JSON non-object line by @abhay-codes07 in #2316
- fix(proxy/bedrock): report uncached input tokens from backend usage, not the live-zone count by @abhay-codes07 in #2318
- fix(transforms/adaptive-sizer): honor max_k on small-input fast path by @abhay-codes07 in #2319
- fix(backends/litellm): None-guard core token counts in OpenAI usage block by @abhay-codes07 in #2324
- fix(proxy): preserve signed Anthropic thinking blocks on outbound re-serialize by @axelray-dev in #2254
- fix(proxy): pass through cross-region prefixed Bedrock model IDs directly by @mhaitana in #2330
- fix(proxy/openai): feed Codex WS traffic into the traffic learner by @abhay-codes07 in #2334
- fix(proxy): compress cache-mode cold starts and tag prefix-mismatch passthrough by @Parideboy in #2365
- fix: publish headroom-opencode in release workflow by @rodboev in #2372
- fix(proxy): port session-sticky beta headers to the Rust proxy by @abcgco in #2381
- fix(wrap): honor Copilot OAuth wire-api override and model default by @mvanhorn in #2387
- fix(subscription): dedup transcript usage by message id (#2340 token inflation) by @abhay-codes07 in #2408
- fix(proxy): time-cap the compression timeout-debt quarantine (#2360) by @abhay-codes07 in #2412
- fix(proxy/anthropic): None-guard usage token counts on the direct buffered path by @abhay-codes07 in #2434
- fix(install/windows): register persistent-task from S4U hidden XML (#2453) by @Parideboy in #2459
- fix(proxy/metrics): escape label values in the Prometheus export by @inix-x in #2463
- fix(ccr): tolerate null/malformed OpenAI data in response handling by @abhay-codes07 in #2467
- fix(install): don't crash the PowerShell installer when $PROFILE is unset by @abhay-codes07 in #2469
- fix(memory): don't crash inline memory extraction on a non-object block by @abhay-codes07 in #2470
- fix(providers/anthropic): don't crash token estimation on null tool_calls by @abhay-codes07 in #2472
- fix(claude): stop forcing tool search on Foundry by @rodboev in #2477
- fix(proxy/metrics): cap client-supplied model label cardinality by @inix-x in #2480
- docs: add guide for using Headroom with OpenCode + DeepSeek by @suvenkatesh97 in #2497
- docs(transforms): correct stale unit-result-cache placeholder comments by @gglucass in #2506
- fix(ccr): resolve <ccr:...> markers inline when no retrieve-tool path exists by @Parideboy in #2512
- fix(doctor): flag
ollama launch claudeproxy bypass instead of misdirecting by @tenderdeve in #2566 - fix(providers/openai): bound tiktoken vocab loads with the guarded loader by @gglucass in #2554
- fix(memory): skip blocks when building the retrieval query (#2195) by @abhay-codes07 in #2541
- fix(codex): route alpha search through the Codex backend by @rodboev in #2538
- fix(image): decouple routing types from trained_router so importing the compressor doesn't import torch (#2513) by @abhay-codes07 in #2537
- fix(observability): aggregate tool savings in OTEL by @chopratejas in #2936
- fix(proxy): preserve merged session and quarantine contracts by @JerrettDavis in #2943
- fix(wrap): serialize shared proxy startup by @chopratejas in #2946
- fix(cache): enforce Anthropic's 1h-before-5m cache_control ordering before forwarding by @Parideboy in #2941
- deps: bump the cargo-minor-patch group across 1 directory with 22 updates by @dependabot[bot] in #2916
- chore: release headroom-ai 0.35.0 by @chopratejas in #2792
New Contributors
- @pgjh made their first contribution in #2717
- @Agistaris made their first contribution in #2669
- @romulomorgan made their first contribution in #2861
- @SulimanAbdulrazzaq made their first contribution in #2913
- @abhinavkr26104 made their first contribution in #2906
- @Robert2547 made their first contribution in #2875
- @connectsudhindra-gif made their first contribution in #2860
- @gingeekrishna made their first contribution in #2869
- @yossiovadia made their first contribution in #2517
- @Alexsun1one made their first contribution in #717
- @suvenkatesh97 made their first contribution in #2497
Full Changelog: v0.34.0...v0.35.0