What's Changed
- fix(dashboard): price proxy savings without litellm by @rodboev in #1728
- fix(proxy): surface codex websocket loop failures in livez by @rodboev in #1727
- fix(savings): guard non-finite numeric coercion by @inix-x in #1769
- feat(content-router): accept any real compression (remove min-savings floor) by @chopratejas in #1771
- fix(content-router): token-measure lossless folds at the acceptance gate by @chopratejas in #1772
- fix(opencode): expose headroom/* models in injected provider config by @Parideboy in #1716
- Wire OpenAI Responses output shaping by @amcfague in #1438
- perf(proxy): cap compression workers to CPU count by @rodboev in #1803
- fix(proxy): bound Codex WS compression fallback latency by @rodboev in #1802
- fix(transforms): normalize diff compressor context by @rodboev in #1801
- feat(proxy): add provider-only HTTP proxy by @amcfague in #1807
- perf(savings): batch tracker persistence off the request hot path by @inix-x in #1817
- fix(dashboard): deduplicate repeated savings metrics by @rodboev in #1804
- fix(opencode): use local MCP config by @rudironsoni in #1383
- fix(copilot): normalize subscription routing host by @rodboev in #1836
- fix(proxy): cancel retry backoff on shutdown by @rodboev in #1834
- feat(content-router): lossless-first dispatch, cross-turn dedup, and A7 lossy-after-fold by @chopratejas in #1818
- fix(proxy): strip 1m model suffix before upstream forwarding by @aivinay in #1840
- fix(docker): persist headroom workspace in compose by @aivinay in #1839
- fix: detect and clear stale ANTHROPIC_BASE_URL from crashed wrap sessions (#1768) by @Parideboy in #1837
- fix(proxy): freeze must forward cached (compressed) prefix byte-identical — stop token-mode cache busting by @chopratejas in #1850
- fix(build): enable Intel macOS pip installs via ort-load-dynamic by @2rob in #1538
- fix(proxy): retry passthrough on transient upstream connection close by @gaurav0107 in #1513
- fix(proxy): keep cache_control bounded + stable so the freeze overlay stops busting by @chopratejas in #1852
- fix(proxy/openai): thread savings-profile kwargs into chat completions by @abhay-codes07 in #1606
- fix(proxy): retry HTTP/2 stream resets instead of 502ing by @tenderdeve in #1645
- fix(codex): OpenCode Zen telemetry attribution by @aivinay in #1648
- fix(proxy): persist lifetime cache-read savings across restarts by @inix-x in #1665
- fix: correct Go AST compression bugs and CODE_AWARE token accounting by @shekharcharles in #1668
- fix(install): persist --no-http2 override through install apply by @rodboev in #1676
- fix(wrap): replace stale-proxy detection with Vite-style port fallback by @lennney in #1406
- fix(proxy): stop rtk stat failures from corrupting session baseline by @inix-x in #1693
- fix(rtk): link managed rtk onto PATH instead of mutating the hook by @tenderdeve in #1698
- fix(install): pass sc.exe create as raw command line so binPath= quoting survives (#1654) by @Parideboy in #1702
- docs: add pipeline-extension recipe and x-headroom-base-url routing docs by @Parideboy in #1712
- fix(transforms): pass through ragged tables instead of misaligning columns by @Parideboy in #1713
- fix(proxy): bound HF tokenizer load and offload token counting off event loop by @Parideboy in #1738
- fix(content-detector): detect and compress space-separated JSON objects by @rohanprichard in #1742
- fix(code-compressor): CJK-aware relevance-query symbol matching by @lifeodyssey in #1747
- docs(readme): correct lean-ctx comparison row by @ketpatil77 in #1754
- [codex] docs: remove retired IntelligentContext copy by @ketpatil77 in #1756
- [codex] docs: add Codex install note by @ketpatil77 in #1757
- docs(readme): update lean-ctx comparison row by @Parideboy in #1711
- [codex] docs: add pipeline extension recipe by @ketpatil77 in #1758
- fix(proxy/openai): translate max_tokens -> max_completion_tokens on chat path by @chopratejas in #1774
- fix(ccr): make expired retrieve misses terminal by @rodboev in #1781
- fix(toin): publish skip compression recommendations by @rodboev in #1782
- fix(proxy): preserve streaming passthrough beta headers by @rodboev in #1783
- fix(mcp): surface dead proxy state by @rodboev in #1786
- fix(proxy): subtract cache write premiums from net savings by @rodboev in #1800
- fix(streaming): preserve server_tool_use sse blocks by @rodboev in #1826
- fix(cache): avoid fallback session collisions by @rodboev in #1827
- Install using uv tool globally by @burkestar in #1829
- agent_savings: don't crash the proxy on an unknown savings profile by @gglucass in #1830
- fix: use rtk native Cursor hook instead of injecting .cursorrules (#756) by @Parideboy in #1846
- fix(proxy): serve /favicon.ico locally instead of tunneling upstream (#1787) by @Parideboy in #1847
- fix(proxy): release _active_streams session lock on setup-phase errors by @orty in #1864
- fix(router): honor MCP aliases in excluded tools (#1822) by @aivinay in #1863
- fix(learn): decode Windows drive-style project dirs with dotted usernames by @Parideboy in #1855
- docs(orchestration): guide repeated agent wakes with CCR by @rodboev in #1871
- docs: retire IntelligentContext from README and installation guide by @bhavyachopra99 in #1445
- fix(proxy): fsync savings dir after atomic rename by @inix-x in #1764
- fix(copilot): route mixed-model requests per model by @rodboev in #1785
- fix(docker): report source build version by @aivinay in #1862
- feat(cache): provider-agnostic cache-mode delta + cc-agnostic prefix comparison by @chopratejas in #1868
- Tejas/tool search deferral by @chopratejas in #1885
- fix(proxy): route Foundry Anthropic messages by @aivinay in #1878
- fix(proxy): compress Anthropic user text blocks when enabled by @julienguarino in #1875
- fix(codex): discover updated Codex state stores by @rodboev in #1889
- fix(mcp): isolate ClaudeRegistrar CLI config env by @rodboev in #1888
- fix(memory): resolve Trae cwd metadata from user reminders (#1737) by @rodboev in #1887
- feat(proxy): add turn-hook extension point for buffered model turns by @chopratejas in #1891
- fix(dashboard): distinguish unavailable RTK from zero stats in Docker by @rodboev in #1900
- fix(ccr): preserve thinking blocks in buffered stream re-synthesis by @rodboev in #1897
- fix(ccr): preserve Anthropic re-stream shape by @eggrollofchaos in #1854
- fix(evals): default unparseable judge scores below pass threshold by @rodboev in #1892
- deps: bump the cargo-minor-patch group across 1 directory with 7 updates by @dependabot[bot] in #1909
- deps: bump the npm-minor-patch group across 4 directories with 18 updates by @dependabot[bot] in #1907
- fix(dashboard): distinguish unavailable RTK from zero stats in Docker by @rodboev in #1901
- feat(compression): add audit-safe mode with protected pattern matching by @rodboev in #1899
- fix(cli/proxy): preserve explicit HEADROOM_MIN_TOKENS=0 / MAX_ITEMS=0 by @abhay-codes07 in #1886
- feat(ccr): wire retrieve-tool interception into OpenAI Responses handler by @rodboev in #1898
- chore: sync version state to released 0.30.0 to unblock release-please by @chopratejas in #1916
- ci(devcontainers): free runner disk on the default variant too by @chopratejas in #1917
- chore: release main by @github-actions[bot] in #1918
- Tejas/turn hooks extension by @chopratejas in #1903
- feat: ship the coding profile as Headroom's out-of-box default posture by @chopratejas in #1893
- fix(proxy): keep OpenAI tool observations mutable in cache mode by @JerrettDavis in #1884
New Contributors
- @amcfague made their first contribution in #1438
- @2rob made their first contribution in #1538
- @gaurav0107 made their first contribution in #1513
- @lennney made their first contribution in #1406
- @rohanprichard made their first contribution in #1742
- @ketpatil77 made their first contribution in #1754
- @burkestar made their first contribution in #1829
- @bhavyachopra99 made their first contribution in #1445
Full Changelog: v0.30.0...v0.31.0