What's Changed
- fix(opencode): route native providers + load transport plugin, fix Serena context by @chopratejas in #1573
- fix(pricing): resolve MiniMax-M3 (provider prefix + pre-registration) by @shreyassks in #1186
- fix(learn): aggregate verbosity baselines across projects instead of overwriting by @gglucass in #1288
- fix: preserve anthropic passthrough tool order by @aivinay in #1427
- fix(mcp): show lifetime totals and label rolling session scope in headroom_stats by @rodboev in #1428
- fix(opencode): preserve custom OpenAI gateway paths by @rodboev in #1596
- docs: clarify the headroom CLI is pip-only; npm headroom-ai is the TS SDK by @tenderdeve in #1585
- fix: skip Magika backend on x86 CPUs without AVX2 by @dwizzle204 in #1162
- fix(savings): count cache-read tokens in input cost estimate by @gglucass in #1429
- fix(proxy): fail open when kompress saturation would exhaust pre-upstream budget by @rodboev in #1430
- fix(codex): avoid duplicate headroom provider config by @rudironsoni in #1431
- fix(proxy): handle streaming CCR retrieval by @aivinay in #1451
- fix(wrap): detach the shared proxy on Windows so it survives an ungraceful agent close by @quentinmaisonneuve in #1464
- fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks by @sfc-gh-nashukla in #1474
- fix(wrap): preserve custom Vertex base URL by @aivinay in #1477
- fix(openclaw): detect uv-installed headroom binary in ~/.local/bin by @Ru0k3 in #1459
- ci: guard against committed merge-conflict markers by @wolph in #1505
- fix(dashboard): derive per-project setup URL from live origin by @rodboev in #1511
- fix(evals): CJK-aware F1 tokenization + token estimation by @lifeodyssey in #1527
- fix(proxy): preserve Responses passthrough bytes by @aivinay in #1598
- fix(proxy): include system/tools/sampling in cache key by @inix-x in #1473
- fix(compression): reject lossy unmarked tool output in unit router path by @rodboev in #1479
- feat(proxy): add --force-kompress-all to route all content through kompress-v2-base by @chopratejas in #1613
- chore: add CODEOWNERS with maintainer catch-all by @chopratejas in #1622
- fix(detection): contain unidiff panic on orphaned +++ target line by @tenderdeve in #1548
- fix(memory): cap local embedder CPU thread oversubscription (#198) by @Krishnachaitanyakc in #1559
- fix(install): use Windows-safe PID liveness probe in runtime_status (#1544) by @Parideboy in #1560
- chore(deps): bump transformers from 5.0.0 to 5.3.0 in the uv group across 1 directory by @dependabot[bot] in #1662
- fix(ccr): honor workspace dir for sqlite store by @rodboev in #1564
- fix(transforms): bound native content detection with a Windows watchdog (#575) by @Parideboy in #1563
- fix(bedrock): fail fast when session-token auth lacks botocore by @tenderdeve in #1553
- fix: Vertex AI support for Claude Code with ANTHROPIC_VERTEX_BASE_URL by @vladgrish in #1393
- fix(proxy): honor x-headroom-base-url in dedicated OpenAI handlers by @ShutovKS in #1502
- fix(install): close parent log fd in start_detached_agent by @abhay-codes07 in #1576
- fix(claude): surface Remote Control proxy incompatibility by @rodboev in #1610
- fix(proxy): wire --compression-max-workers / HEADROOM_COMPRESSION_MAX_WORKERS by @gglucass in #1632
- fix(cli): stop advertising unwired compression tuning env vars in banner by @gglucass in #1634
- fix(learn): honor CLAUDE_CONFIG_DIR when locating Claude logs and memory by @tenderdeve in #1642
- fix(proxy): expose persistent savings metrics by @aivinay in #1647
- fix(dashboard): align token savings headline denominator by @chris-yyau in #1653
- fix(proxy): strip Codex lite header on the HTTP /responses path by @gglucass in #1663
- docs(proxy): correct --code-aware default to disabled by @Parideboy in #1710
- feat(stats): surface Codex WS compression counters in /stats summary by @gglucass in #1680
- fix(proxy/auth): match real Anthropic OAuth token prefix (sk-ant-oat) by @abhay-codes07 in #1672
- fix(transforms/content-router): detect on inner tool-output payload by @chopratejas in #1717
- fix(memory): singleflight LocalBackend init to stop cold-start races by @tenderdeve in #1691
- fix(transforms/content-router): route grep/log output away from HTML extractor by @chopratejas in #1719
- feat(proxy): add --lossless no-CCR mode with format-native compaction by @chopratejas in #1721
- fix(bedrock): route ARNs via converse, named AWS profiles, and au. re… by @mhaitana in #1456
- perf(proxy): offload image compression off event loop by @inix-x in #1612
- fix(wrap): remove rtk instructions from Codex AGENTS.md on unwrap by @abhay-codes07 in #1604
- feat(transforms): adaptive Otsu KEEP/DROP threshold (+ land relevance split on main) by @chopratejas in #1726
- chore: release main by @github-actions[bot] in #1574
New Contributors
- @shreyassks made their first contribution in #1186
- @tenderdeve made their first contribution in #1585
- @dwizzle204 made their first contribution in #1162
- @Ru0k3 made their first contribution in #1459
- @Krishnachaitanyakc made their first contribution in #1559
- @vladgrish made their first contribution in #1393
- @ShutovKS made their first contribution in #1502
- @abhay-codes07 made their first contribution in #1576
- @mhaitana made their first contribution in #1456
Full Changelog: v0.28.0...v0.29.0