mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-27 14:17:10 -04:00
99 KiB
99 KiB
🤖 I have created a release beep boop
0.37.0 (2026-08-21)
Features
- 3-layer context compression pipeline (L1+L2+L3) (#1405) (3dd9660)
- add CrewAI and AutoGen tool compression integrations (#1384) (e8bff1c)
- add deterministic runtime rollout controls (#1490) (3077ac8)
- beacon: allowlist the routing summary key (#2818) (7940c05)
- beacon: hourly R2 compaction, per-strategy savings, and a stack that reports (#2853) (e0870ef)
- claude: support Claude Code in VS Code (#2752) (13a310a)
- cli,pricing: add CLI extension seam and prompt-cache TTL pricing (#2802) (6ec3e34)
- cli: add
headroom inspectto view original vs compressed content (#1595) (942e916) - cli: add
wrap openclaudefor OpenClaude CLI (#1416) (5415008) - code: add PHP support to CodeAwareCompressor (#2423) (6d5516d)
- compress: accept config.frozen_message_count on /v1/compress (#2718) (2797099)
- compress: expose frozen_message_count in library-mode compress() (#2178) (021a762)
- compress: reach the lossless provider seam on the general path and default /v1/compress to marker-free output (#2691) (f2c48e2)
- copilot: proxy VS Code models transparently (#2687) (007446c)
- core: gate ONNX transforms behind a default-on
mlfeature (static/lexical builds) (#2165) (cdba2ec) - dashboard: add settings dashboard for proxy configuration (#2101) (96bc4cd)
- dashboard: persist lifetime proxy metrics (#2198) (0537cbf)
- deploy: Add turnkey deploy command (#1404) (560ffae)
- evals: register multilingual multi-wiki-qa (zh/ja/ko) dataset (#1530) (f891506)
- evals: weekly HotpotQA answer-recall report on the prose path (#1188) (46d4378)
- grok-build: add Grok Build wrap command and MCP integration (#1629) (420dc90)
- install: add apply flag parity, --env passthrough, and EIO retry (#2152) (896454e)
- lossless: factor shared directory prefix in the grep search fold (#2547) (7dc9a97)
- mcp: add streamable HTTP MCP transport (#1773) (4ea96a4)
- mcp: publish canonical server.json (#1510) (e9e9cd5)
- memory: add explicit supersession repair (#2217) (ce52b30)
- metrics: export compression-failed and kompress size-gate counters (#1569) (d728338)
- metrics: record per-extension token savings (#2371) (02eb90f)
- opencode: ship the transport plugin in pip installs (#2601) (f54f04f)
- opencode: support Copilot subscription backend for headroom models (#2441) (#2445) (9089e7f)
- proxy/hooks: run fold-only (stream-safe) turn hooks on streaming OpenAI chat (#2549) (a6d4921)
- proxy/savings: aggregate tool-schema savings into Metrics + all reporting sinks (#2546) (9f1ffef)
- proxy: add opt-in cost-aware model router (#1706) (#2205) (57e8dcb)
- proxy: apply output shaper to OpenAI-compatible endpoints (#1725) (e65b9b3)
- proxy: label GitHub Copilot traffic as "copilot" in the outcome& (#2377) (d7a8cdb)
- proxy: let extensions report cost savings and their own latency (#3051) (f9807fd)
- proxy: make /v1/compress usable as a gateway/Kong sidecar (#2458) (1329ed7)
- proxy: model-aware cold-prefix hook reasoning compaction (Kimi/GLM) + cold recompaction (CC) (#2555) (cb8f4b6)
- proxy: opt-in compression for catch-all passthrough routes (#1699) (4cbd5da)
- proxy: route selected external compressors through the content router (#2388) (e3c7964)
- proxy: select built-in compressors via --compressor + registry inventory (#2373) (56c7d4a)
- proxy: unify savings attribution across stats, perf, metrics, and dashboard (1b0b0b8), closes #2976
- rust: add structured prose offload plumbing (#334) (#2378) (9e07785)
- rust: port CodeCompressor AST compressor to Rust (parity-only) (#1154) (e530de5)
- rust: port Kompress ML prose compressor to Rust (parity-only) (#1153) (83e27e5)
- stats: per-bucket output-shaping savings in /stats-history (#1819) (12a9710)
- telemetry: record provider cache read/write/uncached tokens per request (#2450) (bec4cce)
- text-crusher: CJK-aware segmentation + relevance via ICU (#1504) (4035c04)
- text-crusher: fold full-width ASCII to half-width in CJK token keys (#2259) (844d9ca)
- transforms: add compressed signal + dispatch code_aware/html/diff via registry (#2400) (7ebda67)
- transforms: add pluggable compressor registry + headroom.compressor entry point (#2370) (a02073e)
- transforms: dispatch kompress/text via the compressor registry + forward question (#2411) (446ec26)
- transforms: dispatch smart_crusher via the compressor registry (defer kompress/text ML boundary) (#2404) (7c7bf43)
- transforms: make built-in compressors real Compressor implementations (adapters) (#2391) (981616c)
- wrap/claude: make the --1m fallback model configurable via HEADROOM_1M_MODEL (#2983) (2a84725)
- wrap: add
headroom wrap kimifor Kimi CLI (#1426) (eac4965) - wrap: add omp target (Oh My Pi) with models.yml override and unwrap (#1811) (fcf455a)
- wrap: add ZCode desktop app support (#1845) (2a954b6)
- wrap: boost Serena symbol-first guidance, wrap-time pre-index, repo-language scoping (#2425) (fd0e1a8)
- wrap: default code-memory to Serena (dashboard browser off) behind unified --code-memory (#2413) (6e4425a)
- wrap: reduce-at-source SAFE quiet-CLI env defaults for the launched agent (#2548) (c990cfb)
Bug Fixes
- add DeepSeek V4/V3.2/R1 tokenizer mappings and context limits (#912) (0c70875)
- add Vercel deploy config and workflow for docs site (#1739) (b0fa84e)
- anthropic: honor the [1m] 1M-context tier, and price it correctly (#3073) (6d2254d)
- anthropic: strip first-party tool search on custom upstreams (#2539) (7f6950b)
- auth: support GitHub Enterprise Copilot OAuth domain (#2192) (5dbe331)
- backend/bedrock: preserve system-prompt cache_control breakpoint (list form) (#2225) (ea0115c)
- backends/anyllm: convert Anthropic tools and tool_choice to OpenAI shape (0d6866b)
- backends/anyllm: stream tool_use blocks and map finish_reason on the streaming path (e4904e2)
- backends/litellm: guard None completion_tokens in usage mapping (#2322) (44a174f)
- backends/litellm: None-guard core token counts in OpenAI usage block (#2324) (12f9f58)
- backends: don't crash the OpenAI->Anthropic converter on empty choices (#2484) (43a7b57)
- beacon: report all-layers savings, not context-compression only (#2796) (e9a24f3)
- beacon: split session failures by status code (#2815) (2954e37)
- build: support Intel macOS (x86_64-apple-darwin) via ort-load-dynamic (fixes #941) (#1797) (1590913)
- cache-aligner: hash the frozen conversation prefix so Claude Code cache invalidation is detected (#2085) (#2161) (cc072f0)
- cache: bound compression cache bookkeeping (0ae948c)
- cache: enforce Anthropic's 1h-before-5m cache_control ordering before forwarding (#2941) (3752458)
- cache: mirror client cache_control positions instead of single-marker consolidation (def3d76)
- cache: normalize embeddings before the semantic similarity check (#2122) (f8eaaeb)
- cache: preserve cache_control ttl when re-anchoring a breakpoint (#2651) (e0d2cd0)
- cache: preserve client cache_control ttl when consolidating breakpoints (#2382) (8906d3a)
- cache: stabilize Anthropic block-growing lineages (#2917) (1a04c95)
- cache: stable session identity and per-conversation prefix trackers under agentic clients (#2193) (7bfb1d7)
- ccr: avoid injecting tool on chat streaming (d0c1f5b)
- ccr: don't crash tool-call detection on a null function/functionCall (#2269) (1612f06)
- ccr: guard empty/malformed OpenAI choices in _extract_assistant_message (#2389) (89319fb)
- ccr: lowercase a retrieved hash so an uppercase echo still hits the store (#2236) (842d7e1)
- ccr: make --no-ccr disable server-side response handling too (#3101) (131b119), closes #3082
- ccr: make StreamingCCRHandler work on OpenAI streams (#3069) (7ef736f)
- ccr: only buffer a stream when a marker is actually redeemable (#3092) (c502087)
- ccr: preserve exact SQLite TTL boundary (#2669) (d0a86d4)
- ccr: re-inject headroom_retrieve when history references it on the sessionless path (942af56)
- ccr: relay a successful upstream turn when post-processing fails (#3094) (0ec73fa)
- ccr: report embedded hashes from compress endpoint (#717) (685ebe4)
- ccr: resolve <<ccr:...>> markers inline when no retrieve-tool path exists (#2512) (ce8ce83)
- ccr: send Accept: application/json on a buffered stream:false turn (#3102) (139c7cb), closes #3078
- ccr: skip compact summaries for proactive expansion (#2242) (3f241e4)
- ccr: sliding idle-window TTL with max-lifetime ceiling in the Rust core backends (#2604) (#2631) (e825588)
- ccr: stop persisting retrieval markers as original content (#2694) (#2703) (3e348f3)
- ccr: store pre-protection original, not tag placeholder, in CCR (#1208) (a61f534)
- ccr: tolerate null/malformed OpenAI data in response handling (#2467) (e583e08)
- ccr: verify a scanned marker's hash before advertising it (#2908) (41dab2d)
- ci: align Ruff tooling versions (#2406) (2bb14d1)
- ci: prevent native detector from hanging test shards (#2996) (a708c05)
- ci: publish latest from the root Docker manifest (#2252) (5568d73)
- ci: restrict Codecov shard uploads (#2745) (3f2ca99)
- ci: scope the release credential and stop persisting it to disk (#3062) (ac8646a)
- ci: unjam release and Docker publishing (#2958) (e269afb)
- claude: reject conflicting auth before proxy startup (#2993) (2d88e31)
- claude: stop forcing tool search on Foundry (#2477) (7981396)
- claude: treat non-zero claude --version exit as version-unknown & (#2233) (f71fef1)
- cli/init: fail clearly on a target settings file with invalid JSON (#2227) (daca1dd)
- cli/install: resolve the deployment profile instead of dead-ending on default (#2832) (8252619)
- cli/update: let install ownership win over bare /.dockerenv so venv installs self-update (#2830) (7092b53)
- cli: stop the macOS malloc re-exec replacing an embedder's process (#3064) (96c25f5)
- cli: warn when Headroom proxy URL leaks into the shell after unwrap claude (#2238) (#2571) (904bc67)
- code-compressor: recover valid Python rewrites after local syntax rejection (#2202) (dbbef4b)
- code: pin tree-sitter-language-pack <1.0.0 in [code] extra (#1219) (412db40)
- code: quarantine Perl parser from code-aware compression (#2204) (8522fcb)
- codex: detect keyring-backed ChatGPT auth (#2478) (46293f4)
- codex: preserve wrapped sessions and recover state (#2160) (dec60de)
- codex: rewrite config.toml properly so Codex will route through & (#2102) (5d9bbbe)
- codex: route alpha search through the Codex backend (#2538) (a540eb2)
- compression: honor qualified CCR names across integrations (#2698) (dcb674b)
- compression: report source-line span in CCR compression marker (#2597) (18e1c3c)
- compress: resolve the /v1/compress tokenizer per model, and document the real contract (#2743) (6422a80)
- content_router: pin FREEZE_BLOCK_DECISION verdict to stop cache-write churn (#1620) (a069979)
- content-router: protect custom-tag blocks before mixed-content section split (d7bc1e2)
- copilot: derive GHE credential host from API URL (#800) (#2511) (4a8157f)
- copilot: normalize subscription API routing (#2441) (#2455) (2eca5ee)
- copilot: preserve /v1 for the Anthropic /v1/messages endpoint (#2409) (#2414) (c400f90)
- copilot: route VS Code inline completions to Copilot, not OpenAI (#3077) (204e751)
- copilot: send VS Code inline completions to the host that serves them (#3112) (b77d612)
- core: avoid unidiff panic on bash xtrace (#1506) (3757a7c)
- cost: send litellm the total prompt so --budget stops seeing $0 (#2757) (a033ac4)
- deps: bump aiohttp and cryptography to clear the CVEs blocking 0.34.0 (#2753) (0221e7f)
- deps: bump datasets past PYSEC-2026-3716 (#3136) (df6ff6b)
- deps: bump h2 to 4.4.1 for CVE-2026-71554 (#2839) (564e0a8)
- deps: bump mcp to 1.28.1 to clear 3 high-severity CVEs (#2348) (a90be94)
- deps: clear Dependabot lockfile alerts (#2175) (ea3d5a8)
- deps: clear the two Rust advisories and make cargo audit blocking (#3121) (93c474e)
- deps: enforce audited transitive dependency floors (#2791) (64e2039)
- deps: enforce transformers security floor (#2201) (cbfa267)
- deps: raise the GitPython floor to 3.1.58 to clear 9 open advisories (#3120) (8156d4d)
- diff-compressor: CJK-aware relevance scoring for hunk selection (#2220) (528517c)
- docker: give :latest exactly one writer (#3154) (bf651c3)
- docker: publish compose ports on loopback only (#3061) (481e0b8)
- docker: ship Bedrock auth and current registry (#2982) (eafdf11)
- doctor: flag
ollama launch claudeproxy bypass instead of misdirecting (#2566) (7f24d69) - doctor: surface that Claude Desktop agent sessions bypass the proxy (#2987) (be5b26d)
- emit SSE ping before message_start on Bedrock streaming path (issue #902) (#1080) (4dab254)
- gemini: resolve native CCR retrieval calls (#2253) (2483f57)
- grok: preserve business-seat auth while routing only inference (#2514) (e4076bb)
- harden fd lifecycle and SystemError handling in runtime and proxy kill (#1556) (f42ce4a)
- health: label kompress as degraded/optional when not yet loaded (#2865) (8949371)
- image: decouple routing types from trained_router so importing the compressor doesn't import torch (#2513) (#2537) (d7cf981)
- image: reuse image models instead of rebuilding them per request (#2513) (#2536) (2a63ec7)
- init/codex: don't delete per-profile provider settings (#2146) (8da4384)
- install/windows: register persistent-task from S4U hidden XML (#2453) (#2459) (1edaeb8)
- install: carry upstream-routing env overrides into supervised deployments (#2429) (170b04a)
- install: consolidate Windows fallback and cleanup safety (#2980) (ddd2a25)
- install: default to cache mode, matching
headroom proxy(#1893 follow-up) (#2563) (b121223) - install: don't crash the PowerShell installer when $PROFILE is unset (#2469) (fc5c4e2)
- install: guard non-dict health config in 'install status' (#2150) (8f867e4)
- install: honor HEADROOM_PORT in install apply and deploy (#3085) (58f28dc)
- install: migrate deployments off the retired chopratejas image repo (#2427) (17ff13c)
- install: stop the PowerShell installer leaking temp dirs into the real user PATH (#2985) (ddd9f76)
- install: trust Docker bridge for dashboard metadata (e044139)
- install: use --userns=keep-id under Podman so bind-mount writes don't fail (#2846) (3488f8d)
- install: use CREATE_NO_WINDOW instead of DETACHED_PROCESS on Windows (#2527) (045f3df)
- kompress: let orgs run Kompress on their own inference stack (#2736) (3d23d76)
- kompress: load merged.pt for the v2 checkpoint instead of the unmerged PEFT safetensors (#2716) (46da91b)
- kompress: raise the default execution-slot wait (#2456) (5bd2266)
- kompress: reject artifacts that fail at run, and prefetch model files at startup (#2740) (224578e)
- learn/claude: don't abort the whole scan on a null message line (#2299) (eed80dd)
- learn/gemini: stop double-counting session tokens (#2230) (29d8a5e)
- learn/grok: detect a Windows absolute project path (#2283) (e240df2)
- learn: detect the active OpenCode database (#2587) (f74d874)
- learn: don't desync verbosity pairing on empty assistant turns (#2123) (def2f9a)
- learn: filter ambient user-role scaffolding (#2275) (3eb0122)
- learn: include stdout in CLI failure messages, not just stderr (#3080) (c5563d3)
- learn: keep traceback tail in tool-error digest preview (#2596) (85e8699)
- learn: run project discovery off the event loop (#2731) (a70e5ff)
- learn: stop classifying a successful exit code 0 as an error (#2289) (a24fe7d)
- learn: treat unreadable candidate paths as absent in project decode (#2446) (a09ba6c)
- litellm: add async_post_call_success_hook to HeadroomCallback (#1322) (3107994)
- litellm: don't forward a caller key the target cannot accept (#2883) (2f2950a)
- litellm: forward chat_template_kwargs and other vendor top-level fields to OpenAI-compatible backends via extra_body (#2128) (#2163) (fb683e1)
- mcp/claude: don't clobber an unparseable Claude config on register (#1660) (bc24e25)
- mcp: mcp status checks ~/.claude.json, not only ~/.claude/mcp.json (#990) (9e376af)
- mcp: pin mcp dependency to <2.0.0 to prevent server startup crash (#2642) (b3f016b)
- mcp: reap orphaned mcp serve on client death (#2226) (7a5d8a7)
- mcp: regenerate stale server.json (0.27.0 -> 0.32.0) (#2218) (79d8056)
- mcp: restore SDK v1 compatibility cap (#2978) (6077e5a)
- memory: audit passive context injection (#2212) (2de07db)
- memory: bound the TrafficLearner pending-pattern accumulator (memory leak) (#2579) (1f5feff)
- memory: close DirectMem0 resources (6596182)
- memory: close MCP backend on shutdown (4bd8ecd)
- memory: don't crash inline memory extraction on a non-object <memory> block (#2470) (e00c6ff)
- memory: filter inactive graph-expanded results (#2210) (aa4515c)
- memory: keep vector metadata in sync (#2295) (c471800)
- memory: make explicit-project and user store keys collision-resistant (#2231) (f840d5f)
- memory: preserve semantically similar memories (#2303) (5279c33)
- memory: require explicit updates for supersession (#2188) (6d897e8)
- memory: sanitize entity_refs to prevent dict-shaped entries crashing search (#2951) (2d1e96b)
- memory: serialize MCP backend initialization (#2309) (0924755)
- memory: skip <system-reminder> blocks when building the retrieval query (#2195) (#2541) (4e5a67a)
- memory: sync FTS5 and vector indexes on CLI delete/edit/prune/purge (fd4628d)
- metrics: attribute tool-schema savings per model, not just compression (#3155) (81fe9d5)
- normalize /p/<project> prefix on WebSocket upgrades so the Responses WS route is not rejected with 403 (#2379) (789a4f3)
- oauth2: make repository lint checks pass (c85abf7)
- observability: aggregate tool savings in OTEL (#2936) (941c25d)
- onnx: enforce Rust API-24 runtime compatibility (#2979) (a3fe5cb)
- onnx: stop ONNX thread pools from spinning idle cores (#2495) (#2540) (5c561bd)
- openai: skip Responses tool-search deferral for clients that cannot execute it (#2696) (54ea28d)
- openclaw-plugin: circuit breaker + per-request timeout for proxy resilience (#639) (6576ef6)
- opencode: send x-headroom-project header on all proxied requests (#2868) (eeb038b)
- opencode: ship the transport hook-shim so wheel installs route Node child traffic (702dbc5)
- opencode: Use opencode.jsonc when present (#1590) (4e2bbfe)
- opencode: use type=local + environment field for MCP config (#1380) (#1388) (a51bbfb)
- policy: price net-cost mutations with the 1h cache-write tier (#2780) (ef7e07e)
- providers/anthropic: don't crash token estimation on null tool_calls (#2472) (08466f3)
- providers/openai: bound tiktoken vocab loads with the guarded loader (#2554) (0805e8e)
- providers: don't crash on a non-object HEADROOM_MODEL_LIMITS / models.json (#3089) (3ed8f76)
- providers: give every model exactly one tokenizer (#2761) (cd92ed5)
- providers: stop a shorter model family shadowing a longer one (#2762) (0cb72f4)
- providers: stop pricing modern content blocks at zero (#2760) (06add9e)
- proxy/anthropic: don't buffer a CCR stream when passthrough discards the stream flip (#2953) (f1c34d3)
- proxy/anthropic: don't replay recorded prefix over live history (#3026) (#3052) (c16be9b)
- proxy/anthropic: inject headroom_retrieve whenever a CCR marker is present, not only for new markers (#2848) (3808f60)
- proxy/anthropic: None-guard usage token counts on the direct buffered path (#2434) (2b5ee7c)
- proxy/anthropic: repair headroom_retrieve history references the tools array cannot support (#2876) (7de3573)
- proxy/anthropic: run tool-search history repair after turn hooks (c6f9948)
- proxy/anthropic: stop answering a non-streaming turn with an event stream (#3142) (0e26fb8)
- proxy/batch: don't crash an OpenAI batch on a valid-JSON non-object line (#2316) (1f2c681)
- proxy/batch: preserve sibling tool configs on Google batch requests (#2177) (a5d7e12)
- proxy/bedrock: report uncached input tokens from backend usage, not the live-zone count (#2318) (c19e412)
- proxy/bedrock: wire PrefixCacheTracker updates into Bedrock backend paths (#2196) (a352fa0)
- proxy/cache: strip cache_control from messages in the semantic cache key (#3086) (2cae0f8)
- proxy/cost: count Gemini thinking tokens in output usage (#2639) (22b707f)
- proxy/cost: mark estimated-basis budget records and add an enforcement policy (#2713) (#2725) (01df245)
- proxy/cost: record each request's savings exactly once (drop 3 double-counts) (#2545) (0845b26)
- proxy/cost: warn once per model when pricing lookup fails (#2504) (#2535) (fa47637)
- proxy/debug: reconcile Kompress warmup state in /debug/warmup (#2711) (3a27c4d)
- proxy/gemini: forward a non-JSON upstream body with its real status (#2174) (f723925)
- proxy/gemini: guard CCR continuation usage against present-null counts (#3035) (a01897c)
- proxy/gemini: keep streaming-parity baseline so eligible_pct can't exceed 100 (#2824) (b97c7c6)
- proxy/gemini: None-guard token counts from usageMetadata (#2347) (f64aac9)
- proxy/gemini: tolerate malformed parts on the compression path (#2486) (07cf547)
- proxy/memory: don't crash memory tool-call detection on a null function (#2272) (8b7e797)
- proxy/metrics: cap client-supplied model label cardinality (#2480) (e24a7e6)
- proxy/metrics: escape label values in the Prometheus export (#2463) (6a53861)
- proxy/metrics: move the savings-ledger append off the event loop (#2439) (4aac068)
- proxy/openai: cache under looked-up messages (#2420) (7052d52)
- proxy/openai: don't crash the Responses memory tool loops on null arguments (#2273) (a30db2c)
- proxy/openai: don't record Codex WS savings without input accounting (#2493) (2195ba7)
- proxy/openai: feed chat/completions traffic into the traffic learner (#2333) (6cdfd3f)
- proxy/openai: feed Codex WS traffic into the traffic learner (#2334) (f669149)
- proxy/openai: None-guard usage token counts on the chat path (#2431) (313c290)
- proxy/openai: propagate provider usage on the Responses WS->HTTP fallback (#2988) (536c949)
- proxy/openai: replay incremental events in buffered Responses SSE (#2410) (#2415) (0cbc0e8)
- proxy/openai: run response hooks on Responses, and bill their re-drives (#2872) (675d13f)
- proxy/openai: run tool-description compaction on chat-completions (#2741) (f9db5b5)
- proxy/output-shaping: tolerate a non-string system block text in steering (#2435) (3e97671)
- proxy/perf: count turn-hook message folds in token accounting (#2520) (c371d5a)
- proxy/perf: tokenizer-consistent token accounting + surface tool-schema savings (#2542) (1cc53c9)
- proxy/savings: append history point on cache-only savings too (#2194) (d125805)
- proxy/streaming: preserve non-standard content-block fields on SSE reconstruction (#2271) (6decbd1)
- proxy/streaming: tolerate malformed content in _response_to_sse (#2481) (77b26c0)
- proxy: accept Codex websocket before upstream retries (#2203) (551f473)
- proxy: adapt 200 SSE upstream replies on buffered /v1/responses instead of 502 (#2622) (d76fce0)
- proxy: align signed-thinking wire accounting (#3015) (b3f4436)
- proxy: allow settings routes for trusted gateway/dashboard clients (#2491) (a5b0a8f)
- proxy: batch small Codex Responses tool outputs (#2239) (09c66ac)
- proxy: cache litellm model resolution to stop repeated Provider List spam (99f07e7)
- proxy: cancel periodic TOIN task on shutdown (739fdef)
- proxy: close the upstream stream when a streaming body is never consumed (0951663)
- proxy: complete stateless Responses and buffered CCR lifecycle (#2997) (8a1d38b)
- proxy: compress cache-mode cold starts and tag prefix-mismatch passthrough (#2365) (aaeba0a)
- proxy: compress OpenCode tool schemas and embedded JSON (#1535) (05932d7)
- proxy: dedupe Codex WS request logging for accurate mixed-provider dashboards (#2189) (e5b3a63)
- proxy: emit request log timestamps in UTC (620028f)
- proxy: enable tool search by default and repair poisoned transcripts (#2807) (0237cbf)
- proxy: gate mid-turn message coalescing to Claude Code clients (#1643) (a4bd2e6)
- proxy: give each Codex /v1/responses WS turn a unique request_id (#2164) (d02df10)
- proxy: graceful shutdown and reliable Ctrl+C exit (#621) (17cdb18)
- proxy: guard feedback endpoints and add CSRF checks to loopback writes (#3060) (a6ab359)
- proxy: guard telemetry and TOIN endpoints (cde1513)
- proxy: include tool_search_deferral savings in the savings ledger (12149f7)
- proxy: keep anthropic ccr compression active across deferred injection (#2291) (#2297) (26b43f6)
- proxy: keep buffered CCR streams alive (#2479) (a2e42fb)
- proxy: keep core tools and the client's ToolSearch resident for PascalCase clients (#2647) (1d29738)
- proxy: keep prefixed core tools resident (#3046) (2f4d001)
- proxy: key drift detector on conversations, not credentials; canonicalize drift hashes (#2301) (6744833)
- proxy: offload OpenAI and Gemini tokenizer counting off the event loop (#2498) (806d2e4)
- proxy: one bad extension no longer aborts proxy startup (#2215) (cb6c828)
- proxy: pass through cross-region prefixed Bedrock model IDs directly (#2330) (64cb46e)
- proxy: port session-sticky beta headers to the Rust proxy (#2381) (f6398a6)
- proxy: preserve Codex WebSocket model attribution (#3029) (a06a51e)
- proxy: preserve content-part array structure in excluded-tool lossless fold write-back (#2261) (8951a26)
- proxy: preserve merged session and quarantine contracts (#2943) (039cd24)
- proxy: preserve signed Anthropic thinking blocks on outbound re-serialize (#2254) (dc163bc)
- proxy: promote Kompress health after runtime load (#2402) (54526bc)
- proxy: quarantine compression while timed-out workers run (#2292) (517bf99)
- proxy: reassemble server_tool_use.input from streamed partial_json (#2449) (8c8fae0)
- proxy: record Prometheus metrics for POST /v1/compress (#2247) (81d40a6)
- proxy: reject rate_limit_requests_per_minute=0 when limiting is enabled (#2142) (8a71947)
- proxy: relocate stray system-role messages to the top-level system param (#765) (#1357) (9fde127)
- proxy: repair main lint (ruff-format drift + mypy host_header) (#2268) (718c8dc)
- proxy: report deferred Kompress status and promote health from cache (#2564) (d50cfab)
- proxy: restore the buffered-CCR heartbeat behind a grace window (#3091) (a29d201)
- proxy: route Codex Live voice through a dedicated /v1/live transport (#2709) (232fb49)
- proxy: satisfy rustfmt import ordering (#2158) (f008336)
- proxy: scope the signed-thinking lock to blocks that actually changed (#3124) (17522fb)
- proxy: skip max_tokens rename for backend-routed openai chat (#2401) (d6a1af4)
- proxy: skip OpenAI tool_search deferral for Codex client (#2729) (56b3e4c)
- proxy: skip Responses memory tools for ChatGPT auth (#1579) (1c50eca)
- proxy: stop a lone surrogate turning a thinking body into a 500 (#3134) (284ff31)
- proxy: stop cached responses replaying the producing turn's wire framing (#3024) (9d37059)
- proxy: stop discarding compressed Codex WS later-frame payloads (#2823) (4ec416d)
- proxy: stop operator secrets following a client-chosen upstream (#3122) (05f5ef4)
- proxy: stop toggling headroom_retrieve in the Anthropic tools array (#2672) (08fce29)
- proxy: support Codex WS compatible gateways (#1281) (ac7ee4e)
- proxy: time-cap the compression timeout-debt quarantine (#2360) (#2412) (c5a08d2)
- proxy: tune macOS libmalloc and trim allocator pages so long-lived RSS stays bounded (#2879) (6d87825)
- proxy: unwrap Hermes tool_call bridge in tool name map (#2717) (a97b824)
- publish headroom-opencode in release workflow (#2372) (7859154)
- release: publish Windows wheel + sdist (disable PyPI attestations, #112) (#2405) (f9cbdd6)
- release: sync generated version metadata on the release branch (#2659) (5383c6b)
- remove rtk and lean-ctx CLI context tools (#2677) (e0ce4b1)
- replace computer_call_output with apply_patch_call_output in output_shaper (#2250) (63f74aa)
- reporting: show net vs gross savings, real skip thresholds, and the effective profile (#3123) (250ede2)
- router: stop counting an image's base64 payload as suffix tokens (#2778) (f03cc6d)
- router: stop protecting passing build/test output as error traces (#1740) (7ab83c5)
- rust: port CJK-aware relevance-query matching to CodeCompressor (#2634) (e86c639)
- savings: don't bill free models at the $3/M fallback in the ledger (#2147) (fb17156)
- savings: don't fabricate output savings for a free (zero-priced) model (#2298) (ec12e18)
- savings: record pre-compression original as ledger before, not forwarded count (#2176) (195ed90)
- savings: surface request growth the tok_saved clamp swallows (#2708) (184146b)
- security: address u9up assessment findings (WEB-0107) (#2207) (1f96dab)
- security: exclude compromised ast-grep-cli 0.44.1 (supply-chain trojan) (#2342) (494fb5a)
- settings: accept documented HEADROOM_* env names as settings keys (#2833) (de9e052)
- stats: report one "Tokens Saved" headline across every harness (#2737) (8262a4a)
- stats: tag streamed output token source (#2214) (1c9585d)
- subscription: dedup transcript usage by message id (#2340 token inflation) (#2408) (74275b7)
- subscription: keep efficiency_pct from exceeding 100% (#2121) (5fb449e)
- subscription: read newest transcript tail (#2310) (793d20f)
- telemetry: anonymous compression stats no prompts, no data (#2728) (9cfb008)
- telemetry: only advance usage-report baseline after a 200 (#2149) (0cddac6)
- telemetry: stop mixing tokenizer scales in RequestOutcome, and fix the overhead framing (#2756) (04e1517)
- tests: repair three main-branch test failures (#2306) (1d79e70)
- toin: bound private query and pattern retention (8cd1380)
- tokenizer: coerce non-string tool_call fields before counting (#2801) (b6f9877)
- tokenizer: price CJK in the Rust fixed-ratio estimator (Python parity) (#2260) (6840153)
- tokenizers: count HuggingFace chat templates, and resolve gpt-5 / gateway-wrapped names (#2758) (0ed306b)
- tokenizers: price Claude against a real BPE (tiktoken o200k) not a char estimate (#2543) (285176b)
- tokenizers: resolve gpt-5 and mixed-case model names to the right encoding (#2776) (fc4680b)
- tool_search_tool_regex deferred and falsely resolved on direct-Anthropic path (#2971) (8ea87e7)
- transforms/adaptive-sizer: honor max_k on small-input fast path (#2319) (8a90523)
- transforms/cross-turn-dedup: don't renumber-fold zero-padded line prefixes (#2369) (f4070c4)
- transforms/kompress-remote: keep compress fail-open on malformed 200 (#2320) (b759990)
- transforms/smart_crusher: don't crash on a tool call with a null function (#2232) (3bb02f8)
- transforms: guard Log fallback against invalid JSON + fix MIXED false-positive on source code (#1347) (02c7764)
- transforms: stop ContentRouter recompressing headroom_retrieve results (#2654) (677e097)
- Vertex model pricing shows $0.00 for versioned model names and vertex:anthropic provider (#2517) (eb5b5e4)
- vscode: persist compatible Claude modes and route Copilot CAPI (#2986) (1aa701a)
- windows: unwedge compression on degraded ONNX runtimes (every request timing out at 30s, 0% savings) (#822) (36202f4)
- wrap/claude: bind _wrap_settings_path before the try (#2126) (faed4dc)
- wrap/claude: keep --1m effective when an explicit --model is passed through (c093bf1)
- wrap/codex: export the detected custom upstream base URL (#2125) (d236b27)
- wrap/opencode: verify the opencode binary before mutating config (ae38486)
- wrap/serena: install Serena from the serena-agent PyPI wheel, not the git source (d7b25ae)
- wrap/serena: stop creating serena_config.yml, unbricking Serena on fresh installs (#2676) (759209c)
- wrap: drop -p short flag from wrap claude so claude's own -p/--print passes through (#2048) (14011b4)
- wrap: emit bare dotted keys for Codex --config overrides (#2383) (f57e959)
- wrap: honor Copilot OAuth wire-api override and model default (#2387) (1db6d88)
- wrap: make RTK opt-in (off by default) across wrap subcommands (#2344) (44136ed)
- wrap: read/write instruction files as UTF-8 on Windows (#1245) (6413cc7)
- wrap: self-heal a stale ANTHROPIC_BASE_URL left by a dead proxy (#2223) (8537e2c)
- wrap: serialize shared proxy startup (#2946) (e540d64)
- wrap: set xAI upstream for grok-build proxy (#2772) (c831081)
- wrap: skip Serena project setup outside real project roots (#2574) (0994ea0)
- wrap: stop same-port persistent routing during claude unwrap (#2340) (#2350) (cf5fa64)
- wrap: stop the launch cwd from shadowing the installed package in the proxy subprocess (#2843) (c49be26)
- wrap: stop the Serena pre-index stalling the launch path for 300s (#2945) (6147883)
- wrap: verify proxy deps before mutating Codex config (#1628) (b7f342c)
Performance Improvements
- content_router: dedupe content detection (#2419) (9b016f2)
- cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) (#2838) (53af90d)
- perf: skip rotated logs outside the requested window (#3081) (6c9f41e)
- proxy: bound upstream calls and hot-path costs (#2852) (f624d3a)
- subscription: skip transcripts older than the window in compute_window_tokens (#2861) (91d6bf3)
- surface optimization overhead diagnostics (#1212) (7ddcbcb)
Dependencies
- bump axum from 0.7.9 to 0.8.9 (#2966) (5731be7)
- bump brace-expansion from 5.0.7 to 5.0.9 in /docs (#2751) (56ee57b)
- bump bytesize from 1.3.3 to 2.4.2 (#2286) (6448545)
- bump criterion from 0.5.1 to 0.8.2 (#2965) (b30f339)
- bump hf-hub from 0.4.3 to 0.5.0 (#2285) (4925bf6)
- bump next from 16.2.10 to 16.3.0 in /docs (#2750) (0fd0b99)
- bump postcss from 8.5.19 to 8.5.25 in /plugins/openclaw (#2749) (cd60ee9)
- bump postcss from 8.5.19 to 8.5.25 in /plugins/opencode (#2748) (ff4e016)
- bump postcss from 8.5.19 to 8.5.25 in /sdk/typescript (#2747) (267c2bd)
- bump postcss from 8.5.19 to 8.5.26 in /docs (#2881) (e6e5826)
- bump ruff from 0.15.17 to 0.15.22 in the pip-minor-patch group (#2501) (ecf130d)
- bump ruff from 0.15.22 to 0.16.2 in the pip-minor-patch group across 1 directory (#2962) (ff17961)
- bump rusqlite from 0.32.1 to 0.40.1 (#2287) (522faa1)
- bump sha2 from 0.10.9 to 0.11.0 (#2288) (322425c)
- bump the cargo-minor-patch group across 1 directory with 22 updates (#2916) (148d860)
- bump the cargo-minor-patch group across 1 directory with 4 updates (#2964) (888a9f4)
- bump the cargo-minor-patch group with 10 updates (#2284) (3266ed7)
- bump the npm-minor-patch group across 3 directories with 7 updates (#2276) (961866b)
- bump tokio-tungstenite from 0.24.0 to 0.30.0 (#2967) (bbe9013)
- update mcp requirement from <2.0.0,>=1.28.1 to >=1.28.1,<3.0.0 (#2963) (d6fb536)
Code Refactoring
- pricing: make LiteLLM the source of truth, not the hardcoded table (#2779) (0e1d6bf)
- proxy: extract tool definition serialization (#1998) (ad6ab48)
- remove the dead headroom/prediction module (#2692) (b7a79ac)
- transforms: dispatch simple built-in strategies via the compressor registry (#2399) (fc9c63f)
- wrap: retire tokensave; Serena is the code-memory MCP (#2499) (5d23a0a)
This PR was generated with Release Please. See documentation.