headroom/release-notes.md
2026-08-20 19:22:29 -05:00

99 KiB
Raw Blame History

🤖 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 inspect to view original vs compressed content (#1595) (942e916)
  • cli: add wrap openclaude for 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 ml feature (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 kimi for 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 claude proxy 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.