github-actions[bot]
660fa8cfb6
chore: release main ( #1574 )
...
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Blocked by required conditions
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Blocked by required conditions
Docker / promote-latest (push) Blocked by required conditions
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 7s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 6s
Init E2E / docker-init-e2e (push) Failing after 9s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 6s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 6s
Merge Conflicts / merge-conflicts (push) Failing after 5s
Release Please / release-please (push) Failing after 4s
Security / CodeQL (javascript-typescript) (push) Failing after 30s
Security / CodeQL (python) (push) Failing after 18s
Wrap E2E / docker-wrap-e2e (push) Failing after 11s
Security / Dependency audit (pip-audit) (push) Failing after 54s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 5s
Security / Secret scan (gitleaks) (push) Failing after 27s
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 14m26s
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
🤖 I have created a release *beep* *boop*
---
<details><summary>0.29.0</summary>
##
[0.29.0](https://github.com/headroomlabs-ai/headroom/compare/v0.28.0...v0.29.0 )
(2026-07-03)
### Features
* **proxy:** add --lossless no-CCR mode with format-native compaction
([#1721 ](https://github.com/headroomlabs-ai/headroom/issues/1721 ))
([c75ebde ](c75ebdee6d ))
* **stats:** surface Codex WS compression counters in /stats summary
([#1680 ](https://github.com/headroomlabs-ai/headroom/issues/1680 ))
([2fe19c3 ](2fe19c39e4 ))
* **transforms:** adaptive Otsu KEEP/DROP threshold (+ land relevance
split on main)
([#1726 ](https://github.com/headroomlabs-ai/headroom/issues/1726 ))
([eea667a ](eea667a720 ))
### Bug Fixes
* **bedrock:** fail fast when session-token auth lacks botocore
([#1553 ](https://github.com/headroomlabs-ai/headroom/issues/1553 ))
([54cfa36 ](54cfa361d3 ))
* **bedrock:** route ARNs via converse, named AWS profiles, and au. re…
([#1456 ](https://github.com/headroomlabs-ai/headroom/issues/1456 ))
([7d87aa2 ](7d87aa2f1c ))
* **ccr:** honor workspace dir for sqlite store
([#1564 ](https://github.com/headroomlabs-ai/headroom/issues/1564 ))
([96e1dfe ](96e1dfe395 ))
* **claude:** surface Remote Control proxy incompatibility
([#1610 ](https://github.com/headroomlabs-ai/headroom/issues/1610 ))
([4bf7f92 ](4bf7f92417 ))
* **cli:** stop advertising unwired compression tuning env vars in
banner
([#1634 ](https://github.com/headroomlabs-ai/headroom/issues/1634 ))
([d5bf98d ](d5bf98df31 ))
* **codex:** avoid duplicate headroom provider config
([#1431 ](https://github.com/headroomlabs-ai/headroom/issues/1431 ))
([ddd4adf ](ddd4adf911 ))
* **compression:** reject lossy unmarked tool output in unit router path
([#1479 ](https://github.com/headroomlabs-ai/headroom/issues/1479 ))
([de24cd5 ](de24cd5fc0 ))
* **cortex-code:** migrate to current Cortex REST API endpoints + add
e2e benchmarks
([#1474 ](https://github.com/headroomlabs-ai/headroom/issues/1474 ))
([f00ace6 ](f00ace6da5 ))
* **dashboard:** align token savings headline denominator
([#1653 ](https://github.com/headroomlabs-ai/headroom/issues/1653 ))
([646e705 ](646e705514 ))
* **dashboard:** derive per-project setup URL from live origin
([#1511 ](https://github.com/headroomlabs-ai/headroom/issues/1511 ))
([e035aef ](e035aefce2 ))
* **detection:** contain unidiff panic on orphaned +++ target line
([#1548 ](https://github.com/headroomlabs-ai/headroom/issues/1548 ))
([e386c09 ](e386c097d6 ))
* **evals:** CJK-aware F1 tokenization + token estimation
([#1527 ](https://github.com/headroomlabs-ai/headroom/issues/1527 ))
([99a8540 ](99a8540e65 ))
* **install:** close parent log fd in start_detached_agent
([#1576 ](https://github.com/headroomlabs-ai/headroom/issues/1576 ))
([816cb85 ](816cb85fa8 ))
* **install:** use Windows-safe PID liveness probe in runtime_status
([#1544 ](https://github.com/headroomlabs-ai/headroom/issues/1544 ))
([#1560 ](https://github.com/headroomlabs-ai/headroom/issues/1560 ))
([6b227b9 ](6b227b9c90 ))
* **learn:** aggregate verbosity baselines across projects instead of
overwriting
([#1288 ](https://github.com/headroomlabs-ai/headroom/issues/1288 ))
([27a5468 ](27a5468349 ))
* **mcp:** show lifetime totals and label rolling session scope in
headroom_stats
([#1428 ](https://github.com/headroomlabs-ai/headroom/issues/1428 ))
([1c0e152 ](1c0e15243e ))
* **memory:** cap local embedder CPU thread oversubscription
([#198 ](https://github.com/headroomlabs-ai/headroom/issues/198 ))
([#1559 ](https://github.com/headroomlabs-ai/headroom/issues/1559 ))
([b84afbf ](b84afbfb83 ))
* **memory:** singleflight LocalBackend init to stop cold-start races
([#1691 ](https://github.com/headroomlabs-ai/headroom/issues/1691 ))
([bec47a1 ](bec47a1898 ))
* **openclaw:** detect uv-installed headroom binary in ~/.local/bin
([#1459 ](https://github.com/headroomlabs-ai/headroom/issues/1459 ))
([adaeb88 ](adaeb88a4d ))
* **opencode:** preserve custom OpenAI gateway paths
([#1596 ](https://github.com/headroomlabs-ai/headroom/issues/1596 ))
([c19347c ](c19347c310 ))
* **opencode:** route native providers + load transport plugin, fix
Serena context
([#1573 ](https://github.com/headroomlabs-ai/headroom/issues/1573 ))
([ad0034f ](ad0034f981 ))
* preserve anthropic passthrough tool order
([#1427 ](https://github.com/headroomlabs-ai/headroom/issues/1427 ))
([a932247 ](a9322477e3 ))
* **proxy/auth:** match real Anthropic OAuth token prefix (sk-ant-oat)
([#1672 ](https://github.com/headroomlabs-ai/headroom/issues/1672 ))
([8cddf9b ](8cddf9b58e ))
* **proxy:** expose persistent savings metrics
([#1647 ](https://github.com/headroomlabs-ai/headroom/issues/1647 ))
([5fe4e7b ](5fe4e7b195 ))
* **proxy:** fail open when kompress saturation would exhaust
pre-upstream budget
([#1430 ](https://github.com/headroomlabs-ai/headroom/issues/1430 ))
([15ac650 ](15ac650d40 ))
* **proxy:** handle streaming CCR retrieval
([#1451 ](https://github.com/headroomlabs-ai/headroom/issues/1451 ))
([d337e3b ](d337e3b828 ))
* **proxy:** include system/tools/sampling in cache key
([#1473 ](https://github.com/headroomlabs-ai/headroom/issues/1473 ))
([312129a ](312129a8e7 ))
* **proxy:** preserve Responses passthrough bytes
([#1598 ](https://github.com/headroomlabs-ai/headroom/issues/1598 ))
([2a34a82 ](2a34a822f2 ))
* **proxy:** strip Codex lite header on the HTTP /responses path
([#1663 ](https://github.com/headroomlabs-ai/headroom/issues/1663 ))
([9fbd47b ](9fbd47ba6b ))
* **proxy:** wire --compression-max-workers /
HEADROOM_COMPRESSION_MAX_WORKERS
([#1632 ](https://github.com/headroomlabs-ai/headroom/issues/1632 ))
([814ffa3 ](814ffa36a4 ))
* **savings:** count cache-read tokens in input cost estimate
([#1429 ](https://github.com/headroomlabs-ai/headroom/issues/1429 ))
([72ade37 ](72ade37112 ))
* skip Magika backend on x86 CPUs without AVX2
([#1162 ](https://github.com/headroomlabs-ai/headroom/issues/1162 ))
([64783d8 ](64783d8824 ))
* **transforms/content-router:** route grep/log output away from HTML
extractor
([#1719 ](https://github.com/headroomlabs-ai/headroom/issues/1719 ))
([0d18ef2 ](0d18ef26f4 ))
* **transforms:** bound native content detection with a Windows watchdog
([#575 ](https://github.com/headroomlabs-ai/headroom/issues/575 ))
([#1563 ](https://github.com/headroomlabs-ai/headroom/issues/1563 ))
([95abca3 ](95abca3abd ))
* Vertex AI support for Claude Code with ANTHROPIC_VERTEX_BASE_URL
([#1393 ](https://github.com/headroomlabs-ai/headroom/issues/1393 ))
([cff7247 ](cff7247efd ))
* **wrap:** detach the shared proxy on Windows so it survives an
ungraceful agent close
([#1464 ](https://github.com/headroomlabs-ai/headroom/issues/1464 ))
([6cba441 ](6cba4419d0 ))
* **wrap:** preserve custom Vertex base URL
([#1477 ](https://github.com/headroomlabs-ai/headroom/issues/1477 ))
([75427bb ](75427bbd4a ))
* **wrap:** remove rtk instructions from Codex AGENTS.md on unwrap
([#1604 ](https://github.com/headroomlabs-ai/headroom/issues/1604 ))
([c9d717c ](c9d717c13c ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-02 22:54:04 -07:00
github-actions[bot]
aea3c35177
chore: release main ( #1441 )
...
🤖 I have created a release *beep* *boop*
---
<details><summary>0.28.0</summary>
##
[0.28.0](https://github.com/headroomlabs-ai/headroom/compare/v0.27.0...v0.28.0 )
(2026-06-29)
### Features
* add --disable-kompress-fallback to restore legacy PASSTHROUGH fallback
([#1185 ](https://github.com/headroomlabs-ai/headroom/issues/1185 ))
([f309244 ](f309244a77 ))
* add first-class OpenCode support (wrap, learn, mcp install)
([#559 ](https://github.com/headroomlabs-ai/headroom/issues/559 ))
([91cd210 ](91cd2102d7 ))
* add HEADROOM_KEEPALIVE_EXPIRY to keep upstream connections warm
([#1124 ](https://github.com/headroomlabs-ai/headroom/issues/1124 ))
([85786b3 ](85786b33a3 ))
* **azure-foundry:** derive upstream URL from ANTHROPIC_FOUNDRY_RESOURCE
([#1138 ](https://github.com/headroomlabs-ai/headroom/issues/1138 ))
([e5031b0 ](e5031b0121 ))
* **cache:** attribute prompt-cache misses to TTL lapse vs prefix change
([#1313 ](https://github.com/headroomlabs-ai/headroom/issues/1313 ))
([#1343 ](https://github.com/headroomlabs-ai/headroom/issues/1343 ))
([4658721 ](4658721ea0 ))
* **code:** add Perl support to code-aware compressor
([#1125 ](https://github.com/headroomlabs-ai/headroom/issues/1125 ))
([f39858c ](f39858c233 ))
* headroom wrap opencode / unwrap opencode CLI
([#1105 ](https://github.com/headroomlabs-ai/headroom/issues/1105 ))
([b4571cc ](b4571cc346 ))
* **learn:** weight loops in Headroom Learn + RTK-loop eval
([#1160 ](https://github.com/headroomlabs-ai/headroom/issues/1160 ))
([14e8dc4 ](14e8dc4c84 ))
* **learn:** write per-project learnings to CLAUDE.local.md by default
([#1115 ](https://github.com/headroomlabs-ai/headroom/issues/1115 ))
([ced75e4 ](ced75e4718 ))
* **proxy:** add request timeout config
([#738 ](https://github.com/headroomlabs-ai/headroom/issues/738 ))
([c0745d4 ](c0745d4161 ))
* **proxy:** pilot hardening — inbound auth, security headers, audit
log, air-gap switch
([#1537 ](https://github.com/headroomlabs-ai/headroom/issues/1537 ))
([546ab55 ](546ab553dc ))
* **proxy:** support glob patterns in exclude_tools
([#870 ](https://github.com/headroomlabs-ai/headroom/issues/870 ))
([#1259 ](https://github.com/headroomlabs-ai/headroom/issues/1259 ))
([a2159c0 ](a2159c0b66 ))
* **read-maturation:** activity-based hold-back Read maturation
(Mechanism B)
([#1068 ](https://github.com/headroomlabs-ai/headroom/issues/1068 ))
([723b80c ](723b80c091 ))
* **savings:** durable savings ledger + headroom savings command
([#1127 ](https://github.com/headroomlabs-ai/headroom/issues/1127 ))
([978ffa0 ](978ffa0a6a ))
* **wrap:** add --1m to preserve the 1M context window on wrap claude
([#1158 ](https://github.com/headroomlabs-ai/headroom/issues/1158 ))
([#1351 ](https://github.com/headroomlabs-ai/headroom/issues/1351 ))
([b50d9c1 ](b50d9c17ce ))
* **wrap:** make tokensave the primary coding-task compressor, Serena
the backup
([#1230 ](https://github.com/headroomlabs-ai/headroom/issues/1230 ))
([dca9853 ](dca9853ed9 ))
### Bug Fixes
* **agent-evals:** Phase 0 — coding-agent accuracy A/B framework
([#1037 ](https://github.com/headroomlabs-ai/headroom/issues/1037 ))
([84f9871 ](84f9871e30 ))
* **agno:** tolerate streaming tool-call SDK objects in parser
([#1312 ](https://github.com/headroomlabs-ai/headroom/issues/1312 ))
([#1336 ](https://github.com/headroomlabs-ai/headroom/issues/1336 ))
([5986c22 ](5986c2260f ))
* **bedrock:** add boto3 1.41 + CRT for aws login credentials
([#1486 ](https://github.com/headroomlabs-ai/headroom/issues/1486 ))
([4db3bc9 ](4db3bc91d9 ))
* bump codebase-memory-mcp to v0.8.1
([#1284 ](https://github.com/headroomlabs-ai/headroom/issues/1284 ))
([530318b ](530318b425 ))
* **ccr:** make headroom_retrieve a hash-only full-content lookup
([#1532 ](https://github.com/headroomlabs-ai/headroom/issues/1532 ))
([c2fc4d3 ](c2fc4d3753 ))
* **ccr:** propagate --no-ccr-marker flag to all compressors
([#1022 ](https://github.com/headroomlabs-ai/headroom/issues/1022 ))
([#1197 ](https://github.com/headroomlabs-ai/headroom/issues/1197 ))
([0c9b42a ](0c9b42a919 ))
* **ccr:** skip Anthropic marker emission when tool injection is
deferred
([#1273 ](https://github.com/headroomlabs-ai/headroom/issues/1273 ))
([2cae13d ](2cae13dd79 ))
* **ci:** extend gitleaks allowlist to cover test fixtures + verified
examples
([#1539 ](https://github.com/headroomlabs-ai/headroom/issues/1539 ))
([d2565a6 ](d2565a6983 ))
* **ci:** guarantee model present in test shards to end cache-miss
flakiness
([#1399 ](https://github.com/headroomlabs-ai/headroom/issues/1399 ))
([2e29c72 ](2e29c7223f ))
* **ci:** normalize Windows CRLF line endings in PR governance script
([#1012 ](https://github.com/headroomlabs-ai/headroom/issues/1012 ))
([5194388 ](5194388b66 ))
* **cli:** add explicit UTF-8 encoding to file I/O in wrap commands
([#1126 ](https://github.com/headroomlabs-ai/headroom/issues/1126 ))
([#1164 ](https://github.com/headroomlabs-ai/headroom/issues/1164 ))
([a0cb798 ](a0cb7982e3 ))
* **cli:** fall back gracefully when embedding-server sidecar is absent
([#1206 ](https://github.com/headroomlabs-ai/headroom/issues/1206 ))
([38f1404 ](38f1404432 ))
* **cli:** harden all CLI surfaces + fix docs accuracy
([#1491 ](https://github.com/headroomlabs-ai/headroom/issues/1491 ))
([bd76235 ](bd76235f5c ))
* **cli:** wire --http2/--no-http2 (HEADROOM_HTTP2) into proxy command
([#1373 ](https://github.com/headroomlabs-ai/headroom/issues/1373 ))
([e06b616 ](e06b61671f ))
* **cli:** wire --rpm/--tpm and HEADROOM_RPM/HEADROOM_TPM to the Click
proxy command
([#1375 ](https://github.com/headroomlabs-ai/headroom/issues/1375 ))
([8aab8f2 ](8aab8f22cb ))
* **code:** slice tree-sitter byte offsets as UTF-8
([#1332 ](https://github.com/headroomlabs-ai/headroom/issues/1332 ))
([8238402 ](82384022bd ))
* **code:** validate Python compressed syntax
([#1302 ](https://github.com/headroomlabs-ai/headroom/issues/1302 ))
([cbd361d ](cbd361de2a ))
* **code:** verify a real parse in tree-sitter availability check
([#1231 ](https://github.com/headroomlabs-ai/headroom/issues/1231 ))
([#1299 ](https://github.com/headroomlabs-ai/headroom/issues/1299 ))
([5e0bb69 ](5e0bb69725 ))
* **codex:** retag threads on init so Codex Desktop history stays
visible ([#961 ](https://github.com/headroomlabs-ai/headroom/issues/961 ))
([#1349 ](https://github.com/headroomlabs-ai/headroom/issues/1349 ))
([e6bbc40 ](e6bbc40b11 ))
* **codex:** stop pinning Codex memory MCP to one project db
([#1269 ](https://github.com/headroomlabs-ai/headroom/issues/1269 ))
([ad7993b ](ad7993bf15 ))
* **dashboard:** include RTK stats in the historical tab
([#1324 ](https://github.com/headroomlabs-ai/headroom/issues/1324 ))
([35939c3 ](35939c3536 ))
* **deps:** remediate dependency CVEs and publish SBOM
([#1509 ](https://github.com/headroomlabs-ai/headroom/issues/1509 ))
([5771a80 ](5771a8020e ))
* **docker:** persist session history across container revisions
([#1118 ](https://github.com/headroomlabs-ai/headroom/issues/1118 ))
([5912d65 ](5912d65674 ))
* **gemini:** offload compression to the executor
([#1382 ](https://github.com/headroomlabs-ai/headroom/issues/1382 ))
([615848e ](615848eba4 ))
* **gemini:** resolve Google model capabilities through ModelRegistry
([#1276 ](https://github.com/headroomlabs-ai/headroom/issues/1276 ))
([17ecad9 ](17ecad9d89 ))
* **install:** guard install_agent_ensure against duplicate runtime
spawns
([#1301 ](https://github.com/headroomlabs-ai/headroom/issues/1301 ))
([8da0b4e ](8da0b4e565 ))
* **install:** repair macOS launchd restart/start lifecycle
([#1290 ](https://github.com/headroomlabs-ai/headroom/issues/1290 ))
([da1a397 ](da1a3973ed ))
* **install:** stop duplicating ENTRYPOINT in persistent-docker runtime
command ([#833 ](https://github.com/headroomlabs-ai/headroom/issues/833 ))
([#1348 ](https://github.com/headroomlabs-ai/headroom/issues/1348 ))
([feedead ](feedead077 ))
* **io:** use UTF-8 with locale fallback and preserve line endings on
config/text I/O
([#1498 ](https://github.com/headroomlabs-ai/headroom/issues/1498 ))
([1baa04e ](1baa04ef65 ))
* **kompress:** hard override keeps must-keep tokens regardless of model
score ([#1400 ](https://github.com/headroomlabs-ai/headroom/issues/1400 ))
([42612c8 ](42612c86df ))
* **langchain:** disable streaming on wrapped model during ainvoke()
([#1287 ](https://github.com/headroomlabs-ai/headroom/issues/1287 ))
([3590046 ](359004646b ))
* **mcp:** register managed installs with a resolvable headroom command
([#1386 ](https://github.com/headroomlabs-ai/headroom/issues/1386 ))
([22def93 ](22def93177 ))
* **mcp:** report correct savings_percent in headroom_compress
([#1106 ](https://github.com/headroomlabs-ai/headroom/issues/1106 ))
([f216e43 ](f216e43055 ))
* **opencode:** write local MCP config
([#1381 ](https://github.com/headroomlabs-ai/headroom/issues/1381 ))
([6c83790 ](6c83790680 ))
* **packaging:** move hnswlib to optional [vector] extra so [all] needs
no C++ toolchain
([#1499 ](https://github.com/headroomlabs-ai/headroom/issues/1499 ))
([80fa086 ](80fa086660 ))
* patch rtk hook script to use absolute path after register_claude_hooks
([#571 ](https://github.com/headroomlabs-ai/headroom/issues/571 ))
([b618d2d ](b618d2d11a ))
* **perf:** surface RTK/CLI context-tool savings in perf and the session
card ([#1433 ](https://github.com/headroomlabs-ai/headroom/issues/1433 ))
([9362747 ](93627471b7 ))
* **proxy:** add --protect-tool-results to prevent lossy compression of
exact-output Bash results
([#1374 ](https://github.com/headroomlabs-ai/headroom/issues/1374 ))
([51d4bcf ](51d4bcfc11 ))
* **proxy:** add an Anthropic buffered read-timeout override
([#1331 ](https://github.com/headroomlabs-ai/headroom/issues/1331 ))
([3be2526 ](3be2526b76 ))
* **proxy:** add versionless Vertex AI routes for Claude Code
compatibility
([#1321 ](https://github.com/headroomlabs-ai/headroom/issues/1321 ))
([bb3e040 ](bb3e040a46 ))
* **proxy:** bind before eager preload so a hung compressor load can't
block startup
([#1500 ](https://github.com/headroomlabs-ai/headroom/issues/1500 ))
([d5ac07f ](d5ac07fc45 ))
* **proxy:** build SSL contexts for custom CA bundles
([#1134 ](https://github.com/headroomlabs-ai/headroom/issues/1134 ))
([561ba17 ](561ba17ec2 ))
* **proxy:** forward request-id headers on the streaming path
([#1100 ](https://github.com/headroomlabs-ai/headroom/issues/1100 ))
([#1258 ](https://github.com/headroomlabs-ai/headroom/issues/1258 ))
([3d59df7 ](3d59df7be8 ))
* **proxy:** gate CCR retrieve/compress endpoints to loopback
([#1338 ](https://github.com/headroomlabs-ai/headroom/issues/1338 ))
([acafb2d ](acafb2d0f6 ))
* **proxy:** honor force_kompress routing profile
([#996 ](https://github.com/headroomlabs-ai/headroom/issues/996 ))
([b4682d6 ](b4682d6f91 ))
* **proxy:** keep large compression results on the critical path
([#296 ](https://github.com/headroomlabs-ai/headroom/issues/296 ))
([#1352 ](https://github.com/headroomlabs-ai/headroom/issues/1352 ))
([90734b6 ](90734b691a ))
* **proxy:** offload /v1/compress to the compression executor to stop
blocking the loop
([#1501 ](https://github.com/headroomlabs-ai/headroom/issues/1501 ))
([27e010e ](27e010e38f ))
* **proxy:** preserve Responses memory continuations with store=false
([#1103 ](https://github.com/headroomlabs-ai/headroom/issues/1103 ))
([cdfeeac ](cdfeeacc63 ))
* **proxy:** queue mid-turn user messages on non-Bedrock streaming path
([#1377 ](https://github.com/headroomlabs-ai/headroom/issues/1377 ))
([b09f027 ](b09f027062 ))
* **proxy:** register interceptor in explicit transforms list when
HEADROOM_INTERCEPT_ENABLED
([#1376 ](https://github.com/headroomlabs-ai/headroom/issues/1376 ))
([55c700c ](55c700c686 ))
* **proxy:** report real input tokens on streaming message_start
([#1132 ](https://github.com/headroomlabs-ai/headroom/issues/1132 ))
([#1305 ](https://github.com/headroomlabs-ai/headroom/issues/1305 ))
([70cc96a ](70cc96a386 ))
* **proxy:** retry upstream 429 with Retry-After on both forwarders
([#1329 ](https://github.com/headroomlabs-ai/headroom/issues/1329 ))
([90bee89 ](90bee89243 ))
* **proxy:** retry upstream 529 overloaded like 429 on both forwarders
([#1495 ](https://github.com/headroomlabs-ai/headroom/issues/1495 ))
([547b15d ](547b15dab2 ))
* **proxy:** stop re-compressing headroom_retrieve output and emitting
unredeemable markers
([#1323 ](https://github.com/headroomlabs-ai/headroom/issues/1323 ))
([43494ff ](43494ff526 ))
* **proxy:** strip Codex lite header from OpenAI WebSockets
([#1543 ](https://github.com/headroomlabs-ai/headroom/issues/1543 ))
([5d3803a ](5d3803a21c ))
* **read-lifecycle:** persist STALE Read originals in the CCR store
([#1488 ](https://github.com/headroomlabs-ai/headroom/issues/1488 ))
([9157173 ](9157173018 ))
* recover persistent proxy feature checks and reject non-Copilot
exchange URL
([#1465 ](https://github.com/headroomlabs-ai/headroom/issues/1465 ))
([16c638b ](16c638bc21 ))
* remove agents.md
([#1540 ](https://github.com/headroomlabs-ai/headroom/issues/1540 ))
([a7d3360 ](a7d3360a05 ))
* respect COPILOT_PROVIDER_TYPE env var when provider_type is auto
([#549 ](https://github.com/headroomlabs-ai/headroom/issues/549 ))
([24cf256 ](24cf256e50 ))
* restore token-mode compression on frozen prefixes
([#1489 ](https://github.com/headroomlabs-ai/headroom/issues/1489 ))
([8e0dadf ](8e0dadfe02 ))
* **router:** degrade to pure-Python detection on native panic
([#1123 ](https://github.com/headroomlabs-ai/headroom/issues/1123 ))
([#1260 ](https://github.com/headroomlabs-ai/headroom/issues/1260 ))
([a00fb67 ](a00fb6761e ))
* **rtk:** stop hook registration timing out on a forked daemon
([#1314 ](https://github.com/headroomlabs-ai/headroom/issues/1314 ))
([9758817 ](9758817979 ))
* **smart-crusher:** honor enable_ccr_marker on the opaque-blob path
([#1130 ](https://github.com/headroomlabs-ai/headroom/issues/1130 ))
([27d6f8e ](27d6f8e2a7 ))
* **subscription:** only reset 5h contribution on real rollover, not API
jitter
([#1255 ](https://github.com/headroomlabs-ai/headroom/issues/1255 ))
([8d6c175 ](8d6c175d60 ))
* **subscription:** run transcript token scan off the event loop
([#1263 ](https://github.com/headroomlabs-ai/headroom/issues/1263 ))
([f03021f ](f03021f1b6 ))
* surface output reduction without a restart, and explain $0.00 savings
on Python 3.14
([#1296 ](https://github.com/headroomlabs-ai/headroom/issues/1296 ))
([c30ec4c ](c30ec4cda8 ))
* **tests:** reset whole headroom logger subtree so caplog stays
deterministic
([#1117 ](https://github.com/headroomlabs-ai/headroom/issues/1117 ))
([fda4670 ](fda4670ef8 ))
* **tls:** add HEADROOM_TLS_STRICT=0 toggle for corporate SSL inspection
([#1308 ](https://github.com/headroomlabs-ai/headroom/issues/1308 ))
([#1341 ](https://github.com/headroomlabs-ai/headroom/issues/1341 ))
([52068dd ](52068dd650 ))
* **tokenizers:** price CJK/Kana/Hangul at ~1 token per char in
EstimatingTokenCounter
([#1093 ](https://github.com/headroomlabs-ai/headroom/issues/1093 ))
([a35fe86 ](a35fe86e87 ))
* **transforms:** gate tool string output from lossy compression
([#1307 ](https://github.com/headroomlabs-ai/headroom/issues/1307 ))
([#1387 ](https://github.com/headroomlabs-ai/headroom/issues/1387 ))
([c6c921a ](c6c921a7c1 ))
* **websocket:** harden responses websocket origin handling
([#1481 ](https://github.com/headroomlabs-ai/headroom/issues/1481 ))
([c632023 ](c632023cc1 ))
* **windows:** pin UTF-8 encoding on text-mode subprocess calls
([#1311 ](https://github.com/headroomlabs-ai/headroom/issues/1311 ))
([d633e81 ](d633e8172c ))
* **wrap:** add Copilot unwrap command
([#1251 ](https://github.com/headroomlabs-ai/headroom/issues/1251 ))
([b4fde0c ](b4fde0c3a4 ))
* **wrap:** isolate proxy stdio from proxy.log on Windows
([#1191 ](https://github.com/headroomlabs-ai/headroom/issues/1191 ))
([959ab0d ](959ab0de47 ))
* **wrap:** keep agent savings opt-in
([#1294 ](https://github.com/headroomlabs-ai/headroom/issues/1294 ))
([b829ceb ](b829ceba84 ))
* **wrap:** show the dashboard URL when the proxy is already running
([#1313 ](https://github.com/headroomlabs-ai/headroom/issues/1313 ))
([b0146c4 ](b0146c4ccd ))
### Performance Improvements
* **compression:** take large cold-start contexts off the synchronous
kompress path
([#1171 ](https://github.com/headroomlabs-ai/headroom/issues/1171 ))
([#1298 ](https://github.com/headroomlabs-ai/headroom/issues/1298 ))
([6c68ff4 ](6c68ff4e9f ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-29 12:53:17 -07:00
Tejas Chopra
5771a8020e
fix(deps): remediate dependency CVEs and publish SBOM ( #1509 )
...
## Description
Supply-chain hardening: takes the **shipped** dependency surface from
**26 known CVEs to 0**. `pip install headroom-ai[all]` now resolves with
no known vulnerabilities (verified with Anchore syft + grype). Also
publishes a checked-in SBOM package (`sbom/`) so any user — especially
pilots running their own security review — can verify what's inside and
that we track it.
This addresses the Dependabot alerts on `main` (9 high / 4 moderate / 7
low at time of writing).
Closes #
## Type of Change
- [x] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [x] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)
## Changes Made
**Rust**
- `pyo3` 0.24 → 0.29 (GHSA-36hh-v3qg-5jq4 High, GHSA-chgr-c6px-7xpp
Med). Migrated `Python::allow_threads` → `Python::detach` (10 sites) and
added `from_py_object` to the `Clone`-deriving `#[pyclass]` types (both
required by the 0.25+ API).
- `pyo3-log` 0.12 → 0.13; `lru` 0.12 → 0.18 (GHSA-rhfx-m35p-ff5j).
**Python**
- `torch` → 2.12.1, `mem0ai` → 2.x.
- Floor-pinned transitive CVE deps via `[tool.uv]
constraint-dependencies`: `pygments>=2.20.0`,
`pydantic-settings>=2.14.2`, `gitpython>=3.1.50`, `langsmith>=0.9.0`.
- **Removed `benchmark` from the `[all]` aggregate** so the default
install is CVE-free. `lm-eval` is invoked as an external subprocess
(`python -m lm_eval`) and never imported, so it is not a true runtime
dep — it remains available via the opt-in `[benchmark]` extra. See
[Accepted Risks](#additional-notes).
**npm (build/test tooling — never shipped in the
wheel/container/published SDK)**
- `esbuild` override `>=0.28.1` in `sdk/typescript` + `plugins/openclaw`
(GHSA-g7r4-m6w7-qqqr).
- `docs/`: `@anthropic-ai/sdk` → `^0.106.0` (GHSA-p7fg-763f-g4gf),
`postcss` override to force Next.js's bundled copy ≥8.5.10
(GHSA-qx2v-qp2m-jg93); regenerated a stale `bun.lock` that carried a
**Critical** vitest/vite.
**CI**
- Pinned `pypa/gh-action-pypi-publish` `@release/v1` → `@v1.13.0`
(GHSA-vxmw-7h4f-hqxh) in `release.yml` + `publish.yml`.
**SBOM**
- New `sbom/` directory: CycloneDX 1.7 + SPDX 2.3 SBOMs, grype scan
evidence, 330-package license inventory, and a regeneration guide.
## Testing
- [ ] Unit tests pass (`pytest`) — N/A, no Python source changed
(deps/config only)
- [x] Linting passes — `cargo fmt --check` + `cargo clippy` clean on the
changed crate; 0 `.py` files changed so `ruff`/`mypy` scope is
unaffected
- [x] Type checking passes — `cargo check --workspace` (0 errors)
- [ ] New tests added — N/A (dependency bumps; covered by existing
suites)
- [x] Manual testing performed — see Real Behavior Proof
### Test Output
```text
# headroom-ai[all] product surface — the number that matters
$ grype sbom:sbom/headroom-sbom-all-extra.cdx.json
No vulnerabilities found
# full repo scan (universal lock incl. opt-in [benchmark] + dev)
$ grype sbom:sbom/headroom-sbom.cdx.json
NAME INSTALLED TYPE VULNERABILITY SEVERITY
sqlitedict 2.1.0 python GHSA-g4r7-86gm-pgqc High # [benchmark]-only, unpatchable, accepted
nltk 3.9.4 python GHSA-p4gq-832x-fm9v High # [benchmark]-only, unpatchable, accepted
# pyo3 0.29 migration — extension builds + imports + runs
$ cargo check --workspace
Finished `dev` profile [unoptimized + debuginfo] target(s)
$ maturin develop && python -c "from headroom._core import DiffCompressor, SmartCrusher; ..."
extension OK — detach + from_py_object paths exercised
# lru 0.18 — eviction path
$ cargo test -p headroom-proxy --lib drift
14 passed, 213 filtered out
# per-ecosystem npm audits
$ (cd sdk/typescript && npm audit) -> found 0 vulnerabilities
$ (cd plugins/openclaw && npm audit) -> found 0 vulnerabilities
$ (cd docs && npm audit && bun audit) -> found 0 vulnerabilities / No vulnerabilities found
```
## Real Behavior Proof
- Environment: macOS (darwin 25.4.0, arm64), Python 3.12 `.venv`, Rust
1.95 toolchain, syft 1.46.0, grype 0.115.0, bun 1.3.14, maturin 1.13.3.
- Exact command / steps: (1) `uv export --extra all --no-dev
--no-emit-project | syft → grype` for the product surface; (2) `cargo
check --workspace` + `maturin develop` + extension import/compress smoke
test; (3) `cargo test -p headroom-proxy --lib drift`; (4) `cargo fmt
--check` + `cargo clippy -p headroom-py`; (5) `npm audit` in
sdk/openclaw/docs + `bun audit` in docs.
- Observed result: `headroom-ai[all]` resolution scans clean — "No
vulnerabilities found" (179 pkgs); full/prod SBOM shows only the 2
documented accepted CVEs; pyo3 0.29 extension imports and runs (detach +
from_py_object paths exercised); drift tests 14/14 pass; cargo fmt +
clippy clean; all npm/bun audits report 0.
- Not tested: full `pytest` suite (no Python source changed);
release-profile wheel build (used dev-profile `maturin develop` for the
import proof — the extension is semantically identical).
## Review Readiness
- [x] I have performed a self-review
- [x] This PR is ready for human review
## Checklist
- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [x] I have commented my code, particularly in hard-to-understand areas
- [x] I have made corresponding changes to the documentation
(`sbom/README.md`)
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective — N/A
(dependency bumps; existing suites + scans cover it)
- [x] New and existing unit tests pass locally with my changes
- [ ] I have updated the CHANGELOG.md — N/A (Release Please
auto-generates from the conventional commit)
## Additional Notes
**Accepted risks (the 2 residual CVEs).** Both originate solely from the
EleutherAI `lm-evaluation-harness` under the **opt-in `[benchmark]`
extra**, which Headroom invokes as a subprocess (never imports):
- `sqlitedict` CVE-2024-35515 (High) — pickle deserialization; package
abandoned (last release 2021), **no upstream fix exists**.
- `nltk` CVE-2026-54293 (High) — path traversal in `nltk.data.load()`;
affects ≤3.9.4 (current latest), **no patched release**.
Neither is in `[all]`, the published wheel, or the container. They are
documented in `sbom/README.md` and will be picked up automatically once
upstream ships fixes.
**Release/CHANGELOG:** N/A items above are because this is a
dependency/security PR with no Python source changes; CHANGELOG is
Release-Please-managed via the conventional commit message.
2026-06-27 15:28:12 -07:00
github-actions[bot]
95b2333ee5
chore: release main ( #1274 )
...
🤖 I have created a release *beep* *boop*
---
<details><summary>0.27.0</summary>
##
[0.27.0](https://github.com/chopratejas/headroom/compare/v0.26.0...v0.27.0 )
(2026-06-22)
### Features
* **cli:** add headroom doctor setup diagnostics
([#926 ](https://github.com/chopratejas/headroom/issues/926 ))
([e45cf4e ](e45cf4e061 ))
* **cli:** add headroom update command and release banner
([#1088 ](https://github.com/chopratejas/headroom/issues/1088 ))
([26be2c3 ](26be2c39cb ))
* compression extraction — Rust knob exposure, CCR hardening, traffic
audits ([#818 ](https://github.com/chopratejas/headroom/issues/818 ))
([b7be381 ](b7be3814f1 ))
* measure and surface token throughput (tokens/sec) through the proxy
([#983 ](https://github.com/chopratejas/headroom/issues/983 ))
([0d89c67 ](0d89c674cd ))
* output-token reduction — verbosity shaper, per-user learning,
counterfactual savings
([#965 ](https://github.com/chopratejas/headroom/issues/965 ))
([a99dc61 ](a99dc61424 ))
* **policy:** decay P_alive from idle time near cache TTL
([#856 ](https://github.com/chopratejas/headroom/issues/856 ) P3b)
([#1028 ](https://github.com/chopratejas/headroom/issues/1028 ))
([fe4f9ee ](fe4f9ee478 ))
* **providers:** add Cortex Code (Snowflake CoCo) as a supported agent
([#1190 ](https://github.com/chopratejas/headroom/issues/1190 ))
([d9d0bf4 ](d9d0bf4b79 ))
* **proxy:** cc-switch reconciler — keep Headroom in the request path
alongside cc-switch
([#1030 ](https://github.com/chopratejas/headroom/issues/1030 ))
([e8fc8a0 ](e8fc8a0d18 ))
* **proxy:** hot-reload live env knobs so a reused proxy picks them up
without a restart
([#1090 ](https://github.com/chopratejas/headroom/issues/1090 ))
([6904d47 ](6904d47a01 ))
* **proxy:** make COMPRESSION_TIMEOUT_SECONDS configurable via env
([#946 ](https://github.com/chopratejas/headroom/issues/946 ))
([#991 ](https://github.com/chopratejas/headroom/issues/991 ))
([addebdb ](addebdb29c ))
* **transforms:** tabular + spreadsheet (.xlsx/.xls) compression
([#1128 ](https://github.com/chopratejas/headroom/issues/1128 ))
([d789a7c ](d789a7c528 ))
* **vertex:** turnkey Claude Code + Vertex compression (+ fixes from the
Vertex review)
([#1113 ](https://github.com/chopratejas/headroom/issues/1113 ))
([0e05915 ](0e0591506c ))
### Bug Fixes
* **ccr:** accept 12-char SmartCrusher hashes in tool injection
([#1095 ](https://github.com/chopratejas/headroom/issues/1095 ))
([#1141 ](https://github.com/chopratejas/headroom/issues/1141 ))
([9f7f3ad ](9f7f3adfea ))
* **ccr:** return stored content when headroom_retrieve query matches
nothing ([#1213 ](https://github.com/chopratejas/headroom/issues/1213 ))
([#1236 ](https://github.com/chopratejas/headroom/issues/1236 ))
([08fb845 ](08fb845fe3 ))
* **content-router:** honor target_ratio in compression cache + add
proxy --target-ratio flag
([#1108 ](https://github.com/chopratejas/headroom/issues/1108 ))
([8894ee0 ](8894ee0c18 ))
* **dashboard:** light-mode backgrounds + aligned savings tables
([#1064 ](https://github.com/chopratejas/headroom/issues/1064 ))
([5eae32b ](5eae32ba47 ))
* **deps:** make litellm optional on Python 3.14
([#956 ](https://github.com/chopratejas/headroom/issues/956 ))
([#993 ](https://github.com/chopratejas/headroom/issues/993 ))
([b2f04e4 ](b2f04e4ef7 ))
* **e2e:** align Codex wrap e2e with global-only RTK guidance
([#1240 ](https://github.com/chopratejas/headroom/issues/1240 ))
([#1254 ](https://github.com/chopratejas/headroom/issues/1254 ))
([bc12ace ](bc12acef59 ))
* **init:** set ENABLE_TOOL_SEARCH=true so Claude Code keeps deferring
tools ([#746 ](https://github.com/chopratejas/headroom/issues/746 ))
([#995 ](https://github.com/chopratejas/headroom/issues/995 ))
([500ec2b ](500ec2b7fa ))
* **kompress:** never block the request path on the cold-cache model
download ([#1161 ](https://github.com/chopratejas/headroom/issues/1161 ))
([3fc2a78 ](3fc2a78a5e ))
* **memory:** use ONNX embedder for `wrap --memory` sync
([#1092 ](https://github.com/chopratejas/headroom/issues/1092 ))
([#1262 ](https://github.com/chopratejas/headroom/issues/1262 ))
([4f9feda ](4f9fedaa7a ))
* **openclaw:** wrap plugin export as {register} object for OpenClaw
2026.x compatibility
([#1218 ](https://github.com/chopratejas/headroom/issues/1218 ))
([2e6c442 ](2e6c442dc8 ))
* **providers:** update DeepSeek V3 context limit from 128K to 1M
([#1038 ](https://github.com/chopratejas/headroom/issues/1038 ))
([#1137 ](https://github.com/chopratejas/headroom/issues/1137 ))
([bcabc5c ](bcabc5cb11 ))
* **proxy:** allow disabling periodic TOIN stats logging
([#1265 ](https://github.com/chopratejas/headroom/issues/1265 ))
([b5f63d8 ](b5f63d8fa9 ))
* **proxy:** honor HEADROOM_EXCLUDE_TOOLS for Codex /v1/responses tool
outputs ([#940 ](https://github.com/chopratejas/headroom/issues/940 ))
([#1053 ](https://github.com/chopratejas/headroom/issues/1053 ))
([f03e77b ](f03e77bec0 ))
* **proxy:** preserve byte-faithful Anthropic tool forwarding
([#1222 ](https://github.com/chopratejas/headroom/issues/1222 ))
([1f18d59 ](1f18d59809 ))
* **proxy:** route Codex OAuth image requests
([#1215 ](https://github.com/chopratejas/headroom/issues/1215 ))
([381d771 ](381d771e46 ))
* **proxy:** scope CORS to loopback + gate operator/content endpoints
([#1226 ](https://github.com/chopratejas/headroom/issues/1226 ))
([bd55a42 ](bd55a426bc ))
* **proxy:** stamp X-Client: codex on Responses endpoint for
unidentified callers
([#1036 ](https://github.com/chopratejas/headroom/issues/1036 ))
([b0cd032 ](b0cd0329c7 ))
* **proxy:** treat NODE_EXTRA_CA_CERTS as additive, not replacement
([#998 ](https://github.com/chopratejas/headroom/issues/998 ))
([#1031 ](https://github.com/chopratejas/headroom/issues/1031 ))
([c987283 ](c98728363a ))
* **telemetry:** switch anonymous telemetry to opt-in (off by default)
([#1223 ](https://github.com/chopratejas/headroom/issues/1223 ))
([b998697 ](b99869778b ))
* **tokenizers:** bound tiktoken vocab load so a stalled download cannot
hang requests
([#956 ](https://github.com/chopratejas/headroom/issues/956 ))
([#994 ](https://github.com/chopratejas/headroom/issues/994 ))
([7e86baf ](7e86bafb90 ))
* **unwrap:** remove ANTHROPIC_BASE_URL + ENABLE_TOOL_SEARCH and init
hooks on unwrap
([#992 ](https://github.com/chopratejas/headroom/issues/992 ))
([5b84691 ](5b84691770 ))
* **wrap:** keep Codex RTK guidance global
([#1240 ](https://github.com/chopratejas/headroom/issues/1240 ))
([7c26a54 ](7c26a54d53 ))
* **wrap:** percent-encode non-ASCII cwd names in X-Headroom-Project
header ([#1071 ](https://github.com/chopratejas/headroom/issues/1071 ))
([9f712cc ](9f712ccbd7 ))
* **wrap:** write env.ANTHROPIC_BASE_URL to settings.json so
daemon-spawned conversations inherit proxy
([#951 ](https://github.com/chopratejas/headroom/issues/951 ))
([#1078 ](https://github.com/chopratejas/headroom/issues/1078 ))
([a554c3a ](a554c3a0e6 ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-21 22:28:55 -07:00
github-actions[bot]
b81a4a7a16
chore: release main ( #931 )
...
🤖 I have created a release *beep* *boop*
---
<details><summary>0.26.0</summary>
##
[0.26.0](https://github.com/chopratejas/headroom/compare/v0.25.0...v0.26.0 )
(2026-06-16)
### Features
* add Copilot BYOK provider wrapper utilities and CLI support
([#1041 ](https://github.com/chopratejas/headroom/issues/1041 ))
([e67ee2a ](e67ee2af65 ))
* add dashboard agent usage stats
([#814 ](https://github.com/chopratejas/headroom/issues/814 ))
([6d3f39f ](6d3f39f213 ))
* Add support for Mistral Vibe CLI
([#935 ](https://github.com/chopratejas/headroom/issues/935 ))
([0932b8b ](0932b8bef4 ))
* attribute reread waste to over-compression via marker check
([#901 ](https://github.com/chopratejas/headroom/issues/901 ))
([f928576 ](f9285766dd ))
* **bedrock:** cross-region + Converse compression; bundle proxy binary
in images ([#999 ](https://github.com/chopratejas/headroom/issues/999 ))
([0dc2e1c ](0dc2e1cb3f ))
* **dashboard:** surface compression-vs-cache net impact in Prefix Cache
panel ([#913 ](https://github.com/chopratejas/headroom/issues/913 ))
([2a4d300 ](2a4d300841 ))
* **evals:** adversarial-input robustness grid for compressors
([#918 ](https://github.com/chopratejas/headroom/issues/918 ))
([5939004 ](5939004185 ))
* **parser:** detect re-issued identical tool calls as reread waste
([#909 ](https://github.com/chopratejas/headroom/issues/909 ))
([7d4ae86 ](7d4ae86ec0 ))
* **policy:** batch deep edits through one cache-bust
([#856 ](https://github.com/chopratejas/headroom/issues/856 ) P3a)
([#1015 ](https://github.com/chopratejas/headroom/issues/1015 ))
([c2e52fe ](c2e52fe743 ))
* **policy:** consume net-cost mutation gate in ContentRouter
([#856 ](https://github.com/chopratejas/headroom/issues/856 ) P2)
([#905 ](https://github.com/chopratejas/headroom/issues/905 ))
([553ade4 ](553ade4ec6 ))
* **proxy:** compress AWS Bedrock InvokeModel requests via configurable
upstream ([#720 ](https://github.com/chopratejas/headroom/issues/720 ))
([7edb27a ](7edb27ab24 ))
### Bug Fixes
* **anthropic:** strip styled Claude model ids
([#651 ](https://github.com/chopratejas/headroom/issues/651 ))
([0c5c89d ](0c5c89d05c ))
* **anyllm:** forward openai api_base/api_key to the any-llm backend
([#942 ](https://github.com/chopratejas/headroom/issues/942 ))
([#954 ](https://github.com/chopratejas/headroom/issues/954 ))
([a7ee8a6 ](a7ee8a60a7 ))
* **cache:** guard None exemplar embeddings in dynamic detector
([#950 ](https://github.com/chopratejas/headroom/issues/950 ))
([1ec9320 ](1ec9320888 ))
* **cache:** name the missing piece in semantic detector guard
([#1018 ](https://github.com/chopratejas/headroom/issues/1018 ))
([3b0bcee ](3b0bceecf4 ))
* **ci:** check out repo in PR Governance label job
([#1021 ](https://github.com/chopratejas/headroom/issues/1021 ))
([4558bc2 ](4558bc2465 ))
* **ci:** make PR governance advisory
([#1047 ](https://github.com/chopratejas/headroom/issues/1047 ))
([74dff94 ](74dff94fb8 ))
* **codex:** compute waste signals on the OpenAI Responses path
([#898 ](https://github.com/chopratejas/headroom/issues/898 ))
([b9e2761 ](b9e27614c6 ))
* **codex:** poll /wham/usage for subscription limits (handshake no
longer sends x-codex-* headers)
([#924 ](https://github.com/chopratejas/headroom/issues/924 ))
([8c00f71 ](8c00f7103c ))
* **codex:** PR health label check state
([#986 ](https://github.com/chopratejas/headroom/issues/986 ))
([99c874d ](99c874d423 ))
* **codex:** retag thread providers so history menu stays whole across
the proxy boundary
([#1034 ](https://github.com/chopratejas/headroom/issues/1034 ))
([74ae781 ](74ae781644 ))
* **codex:** write canonical hooks feature flag and migrate deprecated
codex_hooks ([#743 ](https://github.com/chopratejas/headroom/issues/743 ))
([dff6a19 ](dff6a19946 ))
* **compression:** convert tree-sitter byte offsets to char offsets
([#892 ](https://github.com/chopratejas/headroom/issues/892 ))
([b1f700f ](b1f700fc27 ))
* **compression:** correct JSON array item counting and entropy gate
([#887 ](https://github.com/chopratejas/headroom/issues/887 ))
([d6f0f0f ](d6f0f0f642 ))
* **compression:** keep container bodies compressible in code handler
([#890 ](https://github.com/chopratejas/headroom/issues/890 ))
([16ed73b ](16ed73bca6 ))
* **compression:** measure short-value threshold on payload, not token
([#889 ](https://github.com/chopratejas/headroom/issues/889 ))
([65b0e8c ](65b0e8c58d ))
* **compression:** use thread-local tree-sitter parsers in code handler
([#893 ](https://github.com/chopratejas/headroom/issues/893 ))
([6cdb846 ](6cdb846200 ))
* **gemini:** surface functionResponse payloads to waste-signal
detection ([#897 ](https://github.com/chopratejas/headroom/issues/897 ))
([9b0c840 ](9b0c840dd7 ))
* **learn:** decode directory names with spaces in Windows project paths
([#997 ](https://github.com/chopratejas/headroom/issues/997 ))
([#1027 ](https://github.com/chopratejas/headroom/issues/1027 ))
([2d3701b ](2d3701b59e ))
* **learn:** scan subagent and workflow transcripts
([#1045 ](https://github.com/chopratejas/headroom/issues/1045 ))
([0ddd4ed ](0ddd4ed9e9 ))
* **openclaw:** declare headroom_retrieve tool contract
([#947 ](https://github.com/chopratejas/headroom/issues/947 ))
([7c8c909 ](7c8c909c85 ))
* **policy:** correct warm-cache penalty in net_mutation_gain to (S +
dT) ([#903 ](https://github.com/chopratejas/headroom/issues/903 ))
([0632eba ](0632eba6c3 ))
* **proxy:** add native Bedrock converse-stream route
([#917 ](https://github.com/chopratejas/headroom/issues/917 ))
([b08ec15 ](b08ec15b0d ))
* **proxy:** keep codex image-generation WS turns alive through the
relay ([#1000 ](https://github.com/chopratejas/headroom/issues/1000 ))
([7dbbb40 ](7dbbb4077e ))
* **proxy:** make budget enforcement actually work
([#885 ](https://github.com/chopratejas/headroom/issues/885 ))
([a14ab45 ](a14ab45cf0 ))
* **proxy:** read RTK gain stats globally by default
([#957 ](https://github.com/chopratejas/headroom/issues/957 ))
([b70fccb ](b70fccbe17 ))
* route v1internal code assist requests to cloudcode-pa.googleapis…
([#821 ](https://github.com/chopratejas/headroom/issues/821 ))
([e20f16b ](e20f16b1a6 ))
* **serena:** stop the Serena dashboard popup and make --no-serena
actually disable Serena
([#1003 ](https://github.com/chopratejas/headroom/issues/1003 ))
([919379a ](919379a8a1 ))
* support Copilot Business subscription auth
([#641 ](https://github.com/chopratejas/headroom/issues/641 ))
([0b4a4bd ](0b4a4bd483 ))
* wire HEADROOM_EXCLUDE_TOOLS / HEADROOM_TOOL_PROFILES into Click proxy
entrypoint ([#943 ](https://github.com/chopratejas/headroom/issues/943 ))
([9b7b436 ](9b7b436b04 ))
* **wrap:** avoid duplicate top-level keys when injecting codex provider
([#884 ](https://github.com/chopratejas/headroom/issues/884 ))
([dd22cfd ](dd22cfd72a ))
### Code Refactoring
* DRY cache logic, add thread safety, fix Bash exclusion
([#704 ](https://github.com/chopratejas/headroom/issues/704 ))
([e36fccd ](e36fccd8cf ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-16 15:35:00 -07:00
github-actions[bot]
8a53c8ec3b
chore: release main ( #891 )
...
🤖 I have created a release *beep* *boop*
---
<details><summary>0.25.0</summary>
##
[0.25.0](https://github.com/chopratejas/headroom/compare/v0.24.0...v0.25.0 )
(2026-06-12)
### Features
* add differential network capture harness
([#761 ](https://github.com/chopratejas/headroom/issues/761 ))
([11ab5f8 ](11ab5f83a1 ))
* add light mode for dashboard
([#834 ](https://github.com/chopratejas/headroom/issues/834 ))
([c425893 ](c425893d12 ))
* add OAuth2 client-credentials upstream-auth proxy extension
([#778 ](https://github.com/chopratejas/headroom/issues/778 ))
([#784 ](https://github.com/chopratejas/headroom/issues/784 ))
([eb2e50f ](eb2e50feb2 ))
* add Vertex AI proxy routing
([#793 ](https://github.com/chopratejas/headroom/issues/793 ))
([3c77e52 ](3c77e52ce4 ))
* **cli:** comprehensive help text, validation, and exception handling
improvements
([#640 ](https://github.com/chopratejas/headroom/issues/640 ))
([028efab ](028efabb4e ))
* compression safety rails — error-output protection, pipeline circuit
breaker, library inflation guard
([#851 ](https://github.com/chopratejas/headroom/issues/851 ))
([c0cadcc ](c0cadccff9 ))
* **dashboard:** per-model savings breakdown and expected-vs-actual cost
on historical charts
([#807 ](https://github.com/chopratejas/headroom/issues/807 ))
([34dafe6 ](34dafe69d9 ))
* detect re-served tool results as over-compression waste signal
([#854 ](https://github.com/chopratejas/headroom/issues/854 ))
([5f1d88a ](5f1d88ad27 ))
* **evals:** add zero-cost tool schema compaction integrity eval
([#817 ](https://github.com/chopratejas/headroom/issues/817 ))
([53a08c6 ](53a08c63bf ))
* gated Markdown-KV compaction formatter (serialization-aware output)
([#859 ](https://github.com/chopratejas/headroom/issues/859 ))
([06b2625 ](06b2625b17 ))
* **kompress:** warn on unrecognized HEADROOM_KOMPRESS_BACKEND +
document backend selection
([#204 ](https://github.com/chopratejas/headroom/issues/204 ))
([6367d0b ](6367d0b722 ))
* **memory:** add opt-in Apple-GPU (MPS) embedding runtime
([#766 ](https://github.com/chopratejas/headroom/issues/766 ))
([c71592d ](c71592d421 ))
* net-cost cache mutation formula on CompressionPolicy
([#856 ](https://github.com/chopratejas/headroom/issues/856 ) P1)
([#857 ](https://github.com/chopratejas/headroom/issues/857 ))
([d5f5802 ](d5f58026e2 ))
* **plugins:** Hermes agent headroom_retrieve plugin
([#824 ](https://github.com/chopratejas/headroom/issues/824 ))
([058bced ](058bcedab8 ))
* probe-based retention scoring of recorded compression events
([#862 ](https://github.com/chopratejas/headroom/issues/862 ))
([c2106cb ](c2106cbdab ))
* **proxy:** add CLI opt-outs for CCR injection (compression-only mode)
([#823 ](https://github.com/chopratejas/headroom/issues/823 ))
([693d9d2 ](693d9d20e2 ))
* **proxy:** attribute savings history rollups per provider
([#791 ](https://github.com/chopratejas/headroom/issues/791 ))
([0b8b8d9 ](0b8b8d92de ))
* **proxy:** log compressed messages alongside original request
([#261 ](https://github.com/chopratejas/headroom/issues/261 ))
([2269e40 ](2269e40bde ))
* **proxy:** per-project savings breakdown on the dashboard (claude,
codex, aider, copilot, cursor)
([#803 ](https://github.com/chopratejas/headroom/issues/803 ))
([914a60a ](914a60a2b0 ))
* support Python 3.14+ via pyo3 abi3 stable ABI
([#516 ](https://github.com/chopratejas/headroom/issues/516 ))
([19eac8e ](19eac8e00d ))
* switch Kompress default to kompress-v2-base with weight-only int8 ONNX
([#799 ](https://github.com/chopratejas/headroom/issues/799 ))
([74392b2 ](74392b238e ))
* **transforms:** attribute read_lifecycle + smart_crush tags
([#249 ](https://github.com/chopratejas/headroom/issues/249 ))
([8f37426 ](8f374263d3 ))
### Bug Fixes
* **anthropic:** CCR exception must re-raise, not silently swallow
([#838 ](https://github.com/chopratejas/headroom/issues/838 ))
([8db5efc ](8db5efc6f9 ))
* **ccr:** key Rust search/diff/log markers with explicit_hash
([#852 ](https://github.com/chopratejas/headroom/issues/852 ))
([bfcb07d ](bfcb07d78e ))
* **ccr:** make retrieval TTL configurable
([#715 ](https://github.com/chopratejas/headroom/issues/715 ))
([2533f77 ](2533f7703e ))
* **ccr:** skip CCR when model calls headroom_retrieve alongside user
tools ([#839 ](https://github.com/chopratejas/headroom/issues/839 ))
([30078f8 ](30078f8465 ))
* **ccr:** use shared compression store
([#875 ](https://github.com/chopratejas/headroom/issues/875 ))
([249af6c ](249af6cc7b ))
* **ci:** correct comments, timeouts, and pip reliability in native e2e
workflows ([#878 ](https://github.com/chopratejas/headroom/issues/878 ))
([b716c8c ](b716c8c2ee ))
* **ci:** pin cosign-installer to v3 (v4 does not exist)
([#774 ](https://github.com/chopratejas/headroom/issues/774 ))
([199d693 ](199d693f98 ))
* **codex:** respect CODEX_HOME for wrap config
([#731 ](https://github.com/chopratejas/headroom/issues/731 ))
([96abf38 ](96abf38b09 ))
* **content_router:** guard against empty compression output causing
Anthropic 400
([#771 ](https://github.com/chopratejas/headroom/issues/771 ))
([2f9ff07 ](2f9ff07e6c ))
* **copilot:** use responses API for subscription reasoning models
([#647 ](https://github.com/chopratejas/headroom/issues/647 ))
([84ac332 ](84ac332d14 ))
* correct preserved-entry index mapping in Gemini content round-trip
([#836 ](https://github.com/chopratejas/headroom/issues/836 ))
([0ffe2b6 ](0ffe2b6ea4 ))
* **dashboard:** stable 'Proxy $ Saved' hero tile under --workers > 1
([#481 ](https://github.com/chopratejas/headroom/issues/481 ))
([fd73b88 ](fd73b88368 ))
* don't inject empty tools:[] when client omitted the tools field
([#772 ](https://github.com/chopratejas/headroom/issues/772 ))
([574bbae ](574bbae2cb ))
* harden Copilot API auth token handling
([#557 ](https://github.com/chopratejas/headroom/issues/557 ))
([6b0c09f ](6b0c09ffd5 ))
* **health:** readyz verifies upstream connectivity, not just process
liveness ([#744 ](https://github.com/chopratejas/headroom/issues/744 ))
([5dfb446 ](5dfb446da1 ))
* **init:** guard persistent task startup
([#616 ](https://github.com/chopratejas/headroom/issues/616 ))
([9252d85 ](9252d852c5 ))
* **init:** normalize Windows hook paths to forward slashes
([#788 ](https://github.com/chopratejas/headroom/issues/788 ))
([6ea6e31 ](6ea6e31f09 ))
* **init:** suppress hook recovery output
([#760 ](https://github.com/chopratejas/headroom/issues/760 ))
([b439599 ](b4395993ae ))
* **learn:** claude-cli streams output with idle timeout
([#373 ](https://github.com/chopratejas/headroom/issues/373 ))
([9bff575 ](9bff5752bb ))
* make headroom wrap readiness probe timeout configurable for slow ML
imports ([#581 ](https://github.com/chopratejas/headroom/issues/581 ))
([163677b ](163677b405 ))
* **parser:** detect waste signals in Anthropic tool_result content
blocks ([#815 ](https://github.com/chopratejas/headroom/issues/815 ))
([929698a ](929698af10 ))
* **proxy:** F4 — trust X-Forwarded-* only behind allow-listed gateway
([d10bd5f ](d10bd5f59c ))
* **proxy:** lazy-import server to avoid fastapi crash
([#442 ](https://github.com/chopratejas/headroom/issues/442 ))
([93c6937 ](93c69372e6 ))
* **proxy:** make CCR multi-worker warning conditional on backend
([#770 ](https://github.com/chopratejas/headroom/issues/770 ))
([d76a729 ](d76a7296df ))
* **proxy:** make Kompress eager preload cache-only so a cold cache
can't block startup
([#783 ](https://github.com/chopratejas/headroom/issues/783 ))
([841663d ](841663da16 ))
* **proxy:** restore Codex usage headers on WS and streaming SSE
transports ([#577 ](https://github.com/chopratejas/headroom/issues/577 ))
([#794 ](https://github.com/chopratejas/headroom/issues/794 ))
([0ce68de ](0ce68dedd7 ))
* schema compaction must not drop property names that match DROP_KEYS
([#785 ](https://github.com/chopratejas/headroom/issues/785 ))
([ae2122f ](ae2122fda8 ))
* **security:** block DNS-rebinding on /debug/* and /stats/reset via
Host-header allowlist
([#605 ](https://github.com/chopratejas/headroom/issues/605 ))
([b4b5025 ](b4b50253f1 ))
* **ssl:** upstream httpx client inherits SSL_CERT_FILE,
REQUESTS_CA_BUNDLE, NODE_EXTRA_CA_CERTS
([#745 ](https://github.com/chopratejas/headroom/issues/745 ))
([e50fbb3 ](e50fbb3e0d ))
* suppress LiteLLM provider banner before import
([#874 ](https://github.com/chopratejas/headroom/issues/874 ))
([f9384ef ](f9384ef4b7 ))
* **transforms:** use thread-local tree-sitter parsers to prevent pyo3
Unsendable panic
([#604 ](https://github.com/chopratejas/headroom/issues/604 ))
([2ad300a ](2ad300aff8 ))
* **wrap:** track shared proxy clients with markers
([#877 ](https://github.com/chopratejas/headroom/issues/877 ))
([05bd56b ](05bd56bcb6 ))
### Code Refactoring
* extract litellm model resolution to shared utility
([ec7d006 ](ec7d0065cc ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-11 22:18:46 -08:00
github-actions[bot]
01762b1ec7
chore: release main ( #607 )
...
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-06-08 11:21:23 -07:00
github-actions[bot]
f7c2552264
chore: release main
2026-06-04 14:05:56 +00:00
github-actions[bot]
cc71e07d01
chore: release main
2026-05-26 03:54:25 +00:00
chopratejas
8e4ab187e9
ci(release): align manifest + pyproject + package.json to 0.22.3
...
The repo had drifted: pyproject.toml said 0.9.1 but PyPI's latest
published headroom-ai was 0.22.3. release_version.py papered over
this by taking max(canonical, latest_tag) at release time;
release-please does NOT do that — it trusts the manifest verbatim.
Left as-is, release-please would propose 0.9.2 on the next merge
and PyPI would reject it ("400 Cannot publish version lower than
latest"), looping the bot forever.
Fix: align every version-bearing file to 0.22.3 (the truth on
PyPI). Done via `scripts/version-sync.py --version 0.22.3`:
- .release-please-manifest.json
- pyproject.toml
- sdk/typescript/package.json
- plugins/openclaw/package.json (+ headroom-ai dep range -> ^0.22.3)
- .claude-plugin/marketplace.json
- .github/plugin/marketplace.json
- plugins/headroom-agent-hooks/.claude-plugin/plugin.json
- plugins/headroom-agent-hooks/.github/plugin/plugin.json
After this lands, the bot's next release PR will propose 0.22.4
(patch) or 0.23.0 (minor) depending on conventional-commit traffic
since v0.22.3.
2026-05-25 18:41:38 -07:00
dependabot[bot]
2f659535d2
chore(deps): bump the npm_and_yarn group across 3 directories with 4 updates
...
Bumps the npm_and_yarn group with 1 update in the /sdk/typescript directory: [esbuild](https://github.com/evanw/esbuild ).
Bumps the npm_and_yarn group with 1 update in the /plugins/openclaw directory: [esbuild](https://github.com/evanw/esbuild ).
Bumps the npm_and_yarn group with 2 updates in the /docs directory: [postcss](https://github.com/postcss/postcss ) and [next](https://github.com/vercel/next.js ).
Updates `esbuild` from 0.21.5 to 0.27.4
- [Release notes](https://github.com/evanw/esbuild/releases )
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md )
- [Commits](https://github.com/evanw/esbuild/compare/v0.21.5...v0.27.4 )
Updates `postcss` from 8.5.8 to 8.5.10
- [Release notes](https://github.com/postcss/postcss/releases )
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md )
- [Commits](https://github.com/postcss/postcss/compare/8.5.8...8.5.10 )
Updates `vite` from 5.4.21 to 8.0.10
- [Release notes](https://github.com/vitejs/vite/releases )
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md )
- [Commits](https://github.com/vitejs/vite/commits/v8.0.10/packages/vite )
Updates `esbuild` from 0.21.5 to 0.27.4
- [Release notes](https://github.com/evanw/esbuild/releases )
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md )
- [Commits](https://github.com/evanw/esbuild/compare/v0.21.5...v0.27.4 )
Updates `postcss` from 8.5.8 to 8.5.10
- [Release notes](https://github.com/postcss/postcss/releases )
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md )
- [Commits](https://github.com/postcss/postcss/compare/8.5.8...8.5.10 )
Updates `vite` from 5.4.21 to 8.0.10
- [Release notes](https://github.com/vitejs/vite/releases )
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md )
- [Commits](https://github.com/vitejs/vite/commits/v8.0.10/packages/vite )
Updates `postcss` from 8.5.8 to 8.5.10
- [Release notes](https://github.com/postcss/postcss/releases )
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md )
- [Commits](https://github.com/postcss/postcss/compare/8.5.8...8.5.10 )
Updates `next` from 16.2.2 to 16.2.4
- [Release notes](https://github.com/vercel/next.js/releases )
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js )
- [Commits](https://github.com/vercel/next.js/compare/v16.2.2...v16.2.4 )
---
updated-dependencies:
- dependency-name: esbuild
dependency-version: 0.27.4
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: postcss
dependency-version: 8.5.10
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: vite
dependency-version: 8.0.10
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: esbuild
dependency-version: 0.27.4
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: postcss
dependency-version: 8.5.10
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: vite
dependency-version: 8.0.10
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: postcss
dependency-version: 8.5.10
dependency-type: direct:development
dependency-group: npm_and_yarn
- dependency-name: next
dependency-version: 16.2.4
dependency-type: direct:production
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-24 22:15:53 +00:00
JerrettDavis
91c5835852
chore: bump openclaw plugin version
2026-04-15 19:09:29 -05:00
JerrettDavis
6e69c4ef2c
Add OpenClaw hook shim for local link installs
2026-04-06 21:28:59 -05:00
JerrettDavis
95f7a0b74e
Fix OpenClaw dist plugin installs
2026-04-06 21:21:23 -05:00
JerrettDavis
89f3e5f01f
fix(openclaw): proxyPort only applies to local URLs, consistency pass
...
- proxyPort default (8787) now only applied to local URLs; remote URLs
use their protocol default (80/443) as expected
- Remove redundant localhost-only entries from network capabilities
(covered by http://*:* and https://*:* wildcards)
- Sync package.json capabilities with openclaw.plugin.json
- Export isLocalProxyUrl from barrel index
- Fix JSDoc indentation in start() method
- Rename "Required Proxy Setup" to "Manual Proxy Setup" with accurate
description for remote proxy users
- Clarify autoStart description: local-only, ignored for remote
- Add test: remote URL does not get proxyPort applied
Build: tsc clean, 30 tests passed
2026-04-03 10:30:10 -05:00
JerrettDavis
777ffeb716
Add controlled proxy autostart and unsafe-install guidance
2026-04-02 21:47:27 -05:00
JerrettDavis
205ec54df2
Harden openclaw plugin proxy handling and metadata
2026-04-02 21:27:12 -05:00
chopratejas
a1cd1c16dc
Rename plugin to headroom-openclaw (npm scope not available)
2026-03-28 23:55:39 -07:00
chopratejas
a41c7f0c89
OpenClaw plugin fixes, telemetry fix, cost tracker improvement, tokenBudget support
...
OpenClaw plugin:
- Fix assistant content always returned as array (fixes flatMap crash)
- Clean up debug logging, restore clean plugin entry point
- Add test for text-only assistant round-trip
- Set headroom-ai dependency to npm (not local path)
Telemetry:
- Switch from sb_publishable_ to JWT anon key (PostgREST needs JWT for RLS)
- Switch from upsert to plain INSERT (anon role upsert was failing with 42501)
- Verified: full payload with all JSONB columns writes successfully (201)
Cost tracker:
- Use output_buffer instead of hardcoded 500 for cost estimation in client.py
- CostTracker counterfactual: value removed tokens at avg effective $/token
(actual_spend / billed_tokens) instead of uncached list price — aligns
savings with real billing mix (cache reads, writes, uncached)
- Add debug log for /stats summary payload
- Add 3 tests for new cost savings calculation
TypeScript SDK:
- Add tokenBudget param to compress(), HeadroomClient, CompressOptions
- Proxy /v1/compress accepts optional token_budget to override model limit
2026-03-28 23:46:03 -07:00
chopratejas
053c4a06af
feat: add OpenClaw ContextEngine plugin (@headroom-ai/openclaw)
...
- HeadroomContextEngine: implements ContextEngine interface (bootstrap, ingest,
assemble, compact, afterTurn, prepareSubagentSpawn, dispose)
- ProxyManager: auto-detects running proxy or spawns one as child process,
health checks, restart on crash, graceful shutdown
- AgentMessage ↔ OpenAI format conversion (user, assistant/tool_use, toolResult)
- headroom_retrieve CCR tool: agent can retrieve original uncompressed content
- Plugin manifest (openclaw.plugin.json) with config schema
- 11 tests (6 unit + 5 integration), all passing
- Integration tested: 100 servers compressed, 3,735 tokens saved (82%)
2026-03-28 13:43:40 -07:00