What's Changed
- ci(release-please): use a PAT so releases trigger the publish workflows by @chopratejas in #1920
- ci: bump actions/checkout from 4 to 7 by @dependabot[bot] in #1414
- fix(memory/sync): make Codex AGENTS.md adapter additive (stop wiping memories) by @abhay-codes07 in #1674
- fix(proxy): honor x-headroom-base-url on /v1/messages route by @adryanev in #1763
- fix(litellm): surface Bedrock cache token usage in non-streaming responses by @dspv in #1848
- fix(copilot-auth): stop discarding the caller's valid Copilot auth token by @yehsuf in #1879
- fix(learn): handle Windows UTF-8, drive-letter paths, and CLI shim fallback by @rodboev in #1895
- fix(code): stop TS export duplication + comment displacement by @sogko in #1906
- ci: bump actions/cache from 5 to 6 by @dependabot[bot] in #1413
- fix(proxy): record cache metrics for non-streaming backend paths by @Sujit-1509 in #1271
- fix(code): parse-probe tree-sitter availability in code_handler (#1231) by @RTCartist in #1300
- fix(install): write deployment manifest atomically and tolerate corrupt manifests by @SuperMarioYL in #1303
- fix(release): sync all package versions to v0.31.0 by @MdHussain121 in #1882
- fix(wrap): preserve custom Codex provider base_url during proxy injection by @rodboev in #1894
- ci(opencode): compile + test the OpenCode plugin on changes by @chopratejas in #1750
- fix(bedrock): resolve global.* inference profiles + pin per-user app-profile ARNs by @KennethWKZ in #1795
- fix(mcp): correct default Claude Code config path in ClaudeRegistrar by @exKAZUu in #1859
- fix(search-compressor): CJK-aware relevance + harden Rust/Python parity by @lifeodyssey in #1749
- fix(adaptive-sizer): char bigrams for spaceless CJK items by @lifeodyssey in #1748
- deps: bump @types/node from 22.20.0 to 26.1.1 in /plugins/opencode by @dependabot[bot] in #1688
- deps: bump @types/node from 22.19.15 to 26.1.1 in /plugins/openclaw by @dependabot[bot] in #1685
- deps: bump fumadocs-typescript from 4.0.14 to 5.3.0 in /docs by @dependabot[bot] in #1684
- deps: bump @types/node from 25.5.2 to 26.1.1 in /docs by @dependabot[bot] in #1683
- fix(proxy): count exhausted upstream 5xx as failed across all providers by @rocker-zhang in #1571
- fix(proxy): preserve upstream 5xx status on retry exhaustion by @rocker-zhang in #1570
- fix(litellm): inherit CustomLogger so future hooks don't crash proxy (#1114) by @peterlodri-sec in #1391
- fix(scripts): rename .releaseetadata to .releasemetadata by @SEPURI-SAI-KRISHNA in #1246
- fix(proxy): hoist ccr_workspace_key default so /v1/messages survives CCR-inject off by @ahhdammm in #1096
- ci: allow PyPI deps during CPU torch install by @JerrettDavis in #1930
- fix(proxy): strip duplicated upstream server headers by @rodboev in #1828
- fix: emit unknown Anthropic content blocks verbatim in buffered-to-SSE conversion by @mvanhorn in #1825
- [codex] Document local LLM prefill benchmarking by @panamarob30-jpg in #1396
- fix: patch nltk vulnerability (CVE-2026-54293) by @orbisai0security in #1929
- fix: harden persistent install startup by @JerrettDavis in #1851
- Extract request log redaction policy by @JerrettDavis in #1968
- chore: extract agent-evals into standalone headroom-bench repo by @chopratejas in #1967
- fix(dedup): shorter fold pointer + MIN_LINES=3, dedup Anthropic list-… by @chopratejas in #1932
- fix(proxy): strip inbound Content-Encoding on messages/chat forward by @abhay-codes07 in #1970
- fix(memory/sync): don't clobber memories sharing a first line by @abhay-codes07 in #1976
- fix(learn): parse fenced JSON even with a prose preamble by @fculpo in #1988
- refactor(proxy): isolate body forwarding policy by @JerrettDavis in #1935
- refactor(pricing): isolate litellm model resolution by @JerrettDavis in #1936
- refactor(ccr): isolate tool call classification by @JerrettDavis in #1937
- refactor(output): isolate verbosity steering by @JerrettDavis in #1940
- refactor(proxy): isolate forwarded header policy by @JerrettDavis in #1942
- fix(proxy): cache_savings_usd silently zeroes when litellm is unavailable by @dspv in #2005
- fix(proxy): preserve terminal tool on Codex Responses by @rodboev in #2000
- refactor(cache): isolate compression strategy outcomes by @JerrettDavis in #1938
- refactor(proxy): isolate auth classification policy by @JerrettDavis in #1945
- refactor(transforms): isolate mixed content parsing by @JerrettDavis in #1939
- fix(proxy): keep PRE_SEND from reintroducing empty tool arrays by @rodboev in #2015
- ci: add Windows wheel build job (win_amd64) by @sgfdhgfnjgmhgmnfd657-sys in #1086
- fix(models): version-boundary longest-prefix match in ModelRegistry.get by @abhay-codes07 in #1658
- refactor(output): isolate savings policy by @JerrettDavis in #1947
- refactor(memory): isolate query construction policy by @JerrettDavis in #1950
- refactor(memory): isolate injection decision policy by @JerrettDavis in #1952
- refactor(proxy): isolate rate limit policy by @JerrettDavis in #1954
- refactor(cache): isolate semantic key policy by @JerrettDavis in #1953
- refactor(proxy): isolate project attribution policy by @JerrettDavis in #1957
- refactor(proxy): isolate memory rank policy by @JerrettDavis in #1960
- refactor(proxy): isolate output effort policy by @JerrettDavis in #1961
- Extract request limit policy by @JerrettDavis in #1982
- fix(transforms/code): coerce language aliases instead of raising by @abhay-codes07 in #1975
- refactor(proxy): isolate proxy mode policy by @JerrettDavis in #1965
- fix(savings): cap ledger retention at 30 days by @ztkent in #1985
- refactor(proxy): extract tool injection config by @JerrettDavis in #2010
- Extract Python forwarder mode policy by @JerrettDavis in #1987
- fix(proxy): preserve chatgpt responses streaming by @ousamabenyounes in #2012
- Extract tool schema savings policy by @JerrettDavis in #1971
- fix(cache/semantic): key entries by context hash, not query text by @abhay-codes07 in #2022
- fix(kompress): surface model-not-ready state via logs and health endpoint by @lennney in #2034
- test(memory): skip decorators on offline model misses by @JerrettDavis in #2020
- refactor(proxy): extract ccr session tracker by @JerrettDavis in #2003
- fix(wrap): keep Claude context-tool setup explicit by @rodboev in #1999
- fix(packaging): guard torch extras on intel macos by @ousamabenyounes in #2011
- fix(proxy): handle ClientDisconnect in passthrough body reads by @lennney in #2033
- refactor(proxy): isolate image compression policy by @JerrettDavis in #1958
- Extract project name policy by @JerrettDavis in #1974
- Extract loop callback failure policy by @JerrettDavis in #1977
- deps: bump toml from 0.8.23 to 1.1.2+spec-1.1.0 by @dependabot[bot] in #1517
- deps: bump tower-http from 0.6.11 to 0.7.0 by @dependabot[bot] in #1520
- deps: bump thiserror from 1.0.69 to 2.0.18 by @dependabot[bot] in #1519
- deps: bump prometheus from 0.13.4 to 0.14.0 by @dependabot[bot] in #1518
- fix(update): prevent _core.pyd corruption on Windows when proxy is running by @JoaoMarcos44 in #1581
- deps: update tree-sitter requirement from <0.26,>=0.25.2 to >=0.25.2,<0.27 by @dependabot[bot] in #1681
- fix(mcp/opencode): don't clobber an unparseable opencode.json on register by @abhay-codes07 in #1661
- fix(cache): partial cached-prefix replay + idle-aware net-cost; don't… by @chopratejas in #1933
- feat(codex): keep wrap routing session-scoped by @rodboev in #1507
- feat(observability): add gen_ai.request.model to the compression span by @Krishnachaitanyakc in #1667
- feat(simulators): add provider simulator service by @JerrettDavis in #2014
- refactor(proxy): isolate output turn policy by @JerrettDavis in #1962
- refactor(proxy): isolate semantic cache key policy by @JerrettDavis in #1964
- Extract wire debug redaction policy by @JerrettDavis in #1972
- refactor(proxy): extract internal header policy by @JerrettDavis in #1990
- fix(ccr): don't crash parse_tool_call on non-object tool arguments by @abhay-codes07 in #2071
- Extract SSE byte buffer policy by @JerrettDavis in #1979
- refactor(proxy): extract tool injection tracker by @JerrettDavis in #2002
- refactor(proxy): extract ccr golden replay policy by @JerrettDavis in #2006
- refactor(proxy): extract tool name policy by @JerrettDavis in #2008
- refactor(proxy): extract tool injection policy by @JerrettDavis in #1995
- refactor(proxy): extract tool injection logging by @JerrettDavis in #2009
- refactor(proxy): extract ccr marker policy by @JerrettDavis in #2004
- Extract wire debug format policy by @JerrettDavis in #1978
- Extract diagnostic decode policy by @JerrettDavis in #1981
- Extract query log policy by @JerrettDavis in #1984
- Extract memory injection mode policy by @JerrettDavis in #1986
- refactor(proxy): extract beta header policy by @JerrettDavis in #1992
- refactor(proxy): extract memory golden replay policy by @JerrettDavis in #2007
- feat(transforms): first-class C# support in CodeAwareCompressor by @jecacs in #1926
- fix(proxy/gemini): thread savings-profile kwargs into apply() by @abhay-codes07 in #1994
- fix(proxy): handle ClientDisconnect in passthrough body reads + log sanitization by @lennney in #2067
- fix(proxy): allow HEAD method on catch-all passthrough route by @lennney in #2035
- refactor(providers): split proxy route adapters by @JerrettDavis in #1934
- fix(dashboard): serve per-request metadata to trusted-gateway peers by @KennethWKZ in #1766
- fix(install): only validate requested targets on the manual path by @abhay-codes07 in #1659
- feat(proxy): report new-content-relative input savings rate in /stats by @gglucass in #2058
- fix(subscription/copilot): preserve remaining=0 for exhausted quota by @abhay-codes07 in #1997
- fix(proxy/anthropic): scope session id by top-level system prompt by @abhay-codes07 in #2070
- fix(memory): track MCP retrieval access by @superdiaodiao in #2065
- refactor(proxy): extract beta header merge policy by @JerrettDavis in #1993
- refactor(proxy): isolate output verbosity policy by @JerrettDavis in #1963
- fix(proxy/openai): respect explicit stream_options.include_usage by @abhay-codes07 in #2026
- fix(proxy/vertex): route google-publisher requests to the request region by @abhay-codes07 in #2069
- feat(proxy): extend output shaping to the OpenAI Responses path (Codex HTTP + WS) by @alex33d in #1943
- fix(proxy): only queue mid-turn messages for opt-in clients with explicit session header by @wzy-del in #1951
- fix(tokenizers): price CJK in the fixed-ratio estimator path by @abhay-codes07 in #2080
- fix(proxy): handle content-part outputs in Codex Responses compression by @lennney in #2052
- fix(health): exclude kompress from aggregate readiness + adversarial PBT by @lennney in #2066
- feat(proxy): persist per-model savings breakdown in proxy_savings.json by @lennney in #2055
- feat(wrap): allow project RTK instruction opt-out by @Bortlesboat in #2078
- feat(proxy): expose retry delay configuration by @Bortlesboat in #2077
- fix(install): add orjson to [proxy] extra for LiteLLM provider backends by @syf2211 in #2074
- fix(mcp/codex): don't clobber an unparseable/non-table config.toml by @abhay-codes07 in #2062
- fix(proxy/cost): price cache savings by most-used model, not first-seen by @abhay-codes07 in #2023
- fix(version): mark source-checkout builds as -dev by @chopratejas in #2072
- fix(tokenizers): recurse into list-content tool_result blocks by @abhay-codes07 in #2081
- fix(cache/ccr): don't evict a live entry on a duplicate store at capacity by @abhay-codes07 in #2082
- fix(proxy/gemini): preserve non-text content across the compression round-trip by @abhay-codes07 in #2079
- fix(memory/sqlite): don't emit OFFSET without LIMIT in query by @abhay-codes07 in #2063
- fix(proxy/memory): capture user text blocks for the retrieval query by @abhay-codes07 in #2064
- fix(memory): honor explicit store=false on Responses requests by @rodboev in #2017
- fix(proxy/savings): don't bill fallback rate for free (0-priced) models by @abhay-codes07 in #2024
- fix(wrap/opencode): unwrap removes the rtk block from AGENTS.md by @abhay-codes07 in #2025
- fix(codex): skip sockets in session home overlay by @rudironsoni in #2104
- docs(proxy): document --protect-tool-results side effect on protect_recent_reads_fraction by @lennney in #2054
- fix(proxy): keep Kompress warmup off the startup path by @rodboev in #2001
- fix(proxy): keep recent stats request rows by @aivinay in #1922
- chore: union-merge CHANGELOG.md to stop cross-PR merge conflicts by @chopratejas in #2118
- fix(install): don't let host env override the manifest in persistent-docker by @abhay-codes07 in #2090
- fix(tokenizers): don't tokenize image blocks as text in TiktokenCounter by @abhay-codes07 in #2093
- fix(cache/semantic): don't evict an unrelated entry on an update at capacity by @abhay-codes07 in #2094
- fix(pricing): alias retired claude-3-sonnet to Sonnet-tier price, not Haiku by @abhay-codes07 in #2095
- fix(tokenizers): resolve HF tokenizer names by most-specific prefix by @abhay-codes07 in #2096
- fix(learn): don't shadow TIMEOUT/CONNECTION with the generic RUNTIME_ERROR by @abhay-codes07 in #2099
- fix(proxy/anthropic): preserve non-2xx upstream status through security scan by @abhay-codes07 in #2100
- fix(cache/ccr): don't count a successful eviction as a retrieval by @abhay-codes07 in #2106
- fix(tokenizers): use o200k_base for gpt-4.1/gpt-4.5/o4 families by @abhay-codes07 in #2108
- fix(memory): key the embedder cache on ollama_base_url by @abhay-codes07 in #2109
- ci: concurrency-cancel Docker + Merge Conflicts to stop merge-spree pileups by @chopratejas in #2138
- fix(content-router): protect_tool_results must not be weakened by profile-derived read_protection_window by @ingmarkruschHF in #2105
- fix(install): default docker image to headroomlabs-ai GHCR registry (#1867) by @dex0shubham in #2039
- fix(wrap): surface Claude Remote Control base-URL gate accurately (#1… by @Ayushraj06-bit in #1883
- fix: strip output-only fallback blocks from request messages by @GaryOcean428 in #1870
- fix(codex): rerun memory lookup on every response.create WS frame by @rodboev in #2113
- fix(proxy): aggregate tool-output size floor so Codex sessions compress (#2050) by @chopratejas in #2116
- fix(wrap): use canonical headroom-openclaw npm package for wrap openclaw (#1969) by @chopratejas in #2120
- fix(cache): stop DynamicContentDetector false positives corrupting cached prompts (#2110) by @chopratejas in #2119
- fix(memory): annotate _EMBEDDER_CACHE key as 3-tuple (unbreak main lint) by @chopratejas in #2153
- fix(deps): bump pillow to 12.3.0 and click to 8.4.2 by @lennney in #2097
- fix(proxy): compress Hermes scoped coding-agent passthrough by @x1051445024 in #1815
- fix(proxy): preserve sub-path in X-Headroom-Base-Url custom upstream (#2037) by @chopratejas in #2127
- fix(backends/litellm): drop oversized tool names before Bedrock Converse by @ingmarkruschHF in #2129
- fix(paths): reject '.', '..', and NUL as plugin names by @thejesh23 in #2132
- fix(compress): don't mutate the caller's CompressConfig via kwargs by @thejesh23 in #2134
- fix(shared_context): don't evict an unrelated entry on an update at capacity by @thejesh23 in #2136
- fix(proxy): strip [1m] model suffix before upstream forwarding by @abhishek-mittal in #2027
- fix(deps): raise transformers security floor by @JerrettDavis in #2157
- fix(proxy/anthropic): cache response under the looked-up messages (#327) by @abhay-codes07 in #2124
- fix(transforms): guard the lossless diff fold to diff-shaped content only by @abhay-codes07 in #2140
- fix(memory): apply turn_id scope filter even without agent_id by @abhay-codes07 in #2130
- fix(ccr): detect read_lifecycle stale/superseded markers in the injector by @abhay-codes07 in #2148
- fix(proxy): Strip Codex responses-lite marker from response.create frame body by @iotron in #1820
- fix(memory): size HNSW index_batch resize off the id high-water mark by @abhay-codes07 in #2139
- ci: scope native/wheel/dashboard jobs to relevant paths (unstarve the queue) by @chopratejas in #2155
- fix(backends/litellm): preserve tool_result cache_control, complete streaming cache stats by @ingmarkruschHF in #2144
- fix(kompress): fail-open wall-clock guard on single-cache-miss compression by @rodboev in #2114
- fix(cache): extract tool_result content from list-of-blocks format by @lennney in #2092
- chore(deps): bump agno from 2.4.5 to 2.6.6 in the uv group across 1 directory by @dependabot[bot] in #2166
- feat(kompress): remote compression endpoint + torch-free [sandbox] extra by @chopratejas in #2171
- fix(proxy): fail soft on a bad HEADROOM_QDRANT_PORT during config construction by @abhay-codes07 in #2141
- fix(proxy): support Windows selector loop on uvicorn < 0.36 by @syf2211 in #1655
- fix(proxy): don't 502 Anthropic streaming on a legal mixed CCR + client-tool turn (#2089) by @chopratejas in #2117
- fix(savings): coding profile compresses the recent delta (protect_recent 2->0, min_tokens 25->10) by @chopratejas in #2145
- fix(memory): remove a superseded memory from the search indexes by @abhay-codes07 in #2143
- fix(proxy): cold-start fast pass — defer only Kompress, not the whole pipeline by @gglucass in #2073
- fix(router): compact JSON evades compression via whitespace token counting by @dspv in #1857
- fix(ci/deps): clear audit and release smoke failures by @JerrettDavis in #2190
- fix(proxy): isolate image compression in a subprocess so a native SIGSEGV can't take down the proxy (#2107) by @rodboev in #2162
- fix(proxy): protect WebSearch/WebFetch tool results from lossy compression by @rodboev in #2115
- fix(copilot): refresh wrapped subscription tokens (#2156) by @rodboev in #2182
- fix(update): let Windows self-update replace headroom.exe by @rodboev in #2016
- install: couple Codex routing to persistent runtime readiness by @rodboev in #2043
- fix(learn): ingest OpenAI Responses HTTP traffic by @superdiaodiao in #2167
- docs(proxy): document savings profiles section by @lennney in #2091
- docs: document Claude VSCode deferred-tool rendering caveat by @rodboev in #2045
- fix(proxy): satisfy rustfmt import ordering by @JerrettDavis in #2158
- fix(mcp/claude): don't clobber an unparseable Claude config on register by @abhay-codes07 in #1660
- fix(subscription): keep efficiency_pct from exceeding 100% by @abhay-codes07 in #2121
- fix(codex): rewrite config.toml properly so Codex will route through … by @nangsontay in #2102
- docs: qualify CCR auto-resolution support for Gemini by @rodboev in #2044
- fix(cache-aligner): hash the frozen conversation prefix so Claude Code cache invalidation is detected (#2085) by @rodboev in #2161
- fix(litellm): forward chat_template_kwargs and other vendor top-level fields to OpenAI-compatible backends via extra_body (#2128) by @rodboev in #2163
- fix(cache): normalize embeddings before the semantic similarity check by @abhay-codes07 in #2122
- fix(wrap/codex): export the detected custom upstream base URL by @abhay-codes07 in #2125
- fix(wrap/claude): bind _wrap_settings_path before the try by @abhay-codes07 in #2126
- fix(learn): don't desync verbosity pairing on empty assistant turns by @abhay-codes07 in #2123
- fix(proxy): reject rate_limit_requests_per_minute=0 when limiting is enabled by @abhay-codes07 in #2142
- fix(init/codex): don't delete per-profile provider settings by @abhay-codes07 in #2146
- fix(init/codex): merge into hooks.json instead of overwriting it by @abhay-codes07 in #2173
- fix(proxy/savings): append history point on cache-only savings too by @ingmarkruschHF in #2194
- fix(savings): don't bill free models at the $3/M fallback in the ledger by @abhay-codes07 in #2147
- fix(telemetry): only advance usage-report baseline after a 200 by @abhay-codes07 in #2149
- fix(install): guard non-dict health config in 'install status' by @abhay-codes07 in #2150
- fix(proxy/gemini): forward a non-JSON upstream body with its real status by @abhay-codes07 in #2174
- fix(savings): record pre-compression original as ledger before, not forwarded count by @abhay-codes07 in #2176
- fix(proxy/batch): preserve sibling tool configs on Google batch requests by @abhay-codes07 in #2177
- test(codex-ws): de-flake semaphore-tail test (widen noise floor 25ms->75ms) by @chopratejas in #1736
- feat(evals): register multilingual multi-wiki-qa (zh/ja/ko) dataset by @lifeodyssey in #1530
- docs: add Claude Code status-line indicator to Community by @Ship-Wright in #1790
- fix: add Vercel deploy config and workflow for docs site by @MeGaurav4 in #1739
- feat(proxy): apply output shaper to OpenAI-compatible endpoints by @dylanrussellmd in #1725
- feat(metrics): export compression-failed and kompress size-gate counters by @rocker-zhang in #1569
- feat(mcp): publish canonical server.json by @rodboev in #1510
- feat(cli): add
wrap openclaudefor OpenClaude CLI by @ousamabenyounes in #1416 - fix(build): support Intel macOS (x86_64-apple-darwin) via ort-load-dynamic (fixes #941) by @warnes in #1797
- fix(core): load ONNX Runtime dynamically so headroom._core imports on non-AVX2 x86-64 by @Parideboy in #1715
- feat(mcp): add streamable HTTP MCP transport by @rodboev in #1773
- fix(router): stop protecting passing build/test output as error traces by @ashishpatel26 in #1740
- docs(proxy): document HEADROOM_SAVINGS_PROFILE and correct --mode default (#2031) by @dex0shubham in #2040
- fix: check feature configuration before reusing persistent deployments by @carlosduplar in #1330
- fix(wrap): drop -p short flag from wrap claude so claude's own -p/--print passes through by @Eyalm321 in #2048
- feat(install): add apply flag parity, --env passthrough, and EIO retry by @ingmarkruschHF in #2152
- fix(content_router): pin FREEZE_BLOCK_DECISION verdict to stop cache-write churn by @rocker-zhang in #1620
- fix(ccr): store pre-protection original, not tag placeholder, in CCR by @yulin0629 in #1208
- fix(auth): support GitHub Enterprise Copilot OAuth domain by @prokod in #2192
- feat(compress): expose frozen_message_count in library-mode compress() by @Connor-Campbell-Code in #2178
- docs(metrics): ship an importable Grafana dashboard by @MattJackson in #2168
- fix(search_compressor): don't let a date in a path hijack the line-number parse by @dosthcpp in #2084
- chore(release): harden local artifact smokes by @ninosat00 in #1824
- feat(wrap): add ZCode desktop app support by @Epicism in #1845
- fix(code): quarantine Perl parser from code-aware compression by @rodboev in #2204
- fix(code-compressor): recover valid Python rewrites after local syntax rejection by @rodboev in #2202
- fix(deps): clear Dependabot lockfile alerts by @JerrettDavis in #2175
- fix(mcp): regenerate stale server.json (0.27.0 -> 0.32.0) by @chopratejas in #2218
- fix(proxy): one bad extension no longer aborts proxy startup by @chopratejas in #2215
- fix(windows): unwedge compression on degraded ONNX runtimes (every request timing out at 30s, 0% savings) by @chopratejas in #822
- fix: add DeepSeek V4/V3.2/R1 tokenizer mappings and context limits by @huiihao in #912
- fix(mcp): mcp status checks ~/.claude.json, not only ~/.claude/mcp.json by @Eyalm321 in #990
- fix(wrap): read/write instruction files as UTF-8 on Windows by @jichaowang02-lang in #1245
- fix(deps): enforce transformers security floor by @JerrettDavis in #2201
- fix(claude): treat non-zero claude --version exit as version-unknown … by @Ayushraj06-bit in #2233
- fix(cli/init): fail clearly on a target settings file with invalid JSON by @abhay-codes07 in #2227
- docs(ccr): correct stale 5-minute TTL hints to 30 minutes by @lifeodyssey in #2224
- fix(diff-compressor): CJK-aware relevance scoring for hunk selection by @lifeodyssey in #2220
- feat(memory): add explicit supersession repair by @superdiaodiao in #2217
- fix(stats): tag streamed output token source by @superdiaodiao in #2214
- fix(memory): audit passive context injection by @superdiaodiao in #2212
- fix(proxy): accept Codex websocket before upstream retries by @rodboev in #2203
- feat(dashboard): persist lifetime proxy metrics by @jerviscui in #2198
- fix(proxy/bedrock): wire PrefixCacheTracker updates into Bedrock backend paths by @ingmarkruschHF in #2196
- fix(proxy): dedupe Codex WS request logging for accurate mixed-provider dashboards by @nangsontay in #2189
- fix(memory): require explicit updates for supersession by @superdiaodiao in #2188
- feat(core): gate ONNX transforms behind a default-on
mlfeature (static/lexical builds) by @MattJackson in #2165 - feat(dashboard): add settings dashboard for proxy configuration by @nangsontay in #2101
- refactor(proxy): extract tool definition serialization by @JerrettDavis in #1998
- feat(deploy): Add turnkey deploy command by @JerrettDavis in #1404
- fix(cache): stable session identity and per-conversation prefix trackers under agentic clients by @abcgco in #2193
- feat(wrap): add first-class Grok CLI support by @roman-t3a in #1823
- fix(mcp): reap orphaned mcp serve on client death by @MadPigeon in #2226
- feat(proxy): show real upstream provider on dashboard for OpenAI-compatible endpoints by @tenderdeve in #1594
- feat(wrap): add omp target (Oh My Pi) with models.yml override and unwrap by @LunarECL in #1811
- fix(ccr): skip compact summaries for proactive expansion by @aivinay in #2242
- fix(proxy): batch small Codex Responses tool outputs by @jerviscui in #2239
- docs(troubleshooting): document Windows Defender ast-grep-cli false positive + workarounds (#2200) by @dex0shubham in #2237
- fix(ccr): lowercase a retrieved hash so an uppercase echo still hits the store by @abhay-codes07 in #2236
- fix(backend/bedrock): preserve system-prompt cache_control breakpoint (list form) by @ingmarkruschHF in #2225
- fix(wrap): self-heal a stale ANTHROPIC_BASE_URL left by a dead proxy by @lifeodyssey in #2223
- fix(memory): filter inactive graph-expanded results by @superdiaodiao in #2210
- feat(proxy): add opt-in cost-aware model router (#1706) by @Krishnachaitanyakc in #2205
- fix(codex): preserve wrapped sessions and recover state by @rudironsoni in #2160
- feat(stats): per-bucket output-shaping savings in /stats-history by @gglucass in #1819
- feat(config): fold TOML array-of-tables to csv-schema via SmartCrusher by @agaonker in #1799
- feat(transforms): language-aware stack-trace collapse for Go/Rust/.NET/Java/Node by @agaonker in #1791
- feat(proxy): opt-in compression for catch-all passthrough routes by @tenderdeve in #1699
- feat(cli): add
headroom inspectto view original vs compressed content by @tenderdeve in #1595 - fix(proxy): compress OpenCode tool schemas and embedded JSON by @vscunha in #1535
- fix(core): avoid unidiff panic on bash xtrace by @mstattma in #1506
- feat(text-crusher): CJK-aware segmentation + relevance via ICU by @lifeodyssey in #1504
- feat: 3-layer context compression pipeline (L1+L2+L3) by @lg320531124 in #1405
- feat: add CrewAI and AutoGen tool compression integrations by @Sneha27feb in #1384
- fix(opencode): use type=local + environment field for MCP config (#1380) by @peterlodri-sec in #1388
- fix(transforms): guard Log fallback against invalid JSON + fix MIXED false-positive on source code by @monkeygold in #1347
- fix(proxy): support Codex WS compatible gateways by @gamesoft in #1281
- [codex] Simulate Codex read maturation risk by @panamarob30-jpg in #1395
- docs(compose): document the memory-stack docker-compose services by @ai-Ev1lC0rP in #1242
- feat(grok-build): add Grok Build wrap command and MCP integration by @aashishtamsya in #1629
- fix(proxy): skip Responses memory tools for ChatGPT auth by @dyxushuai in #1579
- fix(code): pin tree-sitter-language-pack <1.0.0 in [code] extra by @TUTU244 in #1219
- perf: surface optimization overhead diagnostics by @akothari-godaddy in #1212
- Clarify uv tool install path on macOS by @balcsida in #1196
- fix(proxy): record Prometheus metrics for POST /v1/compress by @axelray-dev in #2247
- fix: replace computer_call_output with apply_patch_call_output in output_shaper by @fix2015 in #2250
- feat(evals): weekly HotpotQA answer-recall report on the prose path by @agaonker in #1188
- feat(wrap): add
headroom wrap kimifor Kimi CLI by @0xkaz in #1426 - fix(proxy): repair main lint (ruff-format drift + mypy host_header) by @chopratejas in #2268
- fix(tests): repair three main-branch test failures by @chopratejas in #2306
- fix(proxy): keep anthropic ccr compression active across deferred injection (#2291) by @rodboev in #2297
- fix(memory): preserve semantically similar memories by @GautamSharma99 in #2303
- fix: harden fd lifecycle and SystemError handling in runtime and proxy kill by @guyoron1 in #1556
- fix(opencode): Use opencode.jsonc when present by @Tanmay9223 in #1590
- fix(proxy): preserve content-part array structure in excluded-tool lossless fold write-back by @lennney in #2261
- feat(text-crusher): fold full-width ASCII to half-width in CJK token keys by @lifeodyssey in #2259
- ci(changelog): stop the CHANGELOG cascade — release-please owns it by @chopratejas in #2329
- fix(proxy): quarantine compression while timed-out workers run by @rschumann in #2292
- fix(proxy): key drift detector on conversations, not credentials; canonicalize drift hashes by @abcgco in #2301
- fix(savings): don't fabricate output savings for a free (zero-priced) model by @abhay-codes07 in #2298
- fix(learn/claude): don't abort the whole scan on a null message line by @abhay-codes07 in #2299
- fix(proxy/memory): don't crash the memory tool adapter on a null function/arguments by @abhay-codes07 in #2270
- fix(proxy/memory): don't crash memory tool-call detection on a null function by @abhay-codes07 in #2272
- fix(ccr): don't crash tool-call detection on a null function/functionCall by @abhay-codes07 in #2269
- fix(proxy/streaming): preserve non-standard content-block fields on SSE reconstruction by @abhay-codes07 in #2271
- fix(memory): serialize MCP backend initialization by @GautamSharma99 in #2309
- fix(subscription): read newest transcript tail by @GautamSharma99 in #2310
- ci: repair mypy no-any-return in _win32_pid_alive (#1556 follow-up) by @chopratejas in #2336
- chore: sync version state to released 0.31.0 to unblock release-please (v0.32.0) by @chopratejas in #2338
- chore: release main by @chopratejas in #1923
New Contributors
- @dspv made their first contribution in #1848
- @sogko made their first contribution in #1906
- @Sujit-1509 made their first contribution in #1271
- @MdHussain121 made their first contribution in #1882
- @exKAZUu made their first contribution in #1859
- @SEPURI-SAI-KRISHNA made their first contribution in #1246
- @ahhdammm made their first contribution in #1096
- @panamarob30-jpg made their first contribution in #1396
- @orbisai0security made their first contribution in #1929
- @fculpo made their first contribution in #1988
- @sgfdhgfnjgmhgmnfd657-sys made their first contribution in #1086
- @JoaoMarcos44 made their first contribution in #1581
- @jecacs made their first contribution in #1926
- @superdiaodiao made their first contribution in #2065
- @alex33d made their first contribution in #1943
- @wzy-del made their first contribution in #1951
- @syf2211 made their first contribution in #2074
- @ingmarkruschHF made their first contribution in #2105
- @dex0shubham made their first contribution in #2039
- @Ayushraj06-bit made their first contribution in #1883
- @GaryOcean428 made their first contribution in #1870
- @x1051445024 made their first contribution in #1815
- @thejesh23 made their first contribution in #2132
- @abhishek-mittal made their first contribution in #2027
- @iotron made their first contribution in #1820
- @nangsontay made their first contribution in #2102
- @Ship-Wright made their first contribution in #1790
- @MeGaurav4 made their first contribution in #1739
- @dylanrussellmd made their first contribution in #1725
- @warnes made their first contribution in #1797
- @carlosduplar made their first contribution in #1330
- @yulin0629 made their first contribution in #1208
- @prokod made their first contribution in #2192
- @Connor-Campbell-Code made their first contribution in #2178
- @MattJackson made their first contribution in #2168
- @dosthcpp made their first contribution in #2084
- @ninosat00 made their first contribution in #1824
- @Epicism made their first contribution in #1845
- @huiihao made their first contribution in #912
- @jerviscui made their first contribution in #2198
- @abcgco made their first contribution in #2193
- @roman-t3a made their first contribution in #1823
- @MadPigeon made their first contribution in #2226
- @LunarECL made their first contribution in #1811
- @vscunha made their first contribution in #1535
- @mstattma made their first contribution in #1506
- @lg320531124 made their first contribution in #1405
- @Sneha27feb made their first contribution in #1384
- @monkeygold made their first contribution in #1347
- @gamesoft made their first contribution in #1281
- @ai-Ev1lC0rP made their first contribution in #1242
- @aashishtamsya made their first contribution in #1629
- @dyxushuai made their first contribution in #1579
- @TUTU244 made their first contribution in #1219
- @akothari-godaddy made their first contribution in #1212
- @balcsida made their first contribution in #1196
- @axelray-dev made their first contribution in #2247
- @fix2015 made their first contribution in #2250
- @0xkaz made their first contribution in #1426
- @GautamSharma99 made their first contribution in #2303
- @guyoron1 made their first contribution in #1556
- @Tanmay9223 made their first contribution in #1590
- @rschumann made their first contribution in #2292
Full Changelog: v0.31.0...v0.32.0