Skip to content

v0.32.0

Latest

Choose a tag to compare

@chopratejas chopratejas released this 17 Jul 04:38
4381388

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 openclaude for 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 ml feature (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 inspect to 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 kimi for 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

Full Changelog: v0.31.0...v0.32.0