Commit graph

62 commits

Author SHA1 Message Date
dependabot[bot]
c6dd823384
deps: bump md-5 from 0.10.6 to 0.11.0 (#3146)
Bumps [md-5](https://github.com/RustCrypto/hashes) from 0.10.6 to
0.11.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b5051e5a5e"><code>b5051e5</code></a>
Cut new releases (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/812">#812</a>)</li>
<li><a
href="451c446d28"><code>451c446</code></a>
md5: replace <code>force-soft</code> crate feature with
<code>md5_backend</code> configuration flag...</li>
<li><a
href="2f00175af9"><code>2f00175</code></a>
Release sha1 v0.11.0 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/810">#810</a>)</li>
<li><a
href="07d370c4a0"><code>07d370c</code></a>
sha1: refactor backends selection (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/808">#808</a>)</li>
<li><a
href="7c7cb76e8a"><code>7c7cb76</code></a>
Fix md5 project link in README (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/809">#809</a>)</li>
<li><a
href="ffe093984c"><code>ffe0939</code></a>
Release sha2 0.11.0 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/806">#806</a>)</li>
<li><a
href="8991b65fe4"><code>8991b65</code></a>
Use the standard order of the <code>[package]</code> section fields (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/807">#807</a>)</li>
<li><a
href="3d2bc57db4"><code>3d2bc57</code></a>
sha2: refactor backends (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/802">#802</a>)</li>
<li><a
href="faa55fb836"><code>faa55fb</code></a>
sha3: bump <code>keccak</code> to v0.2 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/803">#803</a>)</li>
<li><a
href="d3e6489e56"><code>d3e6489</code></a>
sha3 v0.11.0-rc.9 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/801">#801</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/RustCrypto/hashes/compare/md-5-v0.10.6...md2-v0.11.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=md-5&package-manager=cargo&previous-version=0.10.6&new-version=0.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-08-20 21:32:09 -05:00
dependabot[bot]
9c14e3aa95
deps: bump the cargo-minor-patch group with 8 updates (#3145)
Bumps the cargo-minor-patch group with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [aws-config](https://github.com/smithy-lang/smithy-rs) | `1.10.0` |
`1.10.1` |
| [rusqlite](https://github.com/rusqlite/rusqlite) | `0.40.1` | `0.40.2`
|
| [uuid](https://github.com/uuid-rs/uuid) | `1.24.0` | `1.24.1` |
| [futures](https://github.com/rust-lang/futures-rs) | `0.3.33` |
`0.3.34` |
| [futures-util](https://github.com/rust-lang/futures-rs) | `0.3.33` |
`0.3.34` |
| [http-body-util](https://github.com/hyperium/http-body) | `0.1.4` |
`0.1.5` |
| [async-trait](https://github.com/dtolnay/async-trait) | `0.1.91` |
`0.1.92` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.4.1` | `1.4.3` |

Updates `aws-config` from 1.10.0 to 1.10.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `rusqlite` from 0.40.1 to 0.40.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rusqlite/rusqlite/releases">rusqlite's
releases</a>.</em></p>
<blockquote>
<h2>0.40.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Lower MSRV to 1.88.0</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/rusqlite/rusqlite/compare/v0.40.1...v0.40.2">https://github.com/rusqlite/rusqlite/compare/v0.40.1...v0.40.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e88f112bef"><code>e88f112</code></a>
Prepare release</li>
<li><a
href="d11c76e7d7"><code>d11c76e</code></a>
Update main.yml</li>
<li><a
href="c922ca5b71"><code>c922ca5</code></a>
Lower MSRV to 1.88.0</li>
<li>See full diff in <a
href="https://github.com/rusqlite/rusqlite/compare/v0.40.1...v0.40.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `uuid` from 1.24.0 to 1.24.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/uuid-rs/uuid/releases">uuid's
releases</a>.</em></p>
<blockquote>
<h2>v1.24.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix non-ASCII character handling in parse diagnostics by <a
href="https://github.com/questfever"><code>@​questfever</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/899">uuid-rs/uuid#899</a></li>
<li>Prepare for 1.24.1 release by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/900">uuid-rs/uuid#900</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/questfever"><code>@​questfever</code></a> made
their first contribution in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/899">uuid-rs/uuid#899</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/uuid-rs/uuid/compare/v1.24.0...v1.24.1">https://github.com/uuid-rs/uuid/compare/v1.24.0...v1.24.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2ea38af9f2"><code>2ea38af</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/900">#900</a> from
uuid-rs/cargo/v1.24.1</li>
<li><a
href="9dbeb04a43"><code>9dbeb04</code></a>
prepare for 1.24.1 release</li>
<li><a
href="e113df8c8f"><code>e113df8</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/899">#899</a> from
questfever/main</li>
<li><a
href="b0177659b3"><code>b017765</code></a>
Fix non-ASCII character handling in parse diagnostics</li>
<li>See full diff in <a
href="https://github.com/uuid-rs/uuid/compare/v1.24.0...v1.24.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `futures` from 0.3.33 to 0.3.34
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/releases">futures's
releases</a>.</em></p>
<blockquote>
<h2>0.3.34</h2>
<ul>
<li>Preserve cloned waker identity. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3032">#3032</a>)</li>
<li>Updato <code>syn</code> to 3. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3028">#3028</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md">futures's
changelog</a>.</em></p>
<blockquote>
<h1>0.3.34 - 2026-08-11</h1>
<ul>
<li>Preserve cloned waker identity. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3032">#3032</a>)</li>
<li>Updato <code>syn</code> to 3. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3028">#3028</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="705e6b5c0f"><code>705e6b5</code></a>
Release 0.3.34</li>
<li><a
href="616dac7bf9"><code>616dac7</code></a>
compat: Inline RawWaker clone function</li>
<li><a
href="41763693ee"><code>4176369</code></a>
Inline remaining RawWaker clone functions</li>
<li><a
href="f17a8957d9"><code>f17a895</code></a>
Fix cloned FuturesUnordered waker identity</li>
<li><a
href="51d62ada9b"><code>51d62ad</code></a>
macro: bump <code>syn</code> to v3 (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3028">#3028</a>)</li>
<li><a
href="9e26177cf0"><code>9e26177</code></a>
ci: Reduce timeout-minutes</li>
<li><a
href="b2d0983317"><code>b2d0983</code></a>
tsan: Enable Adaptive Delay</li>
<li><a
href="f733d0ea9f"><code>f733d0e</code></a>
Miri: Ignore compat tests</li>
<li><a
href="e5def2f60c"><code>e5def2f</code></a>
Rename default branch to main</li>
<li>See full diff in <a
href="https://github.com/rust-lang/futures-rs/compare/0.3.33...0.3.34">compare
view</a></li>
</ul>
</details>
<br />

Updates `futures-util` from 0.3.33 to 0.3.34
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/releases">futures-util's
releases</a>.</em></p>
<blockquote>
<h2>0.3.34</h2>
<ul>
<li>Preserve cloned waker identity. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3032">#3032</a>)</li>
<li>Updato <code>syn</code> to 3. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3028">#3028</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md">futures-util's
changelog</a>.</em></p>
<blockquote>
<h1>0.3.34 - 2026-08-11</h1>
<ul>
<li>Preserve cloned waker identity. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3032">#3032</a>)</li>
<li>Updato <code>syn</code> to 3. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3028">#3028</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="705e6b5c0f"><code>705e6b5</code></a>
Release 0.3.34</li>
<li><a
href="616dac7bf9"><code>616dac7</code></a>
compat: Inline RawWaker clone function</li>
<li><a
href="41763693ee"><code>4176369</code></a>
Inline remaining RawWaker clone functions</li>
<li><a
href="f17a8957d9"><code>f17a895</code></a>
Fix cloned FuturesUnordered waker identity</li>
<li><a
href="51d62ada9b"><code>51d62ad</code></a>
macro: bump <code>syn</code> to v3 (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3028">#3028</a>)</li>
<li><a
href="9e26177cf0"><code>9e26177</code></a>
ci: Reduce timeout-minutes</li>
<li><a
href="b2d0983317"><code>b2d0983</code></a>
tsan: Enable Adaptive Delay</li>
<li><a
href="f733d0ea9f"><code>f733d0e</code></a>
Miri: Ignore compat tests</li>
<li><a
href="e5def2f60c"><code>e5def2f</code></a>
Rename default branch to main</li>
<li>See full diff in <a
href="https://github.com/rust-lang/futures-rs/compare/0.3.33...0.3.34">compare
view</a></li>
</ul>
</details>
<br />

Updates `http-body-util` from 0.1.4 to 0.1.5
<details>
<summary>Commits</summary>
<ul>
<li><a
href="07838bd97b"><code>07838bd</code></a>
http-body-util v0.1.5</li>
<li><a
href="612118cc69"><code>612118c</code></a>
docs: migrate from doc_auto_cfg to doc_cfg (<a
href="https://redirect.github.com/hyperium/http-body/issues/175">#175</a>)</li>
<li>See full diff in <a
href="https://github.com/hyperium/http-body/compare/http-body-util-v0.1.4...http-body-util-v0.1.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `async-trait` from 0.1.91 to 0.1.92
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/async-trait/releases">async-trait's
releases</a>.</em></p>
<blockquote>
<h2>0.1.92</h2>
<ul>
<li>Resolve double_must_use clippy lint in generated code (<a
href="https://redirect.github.com/dtolnay/async-trait/issues/303">#303</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="82e7e9edd6"><code>82e7e9e</code></a>
Release 0.1.92</li>
<li><a
href="9a35cb87f9"><code>9a35cb8</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/async-trait/issues/303">#303</a>
from dtolnay/mustuse</li>
<li><a
href="875ceecb10"><code>875ceec</code></a>
Resolve double_must_use clippy lint</li>
<li><a
href="62993a57bc"><code>62993a5</code></a>
Raise minimum tested compiler to rust 1.88</li>
<li>See full diff in <a
href="https://github.com/dtolnay/async-trait/compare/0.1.91...0.1.92">compare
view</a></li>
</ul>
</details>
<br />

Updates `cc` from 1.4.1 to 1.4.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/releases">cc's
releases</a>.</em></p>
<blockquote>
<h2>cc-v1.4.3</h2>
<h3>Other</h3>
<ul>
<li>Update MSRV to 1.65 (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1834">#1834</a>)</li>
<li>Regenerate target info (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1848">#1848</a>)</li>
</ul>
<h2>cc-v1.4.2</h2>
<h3>Fixed</h3>
<ul>
<li>Infer NEON, not VFPv4, from <code>neon</code> in the target name (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1843">#1843</a>)</li>
<li>do not emit <code>-mno-omit-leaf-frame-pointer</code> if unsupported
(<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1845">#1845</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md">cc's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.4.2...cc-v1.4.3">1.4.3</a>
- 2026-08-14</h2>
<h3>Other</h3>
<ul>
<li>Update MSRV to 1.65 (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1834">#1834</a>)</li>
<li>Regenerate target info (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1848">#1848</a>)</li>
</ul>
<h2><a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.4.1...cc-v1.4.2">1.4.2</a>
- 2026-08-08</h2>
<h3>Fixed</h3>
<ul>
<li>Infer NEON, not VFPv4, from <code>neon</code> in the target name (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1843">#1843</a>)</li>
<li>do not emit <code>-mno-omit-leaf-frame-pointer</code> if unsupported
(<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1845">#1845</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3c4ab88361"><code>3c4ab88</code></a>
chore: release (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1858">#1858</a>)</li>
<li><a
href="951c5f5458"><code>951c5f5</code></a>
cc-test: add loongarch64 assembly shim (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1855">#1855</a>)</li>
<li><a
href="60e2e0054d"><code>60e2e00</code></a>
chore(deps): bump Swatinem/rust-cache from 2.9.1 to 2.9.2 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1853">#1853</a>)</li>
<li><a
href="cdb470173f"><code>cdb4701</code></a>
ci: replace rustup installation with
actions-rust-lang/setup-rust-toolchain (...</li>
<li><a
href="3af3b8decd"><code>3af3b8d</code></a>
cargo: use workspace inheritance (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1850">#1850</a>)</li>
<li><a
href="6df6471c06"><code>6df6471</code></a>
cargo: convert to workspace lints (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1849">#1849</a>)</li>
<li><a
href="36efa48bf7"><code>36efa48</code></a>
Update MSRV to 1.65 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1834">#1834</a>)</li>
<li><a
href="59170f958c"><code>59170f9</code></a>
Regenerate target info (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1848">#1848</a>)</li>
<li><a
href="7fa314c661"><code>7fa314c</code></a>
ci: run clippy in more cases (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1832">#1832</a>)</li>
<li><a
href="a91e05ec40"><code>a91e05e</code></a>
chore(cc): release v1.4.2 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1846">#1846</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.4.1...cc-v1.4.3">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-20 20:40:50 -05:00
dependabot[bot]
a307c11109
deps: bump tiktoken-rs from 0.11.0 to 0.12.0 (#3147)
Bumps [tiktoken-rs](https://github.com/zurawiki/tiktoken-rs) from 0.11.0
to 0.12.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/zurawiki/tiktoken-rs/releases">tiktoken-rs's
releases</a>.</em></p>
<blockquote>
<h2>v0.12.0</h2>
<h2>Summary</h2>
<p>This release backports OpenAI <code>tiktoken</code> 0.13.0 into
<code>tiktoken-rs</code>. The main reason to upgrade is better alignment
with upstream tokenization behavior, especially the upstream Rust core
changes for large BPE pieces and error-aware encoding.</p>
<p>For most users who call the high-level model/token counting helpers,
this should behave the same aside from the new Rust compiler
requirement. Users who call lower-level <code>CoreBPE</code> encoding
methods directly should review the breaking changes below.</p>
<h2>What Changed</h2>
<ul>
<li>Backported the vendored OpenAI <code>tiktoken</code> Rust core from
0.9.0 to 0.13.0.</li>
<li>Added the upstream large-piece BPE merge path. Functionally, this
improves behavior for very large or repetitive inputs that previously
stressed the merge algorithm.</li>
<li>Changed <code>CoreBPE::encode</code> to return
<code>Result&lt;(Vec&lt;Rank&gt;, usize), EncodeError&gt;</code>,
matching upstream. Regex/tokenization failures can now be reported
instead of being hidden behind infallible APIs.</li>
<li>Updated <code>encode_as</code> and <code>count</code> to return
<code>Result</code> because they call <code>encode</code>.</li>
<li>Re-exported <code>EncodeError</code> so callers can handle encode
failures directly.</li>
<li>Aligned the vendored core with Rust 2024 and raised the crate MSRV
to Rust 1.85.</li>
<li>Synced model-to-tokenizer mappings with upstream
<code>tiktoken</code> 0.13.0 while keeping local extra prefixes
isolated.</li>
<li>Hardened asset downloads with SHA-256 checks and a repo-root-aware
asset path.</li>
</ul>
<h2>Breaking Changes</h2>
<p>If your code calls <code>CoreBPE::encode</code>, unwrap or propagate
the result before using the tokens:</p>
<pre lang="rust"><code>let allowed = bpe.special_tokens();
let (tokens, last_piece_token_len) = bpe.encode(&quot;hello
&lt;|endoftext|&gt;&quot;, &amp;allowed)?;
</code></pre>
<p>The generic helpers changed similarly:</p>
<pre lang="rust"><code>let (tokens, last_piece_token_len) =
bpe.encode_as::&lt;usize&gt;(text, &amp;allowed)?;
let token_count = bpe.count(text, &amp;allowed)?;
</code></pre>
<p><code>encode_ordinary</code>, <code>encode_ordinary_as</code>,
<code>encode_with_special_tokens</code>, and <code>count_ordinary</code>
remain infallible.</p>
<p>Projects must now build with Rust 1.85 or newer.</p>
<h2>Practical Impact</h2>
<ul>
<li>Applications processing long repeated text should see more robust
tokenization behavior.</li>
<li>Code that only uses helpers like
<code>get_chat_completion_max_tokens</code>,
<code>get_text_completion_max_tokens</code>, <code>bpe_for_model</code>,
or singleton tokenizer constructors should not need call-site
changes.</li>
<li>Code using low-level <code>CoreBPE::encode</code>,
<code>encode_as</code>, or <code>count</code> needs a small migration to
handle <code>Result</code>.</li>
</ul>
<h2>Links</h2>
<ul>
<li>PR: <a
href="https://redirect.github.com/zurawiki/tiktoken-rs/pull/164">zurawiki/tiktoken-rs#164</a></li>
<li>Upstream <code>tiktoken</code> 0.13.0: <a
href="https://github.com/openai/tiktoken/releases/tag/0.13.0">https://github.com/openai/tiktoken/releases/tag/0.13.0</a></li>
<li>Full changelog: <a
href="https://github.com/zurawiki/tiktoken-rs/compare/v0.11.0...v0.12.0">https://github.com/zurawiki/tiktoken-rs/compare/v0.11.0...v0.12.0</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="32de8dc052"><code>32de8dc</code></a>
Bump version minor to &quot;0.12.0&quot;</li>
<li><a
href="ac7e2e8b96"><code>ac7e2e8</code></a>
Backport tiktoken 0.13.0 (<a
href="https://redirect.github.com/zurawiki/tiktoken-rs/issues/164">#164</a>)</li>
<li>See full diff in <a
href="https://github.com/zurawiki/tiktoken-rs/compare/v0.11.0...v0.12.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tiktoken-rs&package-manager=cargo&previous-version=0.11.0&new-version=0.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-20 20:39:19 -05:00
dependabot[bot]
6e2e10f67a
deps: bump tokenizers from 0.22.2 to 0.23.1 (#3149)
Bumps [tokenizers](https://github.com/huggingface/tokenizers) from
0.22.2 to 0.23.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/huggingface/tokenizers/releases">tokenizers's
releases</a>.</em></p>
<blockquote>
<h2>Release v0.23.1</h2>
<h2>TL;DR</h2>
<p><code>tokenizers 0.23.1</code> is the first proper stable release in
the <code>0.23</code> line — <code>0.23.0</code> only ever shipped as
<code>rc0</code> because the release pipeline itself was broken (Node
side hadn't shipped multi-platform binaries since 2023, Python side was
on <code>pyo3 0.27</code> without free-threaded support).
<code>0.23.1</code> is the version where everything actually goes out
the door together: full Node multi-platform wheels for the first time in
years, Python 3.14 (regular <strong>and</strong> free-threaded
<code>3.14t</code>), full type hints for every Python class, and a stack
of measurable perf wins on the BPE / added-vocab hot paths.</p>
<p>There is no functional <code>0.23.0</code> published — we tag
<code>0.23.1</code> directly so users don't accidentally pull a
never-shipped version.</p>
<hr />
<h2>🚨 Breaking changes</h2>
<ul>
<li><strong>Drop Python 3.9</strong> (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/1952">#1952</a>)
— <code>requires-python = &quot;&gt;=3.10&quot;</code>; 3.9 users stay
on <code>0.22.x</code>.</li>
<li><strong><code>add_tokens</code> normalizes <code>content</code> at
insertion</strong> (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/1995">#1995</a>)
— re-saved <code>tokenizer.json</code> may differ in the
<code>added_tokens</code> block. Existing files load unchanged.</li>
<li><strong>Type stubs are precise</strong> (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/1928">#1928</a>,
<a
href="https://redirect.github.com/huggingface/tokenizers/issues/1997">#1997</a>)
— methods that returned <code>Any</code> now return real types;
<code>mypy --strict</code> may surface previously-hidden errors. Stub
layout also moved from <code>tokenizers/&lt;sub&gt;/__init__.pyi</code>
to <code>tokenizers/&lt;sub&gt;.pyi</code>. This breaks the surface of
some of the processors like <code>RobertaProcessign</code>'s
<code>__init__</code> .</li>
<li><strong>3.14t-only</strong>: setters/getters return
<code>PyResult&lt;T&gt;</code> because of
<code>Arc&lt;RwLock&lt;Tokenizer&gt;&gt;</code>; a poisoned lock
surfaces as <code>PyException</code> instead of a panic.</li>
</ul>
<hr />
<h2> Performance — measured locally on this Mac, not lifted from
PRs</h2>
<p>Run with <code>cargo bench --bench &lt;name&gt; -- --save-baseline
v0_22_2</code> on <code>v0.22.2</code>, then <code>--baseline
v0_22_2</code> on <code>v0.23.1</code>. Numbers are point-in-time wall
clock on a single laptop; relative deltas are what matters, absolute
numbers will differ on CI hardware.</p>
<h3>Added-vocabulary deserialize — the headline win (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/1995">#1995</a>,
<a
href="https://redirect.github.com/huggingface/tokenizers/issues/1999">#1999</a>)</h3>
<p><code>bench: improve added_vocab_deserialize to reflect real-world
workloads</code> (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2000">#2000</a>)
is now representative of how transformers actually loads tokenizer.json
files. The combined effect of <code>daachorse</code> for the matching
automaton plus the normalize-on-insert refactor is enormous on this
workload:</p>
<table>
<thead>
<tr>
<th>benchmark</th>
<th align="right">v0.22.2</th>
<th align="right">v0.23.1</th>
<th align="right">change</th>
</tr>
</thead>
<tbody>
<tr>
<td>100k tokens, special, no norm</td>
<td align="right">~410 ms</td>
<td align="right">248 ms</td>
<td align="right"><strong>−40%</strong></td>
</tr>
<tr>
<td>100k tokens, non-special, no norm</td>
<td align="right">~7.1 s</td>
<td align="right">273 ms</td>
<td align="right"><strong>−96%</strong></td>
</tr>
<tr>
<td>100k tokens, special, NFKC</td>
<td align="right">~395 ms</td>
<td align="right">235 ms</td>
<td align="right"><strong>−40%</strong></td>
</tr>
<tr>
<td>100k tokens, non-special, NFKC</td>
<td align="right">~7.4 s</td>
<td align="right">290 ms</td>
<td align="right"><strong>−96%</strong></td>
</tr>
<tr>
<td>400k tokens, special, no norm</td>
<td align="right">~15 s</td>
<td align="right">980 ms</td>
<td align="right"><strong>−94%</strong></td>
</tr>
</tbody>
</table>
<p>Real-world impact: loading a Llama-3-style tokenizer with a large set
of added tokens dropped from &quot;noticeable pause&quot; to
&quot;instant&quot;.</p>
<h3>BPE encode</h3>
<table>
<thead>
<tr>
<th>benchmark</th>
<th align="right">v0.22.2</th>
<th align="right">v0.23.1</th>
<th align="right">change</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>BPE GPT2 encode batch, no cache</code></td>
<td align="right">530 ms</td>
<td align="right">446 ms</td>
<td align="right"><strong>−16%</strong></td>
</tr>
<tr>
<td><code>BPE GPT2 encode batch</code> (cached)</td>
<td align="right">690 ms</td>
<td align="right">685 ms</td>
<td align="right">noise</td>
</tr>
<tr>
<td><code>BPE GPT2 encode</code> (single)</td>
<td align="right">1.95 s</td>
<td align="right">1.94 s</td>
<td align="right">noise</td>
</tr>
<tr>
<td><code>BPE Train (small)</code></td>
<td align="right">32.6 ms</td>
<td align="right">31.5 ms</td>
<td align="right">−3%</td>
</tr>
<tr>
<td><code>BPE Train (big)</code></td>
<td align="right">1.01 s</td>
<td align="right">988 ms</td>
<td align="right">−2%</td>
</tr>
</tbody>
</table>
<p>The BPE per-thread cache PR (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2028">#2028</a>)
shows much larger wins on highly-parallel workloads (+47–62% at 88+
threads on a server box, per the PR's own measurements on Vera).
Single-thread batch numbers above are flat or slightly improved because
cache-hit overhead was already low without contention.</p>
<h3>Llama-3 encode</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7f1623b90b"><code>7f1623b</code></a>
Bump version to 0.23.1</li>
<li><a
href="bbe43ad73d"><code>bbe43ad</code></a>
ci: release workflow fixes (node + python) (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2043">#2043</a>)</li>
<li><a
href="ab0c5d8fc1"><code>ab0c5d8</code></a>
Fix node release (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2034">#2034</a>)</li>
<li><a
href="decd8e07da"><code>decd8e0</code></a>
bindings/python: free-threaded Python (3.14t) support (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2041">#2041</a>)</li>
<li><a
href="3992692d48"><code>3992692</code></a>
update for release (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2033">#2033</a>)</li>
<li><a
href="bcdd25b97f"><code>bcdd25b</code></a>
BPE cache: per-thread read-through cache to avoid RwLock atomics on hits
(<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2028">#2028</a>)</li>
<li><a
href="618eb383f4"><code>618eb38</code></a>
Bump follow-redirects in /tokenizers/examples/unstable_wasm/www (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2024">#2024</a>)</li>
<li><a
href="b6b1688bef"><code>b6b1688</code></a>
chore: bump doc-builder SHA for PR upload workflow (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2025">#2025</a>)</li>
<li><a
href="19015d6b44"><code>19015d6</code></a>
fix: use uvx --with cairosvg instead of uv pip install --system (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2021">#2021</a>)</li>
<li><a
href="efbcc68e32"><code>efbcc68</code></a>
Ci benchmarks (<a
href="https://redirect.github.com/huggingface/tokenizers/issues/2019">#2019</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/huggingface/tokenizers/compare/v0.22.2...v0.23.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokenizers&package-manager=cargo&previous-version=0.22.2&new-version=0.23.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-20 20:38:54 -05:00
Tejas Chopra
93c474e84b
fix(deps): clear the two Rust advisories and make cargo audit blocking (#3121)
## Description

An independent OSV sweep of every locked package in the repo (1,463
across PyPI, crates.io and npm) surfaced three RUSTSEC advisories that
**no gate was reporting**:

| advisory | package | status |
|---|---|---|
| RUSTSEC-2026-0258 (GHSA-q83h-524g-xf6h) | h2 0.4.15 | fixed here →
0.4.16 |
| RUSTSEC-2026-0204 | crossbeam-epoch 0.9.18 | fixed here → 0.9.20 |
| RUSTSEC-2024-0436 | paste 1.0.15 | unmaintained, **no patched version
exists** |

**h2 is the one that matters.** It accepted and queued empty DATA frames
without limit; a peer that never drains a stream drives unbounded memory
growth, or a panic when the length overflows. It is not a corner of the
tree — it reaches the published wheel (`hf-hub -> headroom-core ->
headroom-py`) and the entire axum/reqwest/aws-config surface of
`headroom-proxy`.

**Why none of this was visible** is the more important half of this PR.
The `audit` job was already correct in one respect I initially misread —
the `rust-changes` job reports `rust=true` for `schedule`, so it *does*
run nightly rather than only on Rust changes. The actual defect is that
`cargo audit` was `continue-on-error: true`. It has been faithfully
reporting findings into a green run that nobody looks at.

Two of the three are also invisible to Dependabot entirely:
`crossbeam-epoch` and `paste` are RUSTSEC-only with no GHSA, so the
advisory database GitHub scans does not contain them. This job is their
only possible coverage.

## Type of Change

- [x] Bug fix (non-breaking change that fixes an issue)

## Changes Made

- `Cargo.lock`: `h2` 0.4.15 → 0.4.16, `crossbeam-epoch` 0.9.18 → 0.9.20.
Version + checksum only, 4 lines each way.
- `.github/workflows/rust.yml`: dropped `continue-on-error: true` from
the `cargo audit` step. `cargo deny check licenses` is deliberately left
soft-fail — `deny.toml` documents itself as intentionally permissive for
now, and tightening license policy is a separate decision.
- `.cargo/audit.toml` (new): lists `RUSTSEC-2024-0436` as accepted, with
the reason. Path matters — cargo-audit reads `.cargo/audit.toml`; a
root-level `audit.toml` is silently ignored.

`paste` is unmaintained rather than vulnerable, and there is nothing to
move to. It arrives via `tokenizers -> paste` and `rav1e -> paste`, both
under `fastembed`, so it is not actionable at our layer. Worth
revisiting when `tokenizers` adopts `pastey`.

## Testing

- [x] Manual testing performed

### Test Output

```text
Checksums verified against the real crates.io tarballs, not just the API field:

  OK   h2 0.4.16  (173331 bytes)
        lock : a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27
        real : a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27
  OK   crossbeam-epoch 0.9.20  (47545 bytes)
        lock : 2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f
        real : 2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f

Dependency-set equality (crates.io API, kind=normal):
  h2 0.4.15 -> 0.4.16          : 11 deps before, 11 after, identical
  crossbeam-epoch 0.9.18 -> .20:  2 deps before,  2 after, identical
```

## Real Behavior Proof

- Environment: macOS (darwin 25.4.0), worktree off `main` @ `b77d6129`.
**`cargo` is not installed on this machine** — see below.
- Exact command / steps: (1) parsed `uv.lock`, `Cargo.lock` and all four
`package-lock.json` files into 1,463 unique (ecosystem, name, version)
tuples and queried `api.osv.dev/v1/querybatch`, then pulled full records
for every hit; (2) walked `Cargo.lock` to find which workspace crates
actually reach `h2`, `crossbeam-epoch` and `paste`; (3) fetched both
crates' dependency lists from the crates.io API at the old and new
versions and compared them; (4) downloaded both `.crate` tarballs and
computed SHA-256 locally.
- Observed result: both bumps are patch-level with **byte-identical
dependency sets**, so the edited `Cargo.lock` is exactly what `cargo
update -p h2 -p crossbeam-epoch` would produce, and both checksums match
the real tarballs. `h2` 0.4.16 was published 2026-08-17, which is also
why Dependabot has not raised it yet.
- Not tested: I could not run `cargo audit`, `cargo build` or the test
suite locally — cargo is not installed here. **The lock edit is
hand-written, so CI is the real verification**, and it is well covered:
the `rust` workflow's `test`, `build`, `parity` and now-blocking `audit`
jobs all consume this lock and will fail on a bad checksum or an
unresolvable graph. I would not merge this on green-by-assertion; it
needs the `rust` jobs actually green.

## Runtime Rollout Safety

- Rollout-managed feature(s): None.
- Minimum rollout channel: n/a
- Stable/default behavior changed: No runtime behavior changes. CI
becomes stricter: `cargo audit` can now fail a build.
- Kill switch / disable path: re-adding `continue-on-error: true`
restores the previous (useless) behavior.
- Unsafe override required: No.
- Qualification impact: A newly-disclosed RUSTSEC advisory will now turn
the nightly Rust run red instead of being silently absorbed. That is the
intent, but it does mean advisories become someone's problem on
disclosure day — the escape hatch is a documented entry in
`.cargo/audit.toml`.
- Rollback path: Revert the commit.

## Review Readiness

- [x] I have performed a self-review
- [x] This PR is ready for human review

## Additional Notes

Deliberately **not** bundled here, each worth its own change:

- **`npm` has no audit gate at all** — no `npm audit` anywhere in
`.github/`. Current npm exposure is only `nanoid` 3.3.17
(GHSA-2v37-7h3g-55p8) in three lockfiles, all `dev: true`, which GitHub
auto-dismissed correctly. Low stakes today, but the gate is absent
rather than passing.
- **`pip-audit` only audits `--extra all`**, which excludes the
integration extras (`crewai`, `agno`, `autogen`, `langchain`, `strands`,
`bedrock`, `memory-stack`, `sandbox`). Every Python advisory currently
open against this repo lives in exactly that blind spot — GitPython via
`agno` (#3120), chromadb and json-repair via `crewai`. Dependabot
catches them because it scans the whole lock; the CI gate structurally
cannot.
- **Dependabot's `docker` ecosystem is configured for `directory: /`
only**, so the five non-root Dockerfiles get no base-image updates.

Co-authored-by: Tejas Chopra <tejas@Tejass-MacBook-Pro.local>
2026-08-19 14:19:46 -07:00
dependabot[bot]
322425c43b
deps: bump sha2 from 0.10.9 to 0.11.0 (#2288)
Bumps [sha2](https://github.com/RustCrypto/hashes) from 0.10.9 to
0.11.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ffe093984c"><code>ffe0939</code></a>
Release sha2 0.11.0 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/806">#806</a>)</li>
<li><a
href="8991b65fe4"><code>8991b65</code></a>
Use the standard order of the <code>[package]</code> section fields (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/807">#807</a>)</li>
<li><a
href="3d2bc57db4"><code>3d2bc57</code></a>
sha2: refactor backends (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/802">#802</a>)</li>
<li><a
href="faa55fb836"><code>faa55fb</code></a>
sha3: bump <code>keccak</code> to v0.2 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/803">#803</a>)</li>
<li><a
href="d3e6489e56"><code>d3e6489</code></a>
sha3 v0.11.0-rc.9 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/801">#801</a>)</li>
<li><a
href="bbf6f51ff9"><code>bbf6f51</code></a>
sha2: tweak backend docs (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/800">#800</a>)</li>
<li><a
href="155dbbf295"><code>155dbbf</code></a>
sha3: add default value for the <code>DS</code> generic parameter on
<code>TurboShake128/256</code>...</li>
<li><a
href="ed514f2b34"><code>ed514f2</code></a>
Use published version of <code>keccak</code> v0.2 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/799">#799</a>)</li>
<li><a
href="702bcd8373"><code>702bcd8</code></a>
Migrate to closure-based <code>keccak</code> (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/796">#796</a>)</li>
<li><a
href="827c043f82"><code>827c043</code></a>
sha3 v0.11.0-rc.8 (<a
href="https://redirect.github.com/RustCrypto/hashes/issues/794">#794</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/RustCrypto/hashes/compare/sha2-v0.10.9...sha2-v0.11.0">compare
view</a></li>
</ul>
</details>
<br />

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-08-14 16:40:45 -05:00
dependabot[bot]
5731be7e68
deps: bump axum from 0.7.9 to 0.8.9 (#2966)
Bumps [axum](https://github.com/tokio-rs/axum) from 0.7.9 to 0.8.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/axum/releases">axum's
releases</a>.</em></p>
<blockquote>
<h2>axum-v0.8.9</h2>
<ul>
<li><strong>added:</strong>
<code>WebSocketUpgrade::{requested_protocols,
set_selected_protocol}</code> for more flexible subprotocol selection
(<a
href="https://redirect.github.com/tokio-rs/axum/issues/3597">#3597</a>)</li>
<li><strong>changed:</strong> Update minimum rust version to 1.80 (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3620">#3620</a>)</li>
<li><strong>fixed:</strong> Set connect endpoint on correct field in
MethodRouter (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3656">#3656</a>)</li>
<li><strong>fixed:</strong> Return specific error message when multipart
body limit is exceeded (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3611">#3611</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/axum/issues/3597">#3597</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3597">tokio-rs/axum#3597</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3620">#3620</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3620">tokio-rs/axum#3620</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3656">#3656</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3656">tokio-rs/axum#3656</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3611">#3611</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3611">tokio-rs/axum#3611</a></p>
<h2>axum v0.8.8</h2>
<ul>
<li>Clarify documentation for <code>Router::route_layer</code> (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3567">#3567</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/axum/issues/3567">#3567</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3567">tokio-rs/axum#3567</a></p>
<h2>axum v0.8.7</h2>
<ul>
<li>Relax implicit <code>Send</code> / <code>Sync</code> bounds on
<code>RouterAsService</code>, <code>RouterIntoService</code> (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3555">#3555</a>)</li>
<li>Make it easier to visually scan for default features (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3550">#3550</a>)</li>
<li>Fix some documentation typos</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/axum/issues/3550">#3550</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3550">tokio-rs/axum#3550</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3555">#3555</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3555">tokio-rs/axum#3555</a></p>
<h2>axum v0.8.5</h2>
<ul>
<li><strong>fixed:</strong> Reject JSON request bodies with trailing
characters after the JSON document (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3453">#3453</a>)</li>
<li><strong>added:</strong> Implement <code>OptionalFromRequest</code>
for <code>Multipart</code> (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3220">#3220</a>)</li>
<li><strong>added:</strong> Getter methods <code>Location::{status_code,
location}</code></li>
<li><strong>added:</strong> Support for writing arbitrary binary data
into server-sent events (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3425">#3425</a>)]</li>
<li><strong>added:</strong>
<code>middleware::ResponseAxumBodyLayer</code> for mapping response body
to <code>axum::body::Body</code> (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3469">#3469</a>)</li>
<li><strong>added:</strong> <code>impl FusedStream for WebSocket</code>
(<a
href="https://redirect.github.com/tokio-rs/axum/issues/3443">#3443</a>)</li>
<li><strong>changed:</strong> The <code>sse</code> module and
<code>Sse</code> type no longer depend on the <code>tokio</code> feature
(<a
href="https://redirect.github.com/tokio-rs/axum/issues/3154">#3154</a>)</li>
<li><strong>changed:</strong> If the location given to one of
<code>Redirect</code>s constructors is not a valid header value, instead
of panicking on construction, the <code>IntoResponse</code> impl now
returns an HTTP 500, just like <code>Json</code> does when serialization
fails (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3377">#3377</a>)</li>
<li><strong>changed:</strong> Update minimum rust version to 1.78 (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3412">#3412</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/axum/issues/3154">#3154</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3154">tokio-rs/axum#3154</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3220">#3220</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3220">tokio-rs/axum#3220</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3377">#3377</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3377">tokio-rs/axum#3377</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3412">#3412</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3412">tokio-rs/axum#3412</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3425">#3425</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3425">tokio-rs/axum#3425</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3443">#3443</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3443">tokio-rs/axum#3443</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3453">#3453</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3453">tokio-rs/axum#3453</a>
<a
href="https://redirect.github.com/tokio-rs/axum/issues/3469">#3469</a>:
<a
href="https://redirect.github.com/tokio-rs/axum/pull/3469">tokio-rs/axum#3469</a></p>
<h2>axum v0.8.4</h2>
<ul>
<li><strong>added:</strong> <code>Router::reset_fallback</code> (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3320">#3320</a>)</li>
<li><strong>added:</strong>
<code>WebSocketUpgrade::selected_protocol</code> (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3248">#3248</a>)</li>
<li><strong>fixed:</strong> Panic location for overlapping method routes
(<a
href="https://redirect.github.com/tokio-rs/axum/issues/3319">#3319</a>)</li>
<li><strong>fixed:</strong> Don't leak a tokio task when using
<code>serve</code> without graceful shutdown (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3129">#3129</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c59208c86f"><code>c59208c</code></a>
revert axum-core changelog changes</li>
<li><a
href="99068f5a4b"><code>99068f5</code></a>
Revert &quot;Fix <code>IntoResponse</code> for tuples overriding error
response codes (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3603">#3603</a>)&quot;</li>
<li><a
href="23d7098691"><code>23d7098</code></a>
Revert &quot;axum-core 0.5.6&quot;</li>
<li><a
href="e8a39ad416"><code>e8a39ad</code></a>
axum-macros 0.5.1</li>
<li><a
href="6e9a249a4f"><code>6e9a249</code></a>
axum-extra 0.12.6</li>
<li><a
href="0ec9041a1b"><code>0ec9041</code></a>
axum 0.8.9</li>
<li><a
href="c3fcebb38f"><code>c3fcebb</code></a>
axum-core 0.5.6</li>
<li><a
href="a8790fc29b"><code>a8790fc</code></a>
update release notes</li>
<li><a
href="26ba7bb6f2"><code>26ba7bb</code></a>
docs: consolidate state management docs in crate root (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3683">#3683</a>)</li>
<li><a
href="9fc59efc1f"><code>9fc59ef</code></a>
Update to tokio-tungstenite 0.29 (<a
href="https://redirect.github.com/tokio-rs/axum/issues/3689">#3689</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tokio-rs/axum/compare/axum-v0.7.9...axum-v0.8.9">compare
view</a></li>
</ul>
</details>
<br />

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-08-14 16:39:31 -05:00
dependabot[bot]
bbe901319d
deps: bump tokio-tungstenite from 0.24.0 to 0.30.0 (#2967)
Bumps [tokio-tungstenite](https://github.com/snapview/tokio-tungstenite)
from 0.24.0 to 0.30.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/snapview/tokio-tungstenite/blob/master/CHANGELOG.md">tokio-tungstenite's
changelog</a>.</em></p>
<blockquote>
<h1>0.30.0</h1>
<ul>
<li>Update <code>tungstenite</code> to <code>0.30.0</code>. See <a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md"><code>tungstenite</code>
release</a>.</li>
</ul>
<h1>0.29.0</h1>
<ul>
<li>Update <code>tungstenite</code> to <code>0.29.0</code>. See <a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md"><code>tungstenite</code>
release</a>.</li>
</ul>
<h1>0.28.0</h1>
<ul>
<li>Update <code>tungstenite</code> to <code>0.28.0</code>. See <a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md"><code>tungstenite</code>
release</a>.</li>
</ul>
<h1>0.27.0</h1>
<ul>
<li>See <a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md#0270">performance
updates in <code>tungstenite-rs</code></a>.</li>
</ul>
<h1>0.26.2</h1>
<ul>
<li>Update <code>tungstenite</code>, see <a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md#0262">changes
here</a>.</li>
</ul>
<h1>0.26.1</h1>
<ul>
<li>Update <code>tungstenite</code> to address an issue that might cause
UB in certain cases.</li>
</ul>
<h1>0.26.0</h1>
<ul>
<li>Update <code>tungstenite</code> to <code>0.26.0</code> (<a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md#0260">breaking
changes</a>).</li>
</ul>
<h1>0.25.0</h1>
<ul>
<li>Update <code>tungstenite</code> to <code>0.25.0</code> (<a
href="https://github.com/snapview/tungstenite-rs/blob/master/CHANGELOG.md#0250">important
updates!</a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4994a07803"><code>4994a07</code></a>
Bump version</li>
<li><a
href="753ca72690"><code>753ca72</code></a>
Document cancel safety of reading from WebSocketStream (<a
href="https://redirect.github.com/snapview/tokio-tungstenite/issues/378">#378</a>)</li>
<li><a
href="751d7e2bc2"><code>751d7e2</code></a>
Update version number listed in Readme (<a
href="https://redirect.github.com/snapview/tokio-tungstenite/issues/375">#375</a>)</li>
<li><a
href="57fc3d0276"><code>57fc3d0</code></a>
docs(CHANGELOG.md): fix <code>tungstenite</code> versions (<a
href="https://redirect.github.com/snapview/tokio-tungstenite/issues/374">#374</a>)</li>
<li><a
href="7930ff2f82"><code>7930ff2</code></a>
Bump version</li>
<li><a
href="38d04656fe"><code>38d0465</code></a>
Update Readme (<a
href="https://redirect.github.com/snapview/tokio-tungstenite/issues/369">#369</a>)</li>
<li><a
href="35d110c24c"><code>35d110c</code></a>
Implement into_inner to get the underlying stream (<a
href="https://redirect.github.com/snapview/tokio-tungstenite/issues/367">#367</a>)</li>
<li><a
href="f3ae75d1de"><code>f3ae75d</code></a>
Update <code>tungstenite</code> version and fix bugs</li>
<li><a
href="25b544e43f"><code>25b544e</code></a>
Allow getting a reference to the shared inner stream (<a
href="https://redirect.github.com/snapview/tokio-tungstenite/issues/363">#363</a>)</li>
<li><a
href="e855f9eb8c"><code>e855f9e</code></a>
Fix errors in the examples caused by <code>Utf8Error</code></li>
<li>Additional commits viewable in <a
href="https://github.com/snapview/tokio-tungstenite/compare/v0.24.0...v0.30.0">compare
view</a></li>
</ul>
</details>
<br />

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-08-14 10:50:15 -05:00
dependabot[bot]
888a9f4e14
deps: bump the cargo-minor-patch group across 1 directory with 4 updates (#2964)
Bumps the cargo-minor-patch group with 4 updates in the / directory:
[aws-config](https://github.com/smithy-lang/smithy-rs),
[rusqlite](https://github.com/rusqlite/rusqlite),
[async-trait](https://github.com/dtolnay/async-trait) and
[cc](https://github.com/rust-lang/cc-rs).

Updates `aws-config` from 1.10.0 to 1.10.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `rusqlite` from 0.40.1 to 0.40.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rusqlite/rusqlite/releases">rusqlite's
releases</a>.</em></p>
<blockquote>
<h2>0.40.2</h2>
<h2>What's Changed</h2>
<ul>
<li>Lower MSRV to 1.88.0</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/rusqlite/rusqlite/compare/v0.40.1...v0.40.2">https://github.com/rusqlite/rusqlite/compare/v0.40.1...v0.40.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e88f112bef"><code>e88f112</code></a>
Prepare release</li>
<li><a
href="d11c76e7d7"><code>d11c76e</code></a>
Update main.yml</li>
<li><a
href="c922ca5b71"><code>c922ca5</code></a>
Lower MSRV to 1.88.0</li>
<li>See full diff in <a
href="https://github.com/rusqlite/rusqlite/compare/v0.40.1...v0.40.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `async-trait` from 0.1.91 to 0.1.92
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/async-trait/releases">async-trait's
releases</a>.</em></p>
<blockquote>
<h2>0.1.92</h2>
<ul>
<li>Resolve double_must_use clippy lint in generated code (<a
href="https://redirect.github.com/dtolnay/async-trait/issues/303">#303</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="82e7e9edd6"><code>82e7e9e</code></a>
Release 0.1.92</li>
<li><a
href="9a35cb87f9"><code>9a35cb8</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/async-trait/issues/303">#303</a>
from dtolnay/mustuse</li>
<li><a
href="875ceecb10"><code>875ceec</code></a>
Resolve double_must_use clippy lint</li>
<li><a
href="62993a57bc"><code>62993a5</code></a>
Raise minimum tested compiler to rust 1.88</li>
<li>See full diff in <a
href="https://github.com/dtolnay/async-trait/compare/0.1.91...0.1.92">compare
view</a></li>
</ul>
</details>
<br />

Updates `cc` from 1.4.1 to 1.4.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/releases">cc's
releases</a>.</em></p>
<blockquote>
<h2>cc-v1.4.2</h2>
<h3>Fixed</h3>
<ul>
<li>Infer NEON, not VFPv4, from <code>neon</code> in the target name (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1843">#1843</a>)</li>
<li>do not emit <code>-mno-omit-leaf-frame-pointer</code> if unsupported
(<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1845">#1845</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md">cc's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.4.1...cc-v1.4.2">1.4.2</a>
- 2026-08-08</h2>
<h3>Fixed</h3>
<ul>
<li>Infer NEON, not VFPv4, from <code>neon</code> in the target name (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1843">#1843</a>)</li>
<li>do not emit <code>-mno-omit-leaf-frame-pointer</code> if unsupported
(<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1845">#1845</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a91e05ec40"><code>a91e05e</code></a>
chore(cc): release v1.4.2 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1846">#1846</a>)</li>
<li><a
href="0e91755354"><code>0e91755</code></a>
fix: Infer NEON, not VFPv4, from <code>neon</code> in the target name
(<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1843">#1843</a>)</li>
<li><a
href="c20feddb4f"><code>c20fedd</code></a>
do not emit -mno-omit-leaf-frame-pointer if unsupported (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1845">#1845</a>)</li>
<li>See full diff in <a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.4.1...cc-v1.4.2">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-14 07:25:43 -05:00
dependabot[bot]
b30f339d69
deps: bump criterion from 0.5.1 to 0.8.2 (#2965)
Bumps [criterion](https://github.com/criterion-rs/criterion.rs) from
0.5.1 to 0.8.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/criterion-rs/criterion.rs/releases">criterion's
releases</a>.</em></p>
<blockquote>
<h2>criterion-plot-v0.8.2</h2>
<h3>Other</h3>
<ul>
<li>Update Readme</li>
</ul>
<h2>criterion-v0.8.2</h2>
<h3>Fixed</h3>
<ul>
<li>don't build alloca on unsupported targets</li>
</ul>
<h3>Other</h3>
<ul>
<li><em>(deps)</em> bump crate-ci/typos from 1.40.0 to 1.43.0</li>
<li>Fix panic with uniform iteration durations in benchmarks</li>
<li>Update Readme</li>
<li>Exclude development scripts from published package</li>
</ul>
<h2>criterion-plot-v0.8.1</h2>
<h3>Fixed</h3>
<ul>
<li>Typo</li>
</ul>
<h2>criterion-v0.8.1</h2>
<h3>Fixed</h3>
<ul>
<li>Homepage link</li>
</ul>
<h3>Other</h3>
<ul>
<li><em>(deps)</em> bump crate-ci/typos from 1.23.5 to 1.40.0</li>
<li><em>(deps)</em> bump jontze/action-mdbook from 3 to 4</li>
<li><em>(deps)</em> bump actions/checkout from 4 to 6</li>
</ul>
<h2>criterion-plot-v0.8.0</h2>
<p>No release notes provided.</p>
<h2>criterion-v0.8.0</h2>
<h3>BREAKING</h3>
<ul>
<li>Drop async-std support</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Bump MSRV to 1.86, stable to 1.91.1</li>
</ul>
<h3>Added</h3>
<ul>
<li>Add ability to plot throughput on summary page.</li>
<li>Add support for reporting throughput in elements and bytes -
<code>Throughput::ElementsAndBytes</code> allows the text summary to
report throughput in both units simultaneously.</li>
<li>Add alloca-based memory layout randomisation to mitigate memory
effects on measurements.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/criterion-rs/criterion.rs/blob/master/CHANGELOG.md">criterion's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/criterion-rs/criterion.rs/compare/criterion-v0.8.1...criterion-v0.8.2">0.8.2</a>
- 2026-02-04</h2>
<h3>Fixed</h3>
<ul>
<li>don't build alloca on unsupported targets</li>
</ul>
<h3>Other</h3>
<ul>
<li><em>(deps)</em> bump crate-ci/typos from 1.40.0 to 1.43.0</li>
<li>Fix panic with uniform iteration durations in benchmarks</li>
<li>Update Readme</li>
<li>Exclude development scripts from published package</li>
</ul>
<h2><a
href="https://github.com/criterion-rs/criterion.rs/compare/criterion-v0.8.0...criterion-v0.8.1">0.8.1</a>
- 2025-12-07</h2>
<h3>Fixed</h3>
<ul>
<li>Homepage link</li>
</ul>
<h3>Other</h3>
<ul>
<li><em>(deps)</em> bump crate-ci/typos from 1.23.5 to 1.40.0</li>
<li><em>(deps)</em> bump jontze/action-mdbook from 3 to 4</li>
<li><em>(deps)</em> bump actions/checkout from 4 to 6</li>
</ul>
<h2><a
href="https://github.com/criterion-rs/criterion.rs/compare/criterion-v0.7.0...criterion-v0.8.0">0.8.0</a>
- 2025-11-29</h2>
<h3>BREAKING</h3>
<ul>
<li>Drop async-std support</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Bump MSRV to 1.86, stable to 1.91.1</li>
</ul>
<h3>Added</h3>
<ul>
<li>Add ability to plot throughput on summary page.</li>
<li>Add support for reporting throughput in elements and bytes -
<code>Throughput::ElementsAndBytes</code> allows the text summary to
report throughput in both units simultaneously.</li>
<li>Add alloca-based memory layout randomisation to mitigate memory
effects on measurements.</li>
<li>Add doc comment to benchmark runner in criterion_group macro
(removes linter warnings)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix plotting NaN bug</li>
</ul>
<h3>Other</h3>
<ul>
<li>Remove Master API Docs links temporarily while we restore the docs
publishing.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7f0d745532"><code>7f0d745</code></a>
chore: release v0.8.2</li>
<li><a
href="4a467ce964"><code>4a467ce</code></a>
chore(deps): bump crate-ci/typos from 1.40.0 to 1.43.0</li>
<li><a
href="b277a75145"><code>b277a75</code></a>
Fix panic with uniform iteration durations in benchmarks</li>
<li><a
href="828af1450d"><code>828af14</code></a>
fix: don't build alloca on unsupported targets</li>
<li><a
href="b01316b76e"><code>b01316b</code></a>
Update Readme</li>
<li><a
href="4c02a3b4e5"><code>4c02a3b</code></a>
Exclude development scripts from published package</li>
<li><a
href="e4e06dfdc3"><code>e4e06df</code></a>
chore: release v0.8.1</li>
<li><a
href="aa548b9f58"><code>aa548b9</code></a>
fix: Homepage link</li>
<li><a
href="950c3b727a"><code>950c3b7</code></a>
fix: Typo</li>
<li><a
href="7e3e50c369"><code>7e3e50c</code></a>
chore(deps): bump crate-ci/typos from 1.23.5 to 1.40.0</li>
<li>Additional commits viewable in <a
href="https://github.com/criterion-rs/criterion.rs/compare/0.5.1...criterion-v0.8.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=criterion&package-manager=cargo&previous-version=0.5.1&new-version=0.8.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-13 08:54:47 -05:00
dependabot[bot]
148d8605e2
deps: bump the cargo-minor-patch group across 1 directory with 22 updates (#2916)
Bumps the cargo-minor-patch group with 21 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [serde_json](https://github.com/serde-rs/json) | `1.0.150` | `1.0.151`
|
| [thiserror](https://github.com/dtolnay/thiserror) | `2.0.18` |
`2.0.19` |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.103` | `1.0.104` |
| [clap](https://github.com/clap-rs/clap) | `4.6.2` | `4.6.6` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.52.3` | `1.53.1` |
| [pyo3](https://github.com/pyo3/pyo3) | `0.29.0` | `0.29.2` |
| [aws-config](https://github.com/smithy-lang/smithy-rs) | `1.9.0` |
`1.10.1` |
| [aws-smithy-runtime-api](https://github.com/smithy-lang/smithy-rs) |
`1.13.0` | `1.14.0` |
| [unidiff](https://github.com/messense/unidiff-rs) | `0.4.0` | `0.4.1`
|
| [aho-corasick](https://github.com/BurntSushi/aho-corasick) | `1.1.4` |
`1.1.5` |
| [toml](https://github.com/toml-rs/toml) | `1.1.3+spec-1.1.0` |
`1.1.4+spec-1.1.0` |
| [blake3](https://github.com/BLAKE3-team/BLAKE3) | `1.8.5` | `1.8.6` |
| [http](https://github.com/hyperium/http) | `1.4.2` | `1.5.0` |
| [futures](https://github.com/rust-lang/futures-rs) | `0.3.32` |
`0.3.33` |
| [hyper](https://github.com/hyperium/hyper) | `1.10.1` | `1.11.0` |
| [bytesize](https://github.com/bytesize-rs/bytesize) | `2.4.2` |
`2.7.0` |
| [tokio-util](https://github.com/tokio-rs/tokio) | `0.7.18` | `0.7.19`
|
| [lru](https://github.com/jeromefroe/lru-rs) | `0.18.1` | `0.18.2` |
| [async-trait](https://github.com/dtolnay/async-trait) | `0.1.89` |
`0.1.91` |
| [tokio-stream](https://github.com/tokio-rs/tokio) | `0.1.18` |
`0.1.19` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.67` | `1.4.1` |


Updates `serde_json` from 1.0.150 to 1.0.151
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/serde-rs/json/releases">serde_json's
releases</a>.</em></p>
<blockquote>
<h2>v1.0.151</h2>
<ul>
<li>Add RawValue::from_string_unchecked (<a
href="https://redirect.github.com/serde-rs/json/issues/1331">#1331</a>,
thanks <a
href="https://github.com/WonderLawrence"><code>@​WonderLawrence</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="de8500740c"><code>de85007</code></a>
Release 1.0.151</li>
<li><a
href="3b2b3c5f28"><code>3b2b3c5</code></a>
Merge pull request <a
href="https://redirect.github.com/serde-rs/json/issues/1331">#1331</a>
from WonderLawrence/rawvalue-from-string-unchecked</li>
<li><a
href="0406d96860"><code>0406d96</code></a>
Debug-assert well-formedness and no-whitespace in
from_string_unchecked</li>
<li><a
href="cf16f75d81"><code>cf16f75</code></a>
Add RawValue::from_string_unchecked</li>
<li><a
href="827a315bf2"><code>827a315</code></a>
Update actions/upload-artifact@v6 -&gt; v7</li>
<li><a
href="cea36a5c01"><code>cea36a5</code></a>
Update actions/checkout@v6 -&gt; v7</li>
<li>See full diff in <a
href="https://github.com/serde-rs/json/compare/v1.0.150...v1.0.151">compare
view</a></li>
</ul>
</details>
<br />

Updates `thiserror` from 2.0.18 to 2.0.19
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/thiserror/releases">thiserror's
releases</a>.</em></p>
<blockquote>
<h2>2.0.19</h2>
<ul>
<li>Update to syn 3</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e13a785433"><code>e13a785</code></a>
Release 2.0.19</li>
<li><a
href="0a0e76cc0f"><code>0a0e76c</code></a>
Update to syn 3</li>
<li><a
href="ec42ea7085"><code>ec42ea7</code></a>
Update actions/upload-artifact@v6 -&gt; v7</li>
<li><a
href="4178c4a0e1"><code>4178c4a</code></a>
Update actions/checkout@v6 -&gt; v7</li>
<li><a
href="7214e0e833"><code>7214e0e</code></a>
Ignore items_after_statements pedantic clippy lint in test</li>
<li><a
href="febcc0381f"><code>febcc03</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/thiserror/issues/451">#451</a>
from vip892766gma/maint/20260521171412</li>
<li><a
href="c50e38779d"><code>c50e387</code></a>
chore: improve thiserror maintenance path</li>
<li><a
href="d4a2507576"><code>d4a2507</code></a>
Raise minimum tested compiler to rust 1.85</li>
<li><a
href="99e8a6cd6a"><code>99e8a6c</code></a>
Unpin CI miri toolchain</li>
<li><a
href="9ac165c400"><code>9ac165c</code></a>
Pin CI miri to nightly-2026-02-11</li>
<li>Additional commits viewable in <a
href="https://github.com/dtolnay/thiserror/compare/2.0.18...2.0.19">compare
view</a></li>
</ul>
</details>
<br />

Updates `anyhow` from 1.0.103 to 1.0.104
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/anyhow/releases">anyhow's
releases</a>.</em></p>
<blockquote>
<h2>1.0.104</h2>
<ul>
<li>Update <code>syn</code> dev-dependency to version 3</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1dbe1862aa"><code>1dbe186</code></a>
Release 1.0.104</li>
<li><a
href="f6479f8e5e"><code>f6479f8</code></a>
Update to syn 3</li>
<li>See full diff in <a
href="https://github.com/dtolnay/anyhow/compare/1.0.103...1.0.104">compare
view</a></li>
</ul>
</details>
<br />

Updates `clap` from 4.6.2 to 4.6.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.6.6</h2>
<h2>[4.6.6] - 2026-08-06</h2>
<h3>Features</h3>
<ul>
<li>Add <code>Command::get_overridden_usage</code></li>
</ul>
<h2>v4.6.5</h2>
<h2>[4.6.5] - 2026-07-31</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Correctly mark which <code>value_names</code> are
optional with <code>num_args</code></li>
</ul>
<h2>v4.6.4</h2>
<h2>[4.6.4] - 2026-07-21</h2>
<h3>Internal</h3>
<ul>
<li>Update to syn v3</li>
</ul>
<h2>v4.6.3</h2>
<h2>[4.6.3] - 2026-07-20</h2>
<h3>Fixes</h3>
<ul>
<li><em>(derive)</em> Allow <code>&quot;literal&quot;.function()</code>
as attribute values</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.6.6] - 2026-08-06</h2>
<h3>Features</h3>
<ul>
<li>Add <code>Command::get_overridden_usage</code></li>
</ul>
<h2>[4.6.5] - 2026-07-31</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Correctly mark which <code>value_names</code> are
optional with <code>num_args</code></li>
</ul>
<h2>[4.6.4] - 2026-07-21</h2>
<h3>Internal</h3>
<ul>
<li>Update to syn v3</li>
</ul>
<h2>[4.6.3] - 2026-07-20</h2>
<h3>Fixes</h3>
<ul>
<li><em>(derive)</em> Allow <code>&quot;literal&quot;.function()</code>
as attribute values</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="348cff3fc4"><code>348cff3</code></a>
chore: Release</li>
<li><a
href="d4783779f8"><code>d478377</code></a>
docs: Update changelog</li>
<li><a
href="04b9fbb83a"><code>04b9fbb</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/6414">#6414</a>
from koopatroopa787/fix-bash-completion-bracket-glob</li>
<li><a
href="70752392a8"><code>7075239</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/6422">#6422</a>
from BaumiCoder/fix-fish-indentations</li>
<li><a
href="f90a96636a"><code>f90a966</code></a>
fix(complete): Use spaces for indentation in fish</li>
<li><a
href="dd4997ba2d"><code>dd4997b</code></a>
fix(complete): Don't glob-expand bash positionals</li>
<li><a
href="8387c812c4"><code>8387c81</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/6399">#6399</a>
from clap-rs/renovate/crate-ci-typos-1.x</li>
<li><a
href="8141e110ec"><code>8141e11</code></a>
chore(deps): Update compatible (dev) (<a
href="https://redirect.github.com/clap-rs/clap/issues/6398">#6398</a>)</li>
<li><a
href="8a6bd4e43e"><code>8a6bd4e</code></a>
chore(deps): Update pre-commit hook crate-ci/typos to v1.47.0</li>
<li><a
href="71a7213d6e"><code>71a7213</code></a>
chore(deps): Update Rust Stable to v1.96 (<a
href="https://redirect.github.com/clap-rs/clap/issues/6396">#6396</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.6.2...clap_complete-v4.6.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `tokio` from 1.52.3 to 1.53.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/tokio/releases">tokio's
releases</a>.</em></p>
<blockquote>
<h2>Tokio v1.53.1</h2>
<h1>1.53.1 (July 20th, 2026)</h1>
<h3>Fixed</h3>
<ul>
<li>signal: restore MSRV by removing <code>OnceLock::wait</code> from
the Windows handler (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8300">#8300</a>)</li>
</ul>
<h3>Fixed (unstable)</h3>
<ul>
<li>time: fix alt timer cancellation and insertion race (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8252">#8252</a>)</li>
</ul>
<h3>Documented</h3>
<ul>
<li>runtime: remove dead link definition in Runtime::block_on (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8301">#8301</a>)</li>
</ul>
<p><a
href="https://redirect.github.com/tokio-rs/tokio/issues/8252">#8252</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/8252">tokio-rs/tokio#8252</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8300">#8300</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/8300">tokio-rs/tokio#8300</a>
<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8301">#8301</a>:
<a
href="https://redirect.github.com/tokio-rs/tokio/pull/8301">tokio-rs/tokio#8301</a></p>
<h2>Tokio v1.53.0</h2>
<h1>1.53.0 (July 17th, 2026)</h1>
<h3>Added</h3>
<ul>
<li>fs: implement <code>From&lt;OwnedFd&gt;</code> and
<code>From&lt;OwnedHandle&gt;</code> for <code>File</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8266">#8266</a>)</li>
<li>metrics: add task schedule latency metric (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/7986">#7986</a>)</li>
<li>net: add <code>SocketAddr</code> methods to Unix sockets (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8144">#8144</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>io: add <code>#[inline]</code> to IO trait impls for in-memory types
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8242">#8242</a>)</li>
<li>net: implement UCred::pid on FreeBSD (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8086">#8086</a>)</li>
<li>net: support Nuttx target os (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8259">#8259</a>)</li>
<li>signal: refactor global variables on Windows (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8231">#8231</a>)</li>
<li>sync: <code>mpsc::{Receiver,UnboundedReceiver}</code> now drops
waker on drop, even if there are still senders (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8095">#8095</a>)</li>
<li>taskdump: support taskdumps on s390x (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8192">#8192</a>)</li>
<li>time: add <code>#[track_caller]</code> to <code>timeout_at()</code>
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8077">#8077</a>)</li>
<li>time: consolidate mutex locks on spurious poll (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8124">#8124</a>)</li>
<li>time: defer waker clone on spurious poll (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8107">#8107</a>)</li>
<li>time: move lazy-registration state into <code>Sleep</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8132">#8132</a>)</li>
<li>tracing: remove unnecessary span clone (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8126">#8126</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>io: do not treat zero-length reads as EOF in <code>Chain</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8251">#8251</a>)</li>
<li>net: use getpeereid for QNX peer credentials (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8270">#8270</a>)</li>
<li>runtime: avoid illegal state in <code>FastRand</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8078">#8078</a>)</li>
<li>sync: wake mpsc receiver when a queued <code>reserve[_many]</code>
returns permits (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8260">#8260</a>)</li>
<li>taskdump: skip double wake on
<code>Trace::capture</code>/<code>Trace::trace_with</code> (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8043">#8043</a>)</li>
<li>time: avoid stack overflow in runtime constructor (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8093">#8093</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="75fef53d0a"><code>75fef53</code></a>
chore: prepare Tokio v1.53.1 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8303">#8303</a>)</li>
<li><a
href="ae9d011213"><code>ae9d011</code></a>
signal: restore MSRV by removing OnceLock::wait from the Windows handler
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8300">#8300</a>)</li>
<li><a
href="eb4988dc2e"><code>eb4988d</code></a>
time: fix the loom test of the race between cancellation/insertion (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8302">#8302</a>)</li>
<li><a
href="91d3b4c0bc"><code>91d3b4c</code></a>
time: fix alt timer cancellation and insertion race (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8252">#8252</a>)</li>
<li><a
href="a46338401b"><code>a463384</code></a>
runtime: remove dead link definition in <code>Runtime::block_on</code>
(<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8301">#8301</a>)</li>
<li><a
href="be689a35f5"><code>be689a3</code></a>
chore: prepare Tokio v1.53.0 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8294">#8294</a>)</li>
<li><a
href="50f76c71ec"><code>50f76c7</code></a>
chore: prepare tokio-macros v2.7.1 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8295">#8295</a>)</li>
<li><a
href="f61fccad3c"><code>f61fcca</code></a>
Merge 'tokio-1.52.4' into 'master' (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8290">#8290</a>)</li>
<li><a
href="efdba5fcf0"><code>efdba5f</code></a>
chore: prepare Tokio v1.52.4 (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8289">#8289</a>)</li>
<li><a
href="b0ba02e755"><code>b0ba02e</code></a>
Merge 'tokio-1.51.4' into 'tokio-1.52.x' (<a
href="https://redirect.github.com/tokio-rs/tokio/issues/8288">#8288</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tokio-rs/tokio/compare/tokio-1.52.3...tokio-1.53.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pyo3` from 0.29.0 to 0.29.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pyo3/pyo3/releases">pyo3's
releases</a>.</em></p>
<blockquote>
<h2>PyO3 0.29.2</h2>
<p>This patch fixes a regression in PyO3 0.29.1 which broke PyPy 3.11
compatibility (<code>#[pyclass]</code> types would crash PyPy on
instance deletion).</p>
<p>A few further fixes have also landed with similar themes to PyO3
0.29.1: fixes to minor reference counting bugs, rough edges which would
cause crashes, issues which would cause failed builds, and fixes to
<code>experimental-inspect</code> type stub generation.</p>
<p>For a full list of the exact fixes please consult the CHANGELOG.</p>
<p>Thank you to the following contributors for the improvements:</p>
<p><a
href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a>
<a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
<a href="https://github.com/ImFeH2"><code>@​ImFeH2</code></a>
<a
href="https://github.com/musicinmybrain"><code>@​musicinmybrain</code></a>
<a href="https://github.com/Tpt"><code>@​Tpt</code></a>
<a
href="https://github.com/WaterWhisperer"><code>@​WaterWhisperer</code></a></p>
<h2>PyO3 0.29.1</h2>
<p>This patch is a stack of fixes for PyO3 0.29. Particular themes
include:</p>
<ul>
<li>Fixes addressing build failures with newer interpreters such as
GraalPy 3.13 and CPython 3.15</li>
<li>Fixes resolving potential memory leaks inside
<code>#[pyclass]</code> implementation internals</li>
<li>Fixes to the new <code>experimental-inspect</code> type stub
machinery</li>
</ul>
<p>For a full list of the fixes in these above themes and more, please
consult the CHANGELOG.</p>
<p>Thank you to the following contributors for the improvements:</p>
<p><a href="https://github.com/alex"><code>@​alex</code></a>
<a
href="https://github.com/bschoenmaeckers"><code>@​bschoenmaeckers</code></a>
<a href="https://github.com/chirizxc"><code>@​chirizxc</code></a>
<a href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a>
<a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
<a href="https://github.com/exg"><code>@​exg</code></a>
<a href="https://github.com/ImFeH2"><code>@​ImFeH2</code></a>
<a
href="https://github.com/IvanIsCoding"><code>@​IvanIsCoding</code></a>
<a href="https://github.com/jonasdedden"><code>@​jonasdedden</code></a>
<a
href="https://github.com/MatthieuDartiailh"><code>@​MatthieuDartiailh</code></a>
<a href="https://github.com/msimacek"><code>@​msimacek</code></a>
<a href="https://github.com/ngoldbaum"><code>@​ngoldbaum</code></a>
<a href="https://github.com/Person-93"><code>@​Person-93</code></a>
<a href="https://github.com/ratazzi"><code>@​ratazzi</code></a>
<a href="https://github.com/rewitt94"><code>@​rewitt94</code></a>
<a
href="https://github.com/scott-griffiths"><code>@​scott-griffiths</code></a>
<a href="https://github.com/ShiroKSH"><code>@​ShiroKSH</code></a>
<a href="https://github.com/tobni"><code>@​tobni</code></a>
<a href="https://github.com/Tpt"><code>@​Tpt</code></a>
<a
href="https://github.com/WaterWhisperer"><code>@​WaterWhisperer</code></a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/PyO3/pyo3/blob/main/CHANGELOG.md">pyo3's
changelog</a>.</em></p>
<blockquote>
<h2>[0.29.2] - 2026-08-05</h2>
<h3>Packaging</h3>
<ul>
<li>Add <code>PYO3_USE_RAW_DYLIB=0</code> opt-out of
<code>raw-dylib</code> linking for Windows. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6185">#6185</a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix PyO3 0.29 regression with failure to link under Cygwin / MSYS2.
<a href="https://redirect.github.com/PyO3/pyo3/pull/6185">#6185</a></li>
<li>Fix stubs generation for field getters (<code>#[pyo3(get)]</code>)
when <code>IntoPyObject</code> is only implemented on references of the
field type. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6276">#6276</a></li>
<li>Fix <code>#[classmethod]</code> magic methods receiving the instance
instead of its type when invoked through a type slot. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6283">#6283</a></li>
<li>Fix <code>pyo3_build_config::add_libpython_rpath_link_args</code>
emitting Unix-style rpath linker arguments on Windows and Cygwin. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6284">#6284</a></li>
<li>Fix PyO3 0.29.1 regression on PyPy causing crashes when deallocating
<code>#[pyclass]</code> instances. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6294">#6294</a></li>
<li>Fix missing trailing nul in Python 3.9 <code>#[pyclass]</code>
docstrings. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6296">#6296</a></li>
<li>Fix reference count leak of <code>#[classattr]</code> values created
from <code>fn</code> items. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6297">#6297</a></li>
</ul>
<h2>[0.29.1] - 2026-08-02</h2>
<h3>Changed</h3>
<ul>
<li>Use the inline definition of <code>Py_TYPE</code> in the unlimited
API on 3.14+ <a
href="https://redirect.github.com/PyO3/pyo3/pull/6179">#6179</a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix incorrect pointer arithmetic in FFI definitions
<code>PyObject_GET_WEAKREFS_LISTPTR</code> and
<code>PyHeapType_GET_MEMBERS</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6145">#6145</a></li>
<li>Fix compilation error with <code>nightly</code> feature on PyPy and
GraalPy due to <code>!Ungil</code> implementations for FFI types not
available on those platforms. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6146">#6146</a></li>
<li>Fix <code>append_to_inittab</code> and
<code>PyInit_&lt;module&gt;</code> internal module definition corruption
on 32-bit and big-endian platforms on Python 3.15+. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6150">#6150</a></li>
<li>Fix return value of <code>PyClassGuardMutSuper::as_super</code>
being scoped to the full guard lifetime, now the <code>&amp;mut</code>
borrow of the <code>as_super()</code> call. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6181">#6181</a></li>
<li>Fix builds for free-threaded interpreters older than 3.15 erroring
with &quot;cannot set a minimum Python version&quot; when an
<code>abi3t-py3*</code> feature is enabled and the configuration comes
from <code>PYO3_CONFIG_FILE</code>, sysconfigdata or cross-compilation
defaults. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6192">#6192</a></li>
<li>Fix a memory leak when deallocating <code>#[pyclass(dict)]</code>
instances with a populated <code>__dict__</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6198">#6198</a></li>
<li>Fix an abort inside a <code>#[pyclass]</code>'s GC traversal when
the traversal is stopped early. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6206">#6206</a></li>
<li>Fix reference cycles through the <code>__dict__</code> of a
<code>#[pyclass(dict)]</code> never being collected. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6206">#6206</a></li>
<li>Fix building on GraalPy 3.13. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6208">#6208</a></li>
<li>Fix reference count leak of references to <code>#[pyclass]</code>
type objects held by their instances on instance deallocation. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6224">#6224</a></li>
<li>Fix FFI definitions <code>PyByteArray_GET_SIZE</code>,
<code>PyList_GET_SIZE</code>, and <code>PySet_GET_SIZE</code> to use an
atomic load for free-threaded Python. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6230">#6230</a></li>
<li>Fix a memory leak on Python 3.11 and 3.12 where creating an instance
of a <code>#[pyclass(dict)]</code> class leaked one empty dict per
instance. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6234">#6234</a></li>
<li>Fix <code>experimental-inspect</code> type stubs to emit the
arguments of many magic methods as positional-only to match runtime
behavior, rather than positional-or-keyword. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6239">#6239</a></li>
<li>Fix <code>experimental-inspect</code> type stubs to emit the Python
name rather than the Rust name for <code>#[pyfunction(name =
&quot;...&quot;)]</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6254">#6254</a></li>
<li>Fix <code>experimental-inspect</code> generating invalid internal
JSON when <code>#[pymodule]</code> members are gated by
<code>#[cfg]</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6255">#6255</a></li>
<li>Fix <code>__inplace_concat__</code> and
<code>__inplace_repeat__</code> overriding <code>__concat__</code> and
<code>__repeat__</code> when both were defined. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6260">#6260</a></li>
<li>Fix conversion of out-of-range <code>time::Duration</code> values to
return <code>OverflowError</code> instead of panicking. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6266">#6266</a></li>
<li>Fix <code>experimental-inspect</code> type stubs padding blank lines
inside indented docstrings. <a
href="https://redirect.github.com/PyO3/pyo3/pull/6270">#6270</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a70d17f898"><code>a70d17f</code></a>
release: 0.29.2</li>
<li><a
href="bd00e11864"><code>bd00e11</code></a>
fix backports.zoneinfo for uv install</li>
<li><a
href="7cbd144fd9"><code>7cbd144</code></a>
fix double-decref in PyPy in instance dealloc (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6294">#6294</a>)</li>
<li><a
href="e57fb6f5ac"><code>e57fb6f</code></a>
fix missing trailing nul on Python 3.9 <code>#[pyclass]</code>
docstrings (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6296">#6296</a>)</li>
<li><a
href="d83693c7d7"><code>d83693c</code></a>
fix refcount leak in <code>initialize_tp_dict</code> (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6297">#6297</a>)</li>
<li><a
href="48ebbd86a6"><code>48ebbd8</code></a>
fix: skip libpython rpath args on Windows and Cygwin (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6284">#6284</a>)</li>
<li><a
href="bd73377d4f"><code>bd73377</code></a>
fix: pass class to classmethod magic methods (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6283">#6283</a>)</li>
<li><a
href="af8d149449"><code>af8d149</code></a>
Restore pyo3-introspection license files (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6289">#6289</a>)</li>
<li><a
href="0120c59140"><code>0120c59</code></a>
unblock CI via a uv constraint (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6295">#6295</a>)</li>
<li><a
href="3161efcb22"><code>3161efc</code></a>
build(deps): bump CodSpeedHQ/action from 4 to 5.0.1 (<a
href="https://redirect.github.com/pyo3/pyo3/issues/6286">#6286</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pyo3/pyo3/compare/v0.29.0...v0.29.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `aws-config` from 1.9.0 to 1.10.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `aws-smithy-runtime-api` from 1.13.0 to 1.14.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `unidiff` from 0.4.0 to 0.4.1
<details>
<summary>Commits</summary>
<ul>
<li><a
href="61776005a3"><code>6177600</code></a>
Bump version to 0.4.1</li>
<li><a
href="e079b35791"><code>e079b35</code></a>
Fix hunk body lines being misparsed as file headers (<a
href="https://redirect.github.com/messense/unidiff-rs/issues/10">#10</a>)</li>
<li>See full diff in <a
href="https://github.com/messense/unidiff-rs/compare/v0.4.0...v0.4.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `aho-corasick` from 1.1.4 to 1.1.5
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5178060ce7"><code>5178060</code></a>
1.1.5</li>
<li><a
href="b68c8d507a"><code>b68c8d5</code></a>
api: check for overflow in <code>Match::offset</code> too</li>
<li><a
href="c82178696b"><code>c821786</code></a>
build(deps): bump actions/checkout in the actions group (<a
href="https://redirect.github.com/BurntSushi/aho-corasick/issues/171">#171</a>)</li>
<li><a
href="8209bb9d61"><code>8209bb9</code></a>
Hash-pin all actions, drop persisted credentials (<a
href="https://redirect.github.com/BurntSushi/aho-corasick/issues/170">#170</a>)</li>
<li><a
href="0f3f5da9bd"><code>0f3f5da</code></a>
api: document a couple panicking preconditions</li>
<li><a
href="e88e1fce8f"><code>e88e1fc</code></a>
benchmarks: bump dependencies</li>
<li><a
href="88e4966516"><code>88e4966</code></a>
ci: use older version of <code>log</code> on pinned build</li>
<li>See full diff in <a
href="https://github.com/BurntSushi/aho-corasick/compare/1.1.4...1.1.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `toml` from 1.1.3+spec-1.1.0 to 1.1.4+spec-1.1.0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="beee9fe5a9"><code>beee9fe</code></a>
chore: Release</li>
<li><a
href="16e2ac1598"><code>16e2ac1</code></a>
docs: Update changelog</li>
<li><a
href="89f55411d4"><code>89f5541</code></a>
fix(toml): preserve datetimes when deserializing Value (<a
href="https://redirect.github.com/toml-rs/toml/issues/1194">#1194</a>)</li>
<li><a
href="534039ccff"><code>534039c</code></a>
fix(serde): Deserialize Value datetimes into typed targets</li>
<li><a
href="6e45cef5d5"><code>6e45cef</code></a>
test(serde): Reproduce Value datetime deserialization error</li>
<li><a
href="4ec099fed5"><code>4ec099f</code></a>
chore: Release</li>
<li><a
href="5a47a5180e"><code>5a47a51</code></a>
docs: Update changelog</li>
<li><a
href="da0911f7e7"><code>da0911f</code></a>
perf(parser): Reduce over allocation by better tokens/byte ratio (<a
href="https://redirect.github.com/toml-rs/toml/issues/1193">#1193</a>)</li>
<li><a
href="26eb1571f2"><code>26eb157</code></a>
perf(parser): Reduce over allocation by better tokens/byte ratio</li>
<li><a
href="ca4c7bf420"><code>ca4c7bf</code></a>
chore(deps): Update Prek to v0.4.11 (<a
href="https://redirect.github.com/toml-rs/toml/issues/1191">#1191</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/toml-rs/toml/compare/toml-v1.1.3...toml-v1.1.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `blake3` from 1.8.5 to 1.8.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/BLAKE3-team/BLAKE3/releases">blake3's
releases</a>.</em></p>
<blockquote>
<h2>1.8.6</h2>
<p>version 1.8.6</p>
<p>Changes since 1.8.5:</p>
<ul>
<li><code>update_mmap</code> and <code>update_mmap_rayon</code> (and by
extension <code>b3sum</code>) now
use <code>seek</code> rather than <code>metadata</code> to get the
length of a file/mapping,
and they tolerate <code>mmap</code> failures. That means
<code>b3sum</code> will now memory
map e.g. Linux block devices, which support mapping despite reporting
length 0 in <code>metadata</code>. Hashing <code>NUL</code> files on
Windows also works now,
where previously it was an error unless you used <code>--no-mmap</code>
or <code>&lt;</code>.
This change was originally proposed by <a
href="https://github.com/nabijaczleweli"><code>@​nabijaczleweli</code></a>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="77b257eee7"><code>77b257e</code></a>
version 1.8.6</li>
<li><a
href="83b1746e7c"><code>83b1746</code></a>
use <code>seek</code> instead of <code>metadata</code> to establish mmap
length (<a
href="https://redirect.github.com/BLAKE3-team/BLAKE3/issues/570">#570</a>)</li>
<li><a
href="9eac279fd7"><code>9eac279</code></a>
use vswhere to find Visual Studio in CI</li>
<li><a
href="fc3d0e98e8"><code>fc3d0e9</code></a>
Fix path to Visual Studio toolchain in CI</li>
<li><a
href="8aa5145039"><code>8aa5145</code></a>
a few more colons</li>
<li><a
href="6bb977357b"><code>6bb9773</code></a>
use cargo:: build script syntax</li>
<li><a
href="91f7308e12"><code>91f7308</code></a>
fix Mode docs</li>
<li><a
href="f3913d9531"><code>f3913d9</code></a>
typo fixes</li>
<li><a
href="f51e8226a2"><code>f51e822</code></a>
tweak release instructions</li>
<li>See full diff in <a
href="https://github.com/BLAKE3-team/BLAKE3/compare/1.8.5...1.8.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `http` from 1.4.2 to 1.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/hyperium/http/releases">http's
releases</a>.</em></p>
<blockquote>
<h2>v1.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(method): add QUERY method by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/http/pull/798">hyperium/http#798</a></li>
<li>fix(uri): allow empty paths in uri::Builder by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/http/pull/853">hyperium/http#853</a></li>
<li>perf(header,uri): faster value validation, URI parse/format, map
inserts by <a
href="https://github.com/geeknoid"><code>@​geeknoid</code></a> in <a
href="https://redirect.github.com/hyperium/http/pull/852">hyperium/http#852</a></li>
<li>fix(uri): enforce max length in PathAndQuery by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/http/pull/856">hyperium/http#856</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/geeknoid"><code>@​geeknoid</code></a>
made their first contribution in <a
href="https://redirect.github.com/hyperium/http/pull/852">hyperium/http#852</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/hyperium/http/compare/v1.4.2...v1.5.0">https://github.com/hyperium/http/compare/v1.4.2...v1.5.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/hyperium/http/blob/master/CHANGELOG.md">http's
changelog</a>.</em></p>
<blockquote>
<h1>1.5.0 (July 29, 2026)</h1>
<ul>
<li>Add <code>Method::QUERY</code> constant for the new QUERY method
defined in RFC 10008.</li>
<li>Fix <code>uri::Builder::path_and_query()</code> to allow empty
strings to mean no path.</li>
<li>Fix <code>uri::PathAndQuery</code> parsing to enforce URI max
length.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="16fc9a7b84"><code>16fc9a7</code></a>
v1.5.0</li>
<li><a
href="e559023f67"><code>e559023</code></a>
fix(uri): enforce max length in PathAndQuery (<a
href="https://redirect.github.com/hyperium/http/issues/856">#856</a>)</li>
<li><a
href="2178e175c4"><code>2178e17</code></a>
perf(header,uri): faster value validation, URI parse/format, map inserts
(<a
href="https://redirect.github.com/hyperium/http/issues/852">#852</a>)</li>
<li><a
href="03c8cd7fae"><code>03c8cd7</code></a>
fix(uri): allow empty paths in uri::Builder (<a
href="https://redirect.github.com/hyperium/http/issues/853">#853</a>)</li>
<li><a
href="bb8705b25c"><code>bb8705b</code></a>
feat(method): add QUERY method (<a
href="https://redirect.github.com/hyperium/http/issues/798">#798</a>)</li>
<li>See full diff in <a
href="https://github.com/hyperium/http/compare/v1.4.2...v1.5.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `futures` from 0.3.32 to 0.3.33
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/releases">futures's
releases</a>.</em></p>
<blockquote>
<h2>0.3.33</h2>
<ul>
<li>Fix <code>ReadLine</code>'s soundness issue regarding to exception
safety. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3020">#3020</a>)</li>
<li>Fix unsound <code>Send</code> impl for <code>IterPinRef</code> and
<code>Iter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3003">#3003</a>)</li>
<li>Fix stacked borrows violation in <code>compat01as03</code>
implementation. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3012">#3012</a>)</li>
<li>Fix memory leak in <code>FuturesUnordered::IntoIter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3005">#3005</a>)</li>
<li>Add <code>portable-atomic-alloc</code> feature and use it in
<code>FuturesUnordered</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3007">#3007</a>)</li>
<li>Re-export <code>alloc::task::Wake</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3010">#3010</a>)</li>
<li>Update <code>spin</code> to 0.12. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3014">#3014</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md">futures's
changelog</a>.</em></p>
<blockquote>
<h1>0.3.33 - 2026-07-18</h1>
<ul>
<li>Fix <code>ReadLine</code>'s soundness issue regarding to exception
safety. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3020">#3020</a>)</li>
<li>Fix unsound <code>Send</code> impl for <code>IterPinRef</code> and
<code>Iter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3003">#3003</a>)</li>
<li>Fix stacked borrows violation in <code>compat01as03</code>
implementation. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3012">#3012</a>)</li>
<li>Fix memory leak in <code>FuturesUnordered::IntoIter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3005">#3005</a>)</li>
<li>Add <code>portable-atomic-alloc</code> feature and use it in
<code>FuturesUnordered</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3007">#3007</a>)</li>
<li>Re-export <code>alloc::task::Wake</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3010">#3010</a>)</li>
<li>Update <code>spin</code> to 0.12. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3014">#3014</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="89cc254cb8"><code>89cc254</code></a>
Release 0.3.33</li>
<li><a
href="cd9f5befe6"><code>cd9f5be</code></a>
ci: Update release workflow</li>
<li><a
href="d79a499c5f"><code>d79a499</code></a>
Resolve rustdoc::broken_intra_doc_links warning</li>
<li><a
href="95bbcf83be"><code>95bbcf8</code></a>
Resolve rustdoc ambiguous link error</li>
<li><a
href="303c1658dc"><code>303c165</code></a>
Resolve rustdoc::redundant_explicit_links warning</li>
<li><a
href="f34e3f5b9d"><code>f34e3f5</code></a>
ci: Cleanup</li>
<li><a
href="66591a2427"><code>66591a2</code></a>
Enable Miri for more tests</li>
<li><a
href="ab1072fec1"><code>ab1072f</code></a>
Simplify target_has_atomic cfg in utility crates</li>
<li><a
href="cf5d23b68b"><code>cf5d23b</code></a>
Fix unsound compat01as03 implementation (fixes <a
href="https://redirect.github.com/rust-lang/futures-rs/issues/2514">#2514</a>)
(<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3012">#3012</a>)</li>
<li><a
href="8ae794faef"><code>8ae794f</code></a>
Add portable-atomic-alloc feature and use it in FuturesUnordered (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3007">#3007</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-lang/futures-rs/compare/0.3.32...0.3.33">compare
view</a></li>
</ul>
</details>
<br />

Updates `futures-util` from 0.3.32 to 0.3.33
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/releases">futures-util's
releases</a>.</em></p>
<blockquote>
<h2>0.3.33</h2>
<ul>
<li>Fix <code>ReadLine</code>'s soundness issue regarding to exception
safety. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3020">#3020</a>)</li>
<li>Fix unsound <code>Send</code> impl for <code>IterPinRef</code> and
<code>Iter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3003">#3003</a>)</li>
<li>Fix stacked borrows violation in <code>compat01as03</code>
implementation. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3012">#3012</a>)</li>
<li>Fix memory leak in <code>FuturesUnordered::IntoIter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3005">#3005</a>)</li>
<li>Add <code>portable-atomic-alloc</code> feature and use it in
<code>FuturesUnordered</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3007">#3007</a>)</li>
<li>Re-export <code>alloc::task::Wake</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3010">#3010</a>)</li>
<li>Update <code>spin</code> to 0.12. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3014">#3014</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md">futures-util's
changelog</a>.</em></p>
<blockquote>
<h1>0.3.33 - 2026-07-18</h1>
<ul>
<li>Fix <code>ReadLine</code>'s soundness issue regarding to exception
safety. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3020">#3020</a>)</li>
<li>Fix unsound <code>Send</code> impl for <code>IterPinRef</code> and
<code>Iter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3003">#3003</a>)</li>
<li>Fix stacked borrows violation in <code>compat01as03</code>
implementation. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3012">#3012</a>)</li>
<li>Fix memory leak in <code>FuturesUnordered::IntoIter</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3005">#3005</a>)</li>
<li>Add <code>portable-atomic-alloc</code> feature and use it in
<code>FuturesUnordered</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3007">#3007</a>)</li>
<li>Re-export <code>alloc::task::Wake</code>. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3010">#3010</a>)</li>
<li>Update <code>spin</code> to 0.12. (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3014">#3014</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="89cc254cb8"><code>89cc254</code></a>
Release 0.3.33</li>
<li><a
href="cd9f5befe6"><code>cd9f5be</code></a>
ci: Update release workflow</li>
<li><a
href="d79a499c5f"><code>d79a499</code></a>
Resolve rustdoc::broken_intra_doc_links warning</li>
<li><a
href="95bbcf83be"><code>95bbcf8</code></a>
Resolve rustdoc ambiguous link error</li>
<li><a
href="303c1658dc"><code>303c165</code></a>
Resolve rustdoc::redundant_explicit_links warning</li>
<li><a
href="f34e3f5b9d"><code>f34e3f5</code></a>
ci: Cleanup</li>
<li><a
href="66591a2427"><code>66591a2</code></a>
Enable Miri for more tests</li>
<li><a
href="ab1072fec1"><code>ab1072f</code></a>
Simplify target_has_atomic cfg in utility crates</li>
<li><a
href="cf5d23b68b"><code>cf5d23b</code></a>
Fix unsound compat01as03 implementation (fixes <a
href="https://redirect.github.com/rust-lang/futures-rs/issues/2514">#2514</a>)
(<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3012">#3012</a>)</li>
<li><a
href="8ae794faef"><code>8ae794f</code></a>
Add portable-atomic-alloc feature and use it in FuturesUnordered (<a
href="https://redirect.github.com/rust-lang/futures-rs/issues/3007">#3007</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-lang/futures-rs/compare/0.3.32...0.3.33">compare
view</a></li>
</ul>
</details>
<br />

Updates `hyper` from 1.10.1 to 1.11.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/hyperium/hyper/releases">hyper's
releases</a>.</em></p>
<blockquote>
<h2>v1.11.0</h2>
<h2>Features</h2>
<ul>
<li><strong>rt:</strong> add
<code>ReadBufCursor::initialized_unfilled()</code> method (<a
href="https://redirect.github.com/hyperium/hyper/issues/4115">#4115</a>)
(<a
href="ccc1e850dc">ccc1e850</a>)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><strong>http1:</strong>
<ul>
<li>discard content-length header when received before transfer-encoding
(<a
href="https://redirect.github.com/hyperium/hyper/issues/4124">#4124</a>)
(<a
href="540fff9180">540fff91</a>,
closes <a
href="https://redirect.github.com/hyperium/hyper/issues/4123">#4123</a>)</li>
<li>use append for repeat trailer values in encoder (<a
href="https://redirect.github.com/hyperium/hyper/issues/4118">#4118</a>)
(<a
href="de1483d7db">de1483d7</a>)</li>
<li>allow up to max_headers trailers (<a
href="https://redirect.github.com/hyperium/hyper/issues/4108">#4108</a>)
(<a
href="f584091ac0">f584091a</a>)</li>
<li>use append for repeat trailers (<a
href="https://redirect.github.com/hyperium/hyper/issues/4107">#4107</a>)
(<a
href="876effe10f">876effe1</a>)</li>
<li>flush buffered data before shutdown (<a
href="https://redirect.github.com/hyperium/hyper/issues/4018">#4018</a>)
(<a
href="72046cc72e">72046cc7</a>,
closes <a
href="https://redirect.github.com/hyperium/hyper/issues/4022">#4022</a>)</li>
<li>more strictly enforce max_buf_size when parsing (<a
href="https://redirect.github.com/hyperium/hyper/issues/4093">#4093</a>)
(<a
href="90ede30747">90ede307</a>,
closes <a
href="https://redirect.github.com/hyperium/hyper/issues/4081">#4081</a>)</li>
</ul>
</li>
<li><strong>http2:</strong> avoid buffering <code>Upgraded</code> writes
without send capacity (<a
href="https://redirect.github.com/hyperium/hyper/issues/4102">#4102</a>)
(<a
href="aecf5abfbc">aecf5abf</a>)</li>
</ul>
<h2>All PRs</h2>
<ul>
<li>removing <code>cast_lossless</code> lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4087">hyperium/hyper#4087</a></li>
<li>Fix the borrow_as_ptr lint by <a
href="https://github.com/xd009642"><code>@​xd009642</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4082">hyperium/hyper#4082</a></li>
<li>removing <code>empty_structs_with_brackets</code> lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4088">hyperium/hyper#4088</a></li>
<li>style(proto): removing <code>explicit_iter_loop</code> lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4089">hyperium/hyper#4089</a></li>
<li>Fix the ptr_as_ptr lint by <a
href="https://github.com/nakaryo716"><code>@​nakaryo716</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4091">hyperium/hyper#4091</a></li>
<li>style(lib): remove <code>manual_assert_eq</code> lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4090">hyperium/hyper#4090</a></li>
<li>style(http2): allow an instance of large_enum_variant, deny
otherwise by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4092">hyperium/hyper#4092</a></li>
<li>Removing 'undocumented_unsafe_blocks' lint allowance by <a
href="https://github.com/Lori-Shu"><code>@​Lori-Shu</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4083">hyperium/hyper#4083</a></li>
<li>style(http2): use an enum instead of bool in
strip_connection_headers() by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4094">hyperium/hyper#4094</a></li>
<li>fix(http1): more strictly enforce max_buf_size when parsing by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4093">hyperium/hyper#4093</a></li>
<li>h1 servers can shutdown connections with pending buffered data on
filled sockets by <a
href="https://github.com/deven96"><code>@​deven96</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4018">hyperium/hyper#4018</a></li>
<li>refactor(http1): remove ref_option lint by <a
href="https://github.com/nakaryo716"><code>@​nakaryo716</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4101">hyperium/hyper#4101</a></li>
<li>style(lib): remove <code>unnecessary_semicolon</code> lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4103">hyperium/hyper#4103</a></li>
<li>style(lib): remove <code>uninlined_format_args</code> lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4104">hyperium/hyper#4104</a></li>
<li>style(lib): remove <code>semicolon_if_nothing_returned</code> lint
by <a href="https://github.com/MonkieeBoi"><code>@​MonkieeBoi</code></a>
in <a
href="https://redirect.github.com/hyperium/hyper/pull/4106">hyperium/hyper#4106</a></li>
<li>style(lib): remove <code> single_match_else</code> lint by <a
href="https://github.com/yunz-dev"><code>@​yunz-dev</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4105">hyperium/hyper#4105</a></li>
<li>style(lib): remove <code>default_trait_access</code> lint by <a
href="https://github.com/nakaryo716"><code>@​nakaryo716</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4111">hyperium/hyper#4111</a></li>
<li>fix(http1): use append for repeat trailers by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4107">hyperium/hyper#4107</a></li>
<li>fix(http1): allow up to max_headers trailers by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4108">hyperium/hyper#4108</a></li>
<li>fix(http2): avoid buffering <code>Upgraded</code> writes without
send capacity by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4102">hyperium/hyper#4102</a></li>
<li>style(headers): small refactor to remove <code>question_mark</code>
lint by <a
href="https://github.com/josetorrs"><code>@​josetorrs</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4116">hyperium/hyper#4116</a></li>
<li>fix(h1): append duplicate trailer values when encoding (match <a
href="https://redirect.github.com/hyperium/hyper/issues/4107">#4107</a>)
by <a
href="https://github.com/greymoth-jp"><code>@​greymoth-jp</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4118">hyperium/hyper#4118</a></li>
<li>style(proto): fix <code>decimal_literal_representation</code> lint
by <a href="https://github.com/josetorrs"><code>@​josetorrs</code></a>
in <a
href="https://redirect.github.com/hyperium/hyper/pull/4117">hyperium/hyper#4117</a></li>
<li>docs(governance): define Advisor role by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4098">hyperium/hyper#4098</a></li>
<li>docs(maintainers): move some collaborators to emeriti by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4125">hyperium/hyper#4125</a></li>
<li>feat: add initialized_unfilled to ReadBufCursor by <a
href="https://github.com/abh1nav10"><code>@​abh1nav10</code></a> in <a
href="https://redirect.github.com/hyperium/hyper/pull/4115">hyperium/hyper#4115</a></li>
<li>fix(http1): discard content-length header when received before
transfer-encoding by <a
href="https://github.com/seanmonstar"><code>@​seanmonstar</code></a> in
<a
href="https://redirect.github.com/hyperium/hyper/pull/4124">hyperium/hyper#4124</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/josetorrs"><code>@​josetorrs</code></a>
made their first contribution in <a
href="https://redirect.github.com/hyperium/hyper/pull/4087">hyperium/hyper#4087</a></li>
<li><a
href="https://github.com/nakaryo716"><code>@​nakaryo716</code></a> made
their first contribution in <a
href="https://redirect.github.com/hyperium/hyper/pull/4091">hyperium/hyper#4091</a></li>
<li><a href="https://github.com/deven96"><code>@​deven96</code></a> made
their first contribution in <a
href="https://redirect.github.com/hyperium/hyper/pull/4018">hyperium/hyper#4018</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/hyperium/hyper/blob/master/CHANGELOG.md">hyper's
changelog</a>.</em></p>
<blockquote>
<h2>v1.11.0 (2026-07-20)</h2>
<h4>Bug Fixes</h4>
<ul>
<li><strong>http1:</strong>
<ul>
<li>discard content-length header when received before transfer-encoding
(<a
href="https://redirect.github.com/hyperium/hyper/issues/4124">#4124</a>)
(<a
href="540fff9180">540fff91</a>,
closes <a
href="https://redirect.github.com/hyperium/hyper/issues/4123">#4123</a>)</li>
<li>use append for repeat trailer values in encoder (<a
href="https://redirect.github.com/hyperium/hyper/issues/4118">#4118</a>)
(<a
href="de1483d7db">de1483d7</a>)</li>
<li>allow up to max_headers trailers (<a
href="https://redirect.github.com/hyperium/hyper/issues/4108">#4108</a>)
(<a
href="f584091ac0">f584091a</a>)</li>
<li>use append for repeat trailers (<a
href="https://redirect.github.com/hyperium/hyper/issues/4107">#4107</a>)
(<a
href="876effe10f">876effe1</a>)</li>
<li>flush buffered data before shutdown (<a
href="https://redirect.github.com/hyperium/hyper/issues/4018">#4018</a>)
(<a
href="72046cc72e">72046cc7</a>,
closes <a
href="https://redirect.github.com/hyperium/hyper/issues/4022">#4022</a>)</li>
<li>more strictly enforce max_buf_size when parsing (<a
href="https://redirect.github.com/hyperium/hyper/issues/4093">#4093</a>)
(<a
href="90ede30747">90ede307</a>,
closes <a
href="https://redirect.github.com/hyperium/hyper/issues/4081">#4081</a>)</li>
</ul>
</li>
<li><strong>http2:</strong> avoid buffering <code>Upgraded</code> writes
without send capacity (<a
href="https://redirect.github.com/hyperium/hyper/issues/4102">#4102</a>)
(<a
href="aecf5abfbc">aecf5abf</a>)</li>
</ul>
<h4>Features</h4>
<ul>
<li><strong>rt:</strong> add
<code>ReadBufCursor::initialized_unfilled()</code> method (<a
href="https://redirect.github.com/hyperium/hyper/issues/4115">#4115</a>)
(<a
href="ccc1e850dc">ccc1e850</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="67ace6484d"><code>67ace64</code></a>
v1.11.0</li>
<li><a
href="540fff9180"><code>540fff9</code></a>
fix(http1): discard content-length header when received before
transfer-encod...</li>
<li><a
href="ccc1e850dc"><code>ccc1e85</code></a>
feat(rt): add <code>ReadBufCursor::initialized_unfilled()</code> method
(<a
href="https://redirect.github.com/hyperium/hyper/issues/4115">#4115</a>)</li>
<li><a
href="0ea8bc2772"><code>0ea8bc2</code></a>
docs(maintainers): move some collaborators to emeriti (<a
href="https://redirect.github.com/hyperium/hyper/issues/4125">#4125</a>)</li>
<li><a
href="2fc06fc772"><code>2fc06fc</code></a>
docs(governance): define Advisor role (<a
href="https://redirect.github.com/hyperium/hyper/issues/4098">#4098</a>)</li>
<li><a
href="e0d14d19a0"><code>e0d14d1</code></a>
style(proto): explicitly allow
<code>decimal_literal_representation</code> lint (<a
href="https://redirect.github.com/hyperium/hyper/issues/4117">#4117</a>)</li>
<li><a
href="de1483d7db"><code>de1483d</code></a>
fix(http1): use append for repeat trailer values in encoder (<a
href="https://redirect.github.com/hyperium/hyper/issues/4118">#4118</a>)</li>
<li><a
href="08c3416279"><code>08c3416</code></a>
style(headers): small refactor to remove question_mark lint (<a
href="https://redirect.github.com/hyperium/hyper/issues/4116">#4116</a>)</li>
<li><a
href="aecf5abfbc"><code>aecf5ab</code></a>
fix(http2): avoid buffering <code>Upgraded</code> writes without send
capacity (<a
href="https://redirect.github.com/hyperium/hyper/issues/4102">#4102</a>)</li>
<li><a
href="f584091ac0"><code>f584091</code></a>
fix(http1): allow up to max_headers trailers (<a
href="https://redirect.github.com/hyperium/hyper/issues/4108">#4108</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/hyperium/hyper/compare/v1.10.1...v1.11.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `bytesize` from 2.4.2 to 2.7.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bytesize-rs/bytesize/releases">bytesize's
releases</a>.</em></p>
<blockquote>
<h2>bytesize: v2.7.0</h2>
<ul>
<li>Remove no-alloc support because it removed
<code>ByteSize::display()</code> when default features were
disabled.</li>
</ul>
<h2>bytesize: v2.6.0</h2>
<ul>
<li>Add display styles for IEC and SI bit units.</li>
</ul>
<p>(yanked)</p>
<h2>bytesize: v2.5.0</h2>
<ul>
<li>Honor precision when a width is set with formatting args.</li>
<li>Add <code>#[no_alloc]</code> support.</li>
</ul>
<p>(yanked)</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bytesize-rs/bytesize/blob/master/CHANGELOG.md">bytesize's
changelog</a>.</em></p>
<blockquote>
<h2>2.7.0</h2>
<ul>
<li>Remove no-alloc support because it removed
<code>ByteSize::display()</code> when default features were
disabled.</li>
</ul>
<h2>2.6.0</h2>
<ul>
<li>Add display styles for IEC and SI bit units.</li>
</ul>
<h2>2.5.0</h2>
<ul>
<li>Honor precision when a width is set with formatting args.</li>
<li>Add <code>#[no_alloc]</code> support.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>...

_Description has been truncated_

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 16:35:19 -05:00
dependabot[bot]
4925bf6a82
deps: bump hf-hub from 0.4.3 to 0.5.0 (#2285)
Bumps [hf-hub](https://github.com/huggingface/hf-hub) from 0.4.3 to
0.5.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/huggingface/hf-hub/releases">hf-hub's
releases</a>.</em></p>
<blockquote>
<h2>v0.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Upgrade ureq by <a
href="https://github.com/Narsil"><code>@​Narsil</code></a> in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/114">huggingface/hf-hub#114</a></li>
<li>Update indicatif to current version in Cargo.toml by <a
href="https://github.com/gordonmessmer"><code>@​gordonmessmer</code></a>
in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/126">huggingface/hf-hub#126</a></li>
<li>Fix failing API tests due to outdated model metadata expectations by
<a href="https://github.com/bmqube"><code>@​bmqube</code></a> in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/124">huggingface/hf-hub#124</a></li>
<li>fix: fix typo by <a
href="https://github.com/AndyDai-nv"><code>@​AndyDai-nv</code></a> in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/121">huggingface/hf-hub#121</a></li>
<li>Updating tests and dependencies. by <a
href="https://github.com/Narsil"><code>@​Narsil</code></a> in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/127">huggingface/hf-hub#127</a></li>
<li>Remove markdown from Cargo.toml by <a
href="https://github.com/gordonmessmer"><code>@​gordonmessmer</code></a>
in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/128">huggingface/hf-hub#128</a></li>
<li>Fixup the docstrings for download function (which always downloads).
by <a href="https://github.com/Narsil"><code>@​Narsil</code></a> in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/130">huggingface/hf-hub#130</a></li>
<li>Expose <code>metadata</code> and <code>pointer_path</code> methods
by <a href="https://github.com/danieldk"><code>@​danieldk</code></a> in
<a
href="https://redirect.github.com/huggingface/hf-hub/pull/136">huggingface/hf-hub#136</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/gordonmessmer"><code>@​gordonmessmer</code></a>
made their first contribution in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/126">huggingface/hf-hub#126</a></li>
<li><a href="https://github.com/bmqube"><code>@​bmqube</code></a> made
their first contribution in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/124">huggingface/hf-hub#124</a></li>
<li><a
href="https://github.com/AndyDai-nv"><code>@​AndyDai-nv</code></a> made
their first contribution in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/121">huggingface/hf-hub#121</a></li>
<li><a href="https://github.com/danieldk"><code>@​danieldk</code></a>
made their first contribution in <a
href="https://redirect.github.com/huggingface/hf-hub/pull/136">huggingface/hf-hub#136</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/huggingface/hf-hub/compare/v0.4.3...v0.5.0">https://github.com/huggingface/hf-hub/compare/v0.4.3...v0.5.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/huggingface/hf-hub/blob/main/RELEASE.md">hf-hub's
changelog</a>.</em></p>
<blockquote>
<h1>Releasing hf-hub</h1>
<p>This document covers the full release process for the
<code>hf-hub</code> crate. If anything here is unclear or out of date,
please open a PR.</p>
<h2>What gets released</h2>
<p>A single tag push releases one artifact:</p>
<ul>
<li><strong><code>hf-hub</code> Rust crate</strong> on <a
href="https://crates.io/crates/hf-hub">crates.io</a>, via
<code>.github/workflows/rust-release.yml</code>.</li>
</ul>
<p>The workflow triggers on tags matching <code>v*</code> (e.g.,
<code>v1.0.0</code>, <code>v1.0.0-rc.0</code>).</p>
<p>There are no Python components in this repo. The other workspace
members are not published:</p>
<ul>
<li><code>hfrs/</code> — CLI binary, distributed via <code>cargo install
--git</code>.</li>
<li><code>examples/</code>, <code>benches/</code>,
<code>integration-tests/</code> — internal-only, version
<code>0.0.0</code>, never published.</li>
</ul>
<h2>Pre-release checklist</h2>
<ol>
<li><strong>CI is green on <code>main</code>.</strong> The
<code>Rust</code> workflow must be passing on every platform in the
matrix (Ubuntu, Windows, macOS) with both feature configurations
(<code>&quot;&quot;</code> and <code>--all-features</code>).</li>
<li><strong>Review the diff since the last release.</strong>
<pre lang="bash"><code>git log --oneline v0.5.0..main
git diff v0.5.0..main --stat -- hf-hub/
</code></pre>
Pay particular attention to changes under <code>hf-hub/src/</code> —
those are the only changes that actually ship to crates.io.</li>
<li><strong>Identify breaking changes.</strong> Anything that changes
the public Rust API (types, function signatures, removed re-exports,
builder fields) needs to be reflected in the version bump per <a
href="https://semver.org">semver</a> and called out in the release
notes.</li>
<li><strong>Run the full pre-release test sweep</strong> (see next
section).</li>
</ol>
<h2>Pre-release test sweep</h2>
<p>Run all of these from the repo root before tagging. They mirror what
CI runs, plus a publish dry-run that CI does not currently do.</p>
<h3>Format and lint</h3>
<pre lang="bash"><code>cargo +nightly fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo clippy --workspace --all-targets --all-features -- -D warnings
</code></pre>
<h3>Unit tests (<code>hf-hub</code>)</h3>
<pre lang="bash"><code>cargo test -p hf-hub
cargo test -p hf-hub --features blocking
</code></pre>
<h3>Integration tests (<code>integration-tests</code>)</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b86d34cbdd"><code>b86d34c</code></a>
release: <code>0.5.0</code></li>
<li><a
href="5510260d5f"><code>5510260</code></a>
Expose <code>metadata</code> and <code>pointer_path</code> methods (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/136">#136</a>)</li>
<li><a
href="94b83854e0"><code>94b8385</code></a>
Fixup the docstrings for download function (which always downloads). (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/130">#130</a>)</li>
<li><a
href="c165283bf7"><code>c165283</code></a>
Remove markdown from Cargo.toml (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/128">#128</a>)</li>
<li><a
href="2c1f231d85"><code>2c1f231</code></a>
Updating tests and dependencies. (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/127">#127</a>)</li>
<li><a
href="6fcb56d102"><code>6fcb56d</code></a>
fix typo (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/121">#121</a>)</li>
<li><a
href="1d3037a3a9"><code>1d3037a</code></a>
Fix failing API tests due to outdated model metadata expectations (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/124">#124</a>)</li>
<li><a
href="65fb0347d9"><code>65fb034</code></a>
Update indicatif to current version in Cargo.toml (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/126">#126</a>)</li>
<li><a
href="3c9391bb77"><code>3c9391b</code></a>
Upgrade ureq (<a
href="https://redirect.github.com/huggingface/hf-hub/issues/114">#114</a>)</li>
<li>See full diff in <a
href="https://github.com/huggingface/hf-hub/compare/v0.4.3...v0.5.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=hf-hub&package-manager=cargo&previous-version=0.4.3&new-version=0.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 17:32:59 -05:00
dependabot[bot]
6448545a7f
deps: bump bytesize from 1.3.3 to 2.4.2 (#2286)
Bumps [bytesize](https://github.com/bytesize-rs/bytesize) from 1.3.3 to
2.4.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/bytesize-rs/bytesize/releases">bytesize's
releases</a>.</em></p>
<blockquote>
<h2>bytesize: v2.4.2</h2>
<ul>
<li>Improve accuracy of parsing large non-decimal byte count
strings.</li>
</ul>
<h2>bytesize: v2.4.1</h2>
<ul>
<li>Fix rounding error near power-of-unit boundaries.</li>
</ul>
<h2>bytesize: v2.4.0</h2>
<ul>
<li>Implement <code>Sum</code> for <code>ByteSize</code>.</li>
<li>Minimum supported Rust version (MSRV) is now 1.85.</li>
</ul>
<h2>bytesize: v2.3.1</h2>
<ul>
<li>Fix unit truncation in error strings.</li>
</ul>
<h2>bytesize: v2.3.0</h2>
<ul>
<li>Add <code>Unit</code> enum.</li>
<li>Add <code>UnitParseError</code> type.</li>
</ul>
<h2>bytesize: v2.2.0</h2>
<ul>
<li>Add <code>ByteSize::as_*()</code> methods to return equivalent sizes
in KB, GiB, etc.</li>
</ul>
<h2>bytesize: v2.1.0</h2>
<ul>
<li>Support parsing and formatting exabytes (EB) &amp; exbibytes
(EiB).</li>
<li>Migrate <code>serde</code> dependency to
<code>serde_core</code>.</li>
</ul>
<h2>bytesize: v2.0.1</h2>
<ul>
<li>Add support for precision in <code>Display</code>
implementations.</li>
</ul>
<h2>bytesize: v2.0.0</h2>
<ul>
<li>Add support for <code>no_std</code> targets.</li>
<li>Use IEC (binary) format by default with <code>Display</code>.</li>
<li>Use &quot;kB&quot; for SI unit.</li>
<li>Add <code>Display</code> type for customizing printed format.</li>
<li>Add <code>ByteSize::display()</code> method.</li>
<li>Implement <code>Sub&lt;ByteSize&gt;</code> for
<code>ByteSize</code>.</li>
<li>Implement <code>Sub&lt;impl Into&lt;u64&gt;&gt;</code> for
<code>ByteSize</code>.</li>
<li>Implement <code>SubAssign&lt;ByteSize&gt;</code> for
<code>ByteSize</code>.</li>
<li>Implement <code>SubAssign&lt;impl Into&lt;u64&gt;&gt;</code> for
<code>ByteSize</code>.</li>
<li>Reject parsing non-unit characters after whitespace.</li>
<li>Remove <code>ByteSize::to_string_as()</code> method.</li>
<li>Remove top-level <code>to_string()</code> method.</li>
<li>Remove top-level <code>B</code> constant.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bytesize-rs/bytesize/blob/master/CHANGELOG.md">bytesize's
changelog</a>.</em></p>
<blockquote>
<h2>2.4.2</h2>
<ul>
<li>Improve accuracy of parsing large non-decimal byte count
strings.</li>
</ul>
<h2>2.4.1</h2>
<ul>
<li>Fix rounding error near power-of-unit boundaries.</li>
</ul>
<h2>2.4.0</h2>
<ul>
<li>Implement <code>Sum</code> for <code>ByteSize</code>.</li>
<li>Minimum supported Rust version (MSRV) is now 1.85.</li>
</ul>
<h2>2.3.1</h2>
<ul>
<li>Fix unit truncation in error strings.</li>
</ul>
<h2>2.3.0</h2>
<ul>
<li>Add <code>Unit</code> enum.</li>
<li>Add <code>UnitParseError</code> type.</li>
</ul>
<h2>2.2.0</h2>
<ul>
<li>Add <code>ByteSize::as_*()</code> methods to return equivalent sizes
in KB, GiB, etc.</li>
</ul>
<h2>2.1.0</h2>
<ul>
<li>Support parsing and formatting exabytes (EB) &amp; exbibytes
(EiB).</li>
<li>Migrate <code>serde</code> dependency to
<code>serde_core</code>.</li>
</ul>
<h2>2.0.1</h2>
<ul>
<li>Add support for precision in <code>Display</code>
implementations.</li>
</ul>
<h2>v2.0.0</h2>
<ul>
<li>Add support for <code>no_std</code> targets.</li>
<li>Use IEC (binary) format by default with <code>Display</code>.</li>
<li>Use &quot;kB&quot; for SI unit.</li>
<li>Add <code>Display</code> type for customizing printed format.</li>
<li>Add <code>ByteSize::display()</code> method.</li>
<li>Implement <code>Sub&lt;ByteSize&gt;</code> for
<code>ByteSize</code>.</li>
<li>Implement <code>Sub&lt;impl Into&lt;u64&gt;&gt;</code> for
<code>ByteSize</code>.</li>
<li>Implement <code>SubAssign&lt;ByteSize&gt;</code> for
<code>ByteSize</code>.</li>
<li>Implement <code>SubAssign&lt;impl Into&lt;u64&gt;&gt;</code> for
<code>ByteSize</code>.</li>
<li>Reject parsing non-unit characters after whitespace.</li>
<li>Remove <code>ByteSize::to_string_as()</code> method.</li>
<li>Remove top-level <code>to_string()</code> method.</li>
<li>Remove top-level <code>B</code> constant.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2f8d196ae1"><code>2f8d196</code></a>
chore: release v2.4.2 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/177">#177</a>)</li>
<li><a
href="13f4aee47c"><code>13f4aee</code></a>
Avoid f64 precision loss when parsing integer byte counts (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/171">#171</a>)</li>
<li><a
href="37cf3fcb89"><code>37cf3fc</code></a>
chore: release v2.4.1 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/176">#176</a>)</li>
<li><a
href="c84e293840"><code>c84e293</code></a>
chore(deps): bump actions-rust-lang/setup-rust-toolchain from 1.16.1 to
1.17....</li>
<li><a
href="fdba7f05be"><code>fdba7f0</code></a>
chore(deps): bump taiki-e/install-action from 2.81.10 to 2.82.7 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/173">#173</a>)</li>
<li><a
href="1bad4015d2"><code>1bad401</code></a>
chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/174">#174</a>)</li>
<li><a
href="520a557780"><code>520a557</code></a>
fix: ideal_unit_std picks the wrong unit near power-of-unit boundaries
(<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/175">#175</a>)</li>
<li><a
href="a50ff2fa9b"><code>a50ff2f</code></a>
chore(deps): bump taiki-e/install-action from 2.75.27 to 2.81.10 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/163">#163</a>)</li>
<li><a
href="ce689d7ad0"><code>ce689d7</code></a>
chore(deps): bump codecov/codecov-action from 6.0.0 to 7.0.0 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/164">#164</a>)</li>
<li><a
href="284b09dce6"><code>284b09d</code></a>
chore(deps): bump serde_json from 1.0.149 to 1.0.150 (<a
href="https://redirect.github.com/bytesize-rs/bytesize/issues/165">#165</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/bytesize-rs/bytesize/compare/v1.3.3...bytesize-v2.4.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=bytesize&package-manager=cargo&previous-version=1.3.3&new-version=2.4.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 17:32:34 -05:00
dependabot[bot]
522faa1a59
deps: bump rusqlite from 0.32.1 to 0.40.1 (#2287)
Bumps [rusqlite](https://github.com/rusqlite/rusqlite) from 0.32.1 to
0.40.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rusqlite/rusqlite/releases">rusqlite's
releases</a>.</em></p>
<blockquote>
<h2>0.40.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix clippy warnings <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1852">#1852</a></li>
<li>Bump bundled SQLite version to 3.53.2 <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1853">#1853</a></li>
<li>Bump hashlink version <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1855">#1855</a></li>
<li>Fix SQL injection when SAVEPOINT name is tainted <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1854">#1854</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/rusqlite/rusqlite/compare/v0.40.0...v0.40.1">https://github.com/rusqlite/rusqlite/compare/v0.40.0...v0.40.1</a></p>
<h2>0.40.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Breaking changes: Replace VTab macros by constructors <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1823">#1823</a></li>
<li>Breaking changes: Fix VTab::best_index <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1824">#1824</a></li>
<li>Asserts on VTab::connect aux and args <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1825">#1825</a></li>
<li>Breaking changes: Fix VTab::connect / create <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1826">#1826</a></li>
<li>Breaking changes: Allow opting out of using sqlite-wasm-rs on
wasm32-unknown-unknown <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1828">#1828</a>,
<a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1829">#1829</a></li>
<li>Derive Default for SeriesTabCursor/ArrayTabCursor <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1830">#1830</a></li>
<li>Update link to pre-update hook <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1831">#1831</a></li>
<li>Breaking changes: Fix VTab::connect <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1832">#1832</a></li>
<li>impl From<!-- raw HTML omitted --> for FromSqlError <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1833">#1833</a></li>
<li>Breaking changes: Fix vtab::dequote <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1835">#1835</a></li>
<li>Bump bundled SQLCipher to version 4.14.0 <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1837">#1837</a></li>
<li>sqlite3_set_errmsg <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1752">#1752</a></li>
<li>Bump sqlite3-parser version <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1838">#1838</a></li>
<li>Fix UB in ToSqlOutput::from_rc <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1839">#1839</a></li>
<li>Ensure miri doesn't complain <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1840">#1840</a></li>
<li>Bump to actions/checkout@v6 <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1842">#1842</a></li>
<li>Add support to UtcDateTime <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1843">#1843</a>,
<a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1844">#1844</a></li>
<li>Bump bundled SQLite version to 3.53.1 <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1848">#1848</a></li>
<li>Replace some cfg(not by cfg_select <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1850">#1850</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/rusqlite/rusqlite/compare/v0.39.0...v0.40.0">https://github.com/rusqlite/rusqlite/compare/v0.39.0...v0.40.0</a></p>
<h2>0.39.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix constraints on VTab Aux data <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1778">#1778</a>,
<a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1771">#1771</a></li>
<li>Fix docs.rs generation <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1779">#1779</a></li>
<li>Fix a small typo in <code>rollback_hook</code> docstring <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1780">#1780</a></li>
<li>Fix some warnings from Intellij <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1781">#1781</a></li>
<li>Minimal doc for features <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1783">#1783</a></li>
<li>Clear hooks only for owning connections <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1785">#1785</a>,
<a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1784">#1784</a></li>
<li>Fix link to SQLite C Interface, Prepare Flags <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1787">#1787</a></li>
<li>Comment functions which are not usable from a loadable extension <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1789">#1789</a></li>
<li>Factorize code <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1792">#1792</a></li>
<li>Update getrandom to 0.4 <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1798">#1798</a></li>
<li>Update Cargo.toml <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1800">#1800</a></li>
<li>Fix appveyor <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1807">#1807</a></li>
<li>Add support to unix timestamp for chrono, jiff and time <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1808">#1808</a>,
<a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1803">#1803</a></li>
<li>fix(trace): check that the sql string pointer is not NULL <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1805">#1805</a></li>
<li>Bump bundled SQLite version to 3.51.3 <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1818">#1818</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6d3c282dc5"><code>6d3c282</code></a>
Merge pull request <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1856">#1856</a>
from gwenn/0.40.1</li>
<li><a
href="2ba28b7469"><code>2ba28b7</code></a>
Prepare next release</li>
<li><a
href="a021dc730d"><code>a021dc7</code></a>
Merge pull request <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1854">#1854</a>
from gwenn/savepoint</li>
<li><a
href="534a149f8d"><code>534a149</code></a>
Merge pull request <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1855">#1855</a>
from gwenn/hashlink</li>
<li><a
href="6d9764f269"><code>6d9764f</code></a>
Bump hashlink version</li>
<li><a
href="fa574ebb1c"><code>fa574eb</code></a>
Use <code>sqlite3_keyword_check</code></li>
<li><a
href="15385cc046"><code>15385cc</code></a>
Fix SQL injection when SAVEPOINT name is tainted</li>
<li><a
href="e5e48f2d0c"><code>e5e48f2</code></a>
Merge pull request <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1853">#1853</a>
from gwenn/3.53.2</li>
<li><a
href="ac222923ff"><code>ac22292</code></a>
Bump bundled SQLite version to 3.53.2</li>
<li><a
href="c5f8828f72"><code>c5f8828</code></a>
Merge pull request <a
href="https://redirect.github.com/rusqlite/rusqlite/issues/1852">#1852</a>
from gwenn/clippy</li>
<li>Additional commits viewable in <a
href="https://github.com/rusqlite/rusqlite/compare/v0.32.1...v0.40.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rusqlite&package-manager=cargo&previous-version=0.32.1&new-version=0.40.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 17:32:06 -05:00
Ruben A.
e530de5ad2
feat(rust): port CodeCompressor AST compressor to Rust (parity-only) (#1154)
Adds crates/headroom-core/src/transforms/code_compressor.rs (1,882 lines): the
AST-aware CodeCompressor ported to Rust on tree-sitter, with grammars for
Python, JavaScript, TypeScript, Go, Rust, Java, C and C++.

Parity-only, like #1153. Nothing calls it: the only references outside the
module are the pub mod / pub use declarations in transforms/mod.rs, and
live_zone.rs still routes SourceCode to a no-op. The pyo3 bridge is untouched
and no Python source changes, so the engine is unreachable from the shipped
package. #1155 wires it into live-zone dispatch.

Every grammar is pinned with '=' to the exact version of the corresponding
Python tree-sitter-<lang> PyPI wheel. Same version on crates.io and PyPI means
the same grammar.js, hence the same generated parser.c, hence node-for-node
identical ASTs — the precondition for byte-parity. A canary over 9 samples x 8
languages confirmed identical node-type and line-span trees at these pins;
bumping any pin requires re-running it and re-recording the fixtures.

Ships 30 recorded parity fixtures, a CodeCompressorComparator in
headroom-parity, and scripts/record_code_compressor_fixtures.py.

Verified byte-identical to the recorded Python output:

  [code_aware_compressor] total=30 matched=30 skipped=0 diffed=0

Full harness on the merge result: 227 fixtures, 182 matched, 45 skipped
(cache_aligner + ccr stubs), 0 diffed, exit 0 — with kompress at 21/21 under
ONNX Runtime 1.24.4 (see #2591).

Also verified cargo check -p headroom-core --no-default-features passes, so the
static-musl path stays intact.
2026-07-27 09:21:57 -07:00
dependabot[bot]
3266ed7641
deps: bump the cargo-minor-patch group with 10 updates (#2284)
Bumps the cargo-minor-patch group with 10 updates:

| Package | From | To |
| --- | --- | --- |
| [clap](https://github.com/clap-rs/clap) | `4.6.1` | `4.6.2` |
| [aws-sigv4](https://github.com/smithy-lang/smithy-rs) | `1.4.5` |
`1.5.1` |
| [aws-config](https://github.com/smithy-lang/smithy-rs) | `1.8.18` |
`1.9.0` |
| [regex](https://github.com/rust-lang/regex) | `1.12.4` | `1.13.1` |
| [toml](https://github.com/toml-rs/toml) | `1.1.2+spec-1.1.0` |
`1.1.3+spec-1.1.0` |
| [fastembed](https://github.com/Anush008/fastembed-rs) | `5.17.2` |
`5.17.3` |
| [uuid](https://github.com/uuid-rs/uuid) | `1.23.4` | `1.24.0` |
| [http-body-util](https://github.com/hyperium/http-body) | `0.1.3` |
`0.1.4` |
| [lru](https://github.com/jeromefroe/lru-rs) | `0.18.0` | `0.18.1` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.66` | `1.2.67` |

Updates `clap` from 4.6.1 to 4.6.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/releases">clap's
releases</a>.</em></p>
<blockquote>
<h2>v4.6.2</h2>
<h2>[4.6.2] - 2026-07-15</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Say <code>alias</code> when there is only one</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/clap-rs/clap/blob/master/CHANGELOG.md">clap's
changelog</a>.</em></p>
<blockquote>
<h2>[4.6.2] - 2026-07-15</h2>
<h3>Fixes</h3>
<ul>
<li><em>(help)</em> Say <code>alias</code> when there is only one</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0fe0be3027"><code>0fe0be3</code></a>
chore: Release</li>
<li><a
href="480af9d045"><code>480af9d</code></a>
docs: Update changelog</li>
<li><a
href="2b3ddd0294"><code>2b3ddd0</code></a>
Merge pull request <a
href="https://redirect.github.com/clap-rs/clap/issues/6340">#6340</a>
from liskin/fix-completion-escape</li>
<li><a
href="7ffe7399ff"><code>7ffe739</code></a>
fix(complete): Do not suggest options after &quot;--&quot;</li>
<li><a
href="d47fc4f8a5"><code>d47fc4f</code></a>
test(complete): Options suggested after escape (<code>--</code>)</li>
<li>See full diff in <a
href="https://github.com/clap-rs/clap/compare/clap_complete-v4.6.1...clap_complete-v4.6.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `aws-sigv4` from 1.4.5 to 1.5.1
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `aws-config` from 1.8.18 to 1.9.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `regex` from 1.12.4 to 1.13.1
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/regex/blob/master/CHANGELOG.md">regex's
changelog</a>.</em></p>
<blockquote>
<h1>1.13.1 (2026-07-15)</h1>
<p>This is a release that fixes a bug where incorrect regex match
offsets could be
reported. Note that this doesn't impact whether a match occurs or not,
just
where it occurs. The match offsets are still valid for slicing, they
just may
not refer to the correct leftmost-first match. See
<a
href="https://redirect.github.com/rust-lang/regex/pull/1364">#1364</a>
for (many) more details.</p>
<p>Bug fixes:</p>
<ul>
<li><a
href="https://redirect.github.com/rust-lang/regex/issues/1354">#1354</a>:
Fixes previously unsound reverse suffix and inner optimizations.</li>
</ul>
<h1>1.13.0 (2026-07-09)</h1>
<p>This release includes a new API, a <code>regex!</code> macro, for
lazy compilation of
a regex from a string literal. If you use regexes a lot, it's likely
you've
already written one exactly like it. The new macro can be used like
this:</p>
<pre lang="rust"><code>use regex::regex;
<p>fn is_match(line: &amp;str) -&gt; bool {<br />
// The regex will be compiled approximately once and reused
automatically.<br />
// This avoids the footgun of using <code>Regex::new</code> here, which
would<br />
// guarantee that it would be compiled every time this routine is
called.<br />
// This would likely make this routine much slower than it needs to
be.<br />
regex!(r&quot;bar|baz&quot;).is_match(line)<br />
}</p>
<p>let hay = &quot;<br />
path/to/foo:54:Blue Harvest<br />
path/to/bar:90:Something, Something, Something, Dark Side<br />
path/to/baz:3:It's a Trap!<br />
&quot;;</p>
<p>let matches = hay.lines().filter(|line| is_match(line)).count();<br
/>
assert_eq!(matches, 2);<br />
</code></pre></p>
<p>Improvements:</p>
<ul>
<li><a
href="https://redirect.github.com/rust-lang/regex/issues/709">#709</a>:
Add a new <code>regex!</code> macro for efficient and automatic reuse of
a compiled regex.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2b527599eb"><code>2b52759</code></a>
1.13.1, redux</li>
<li><a
href="40e98238ff"><code>40e9823</code></a>
1.13.1</li>
<li><a
href="75fcb962d6"><code>75fcb96</code></a>
changelog: 1.13.1</li>
<li><a
href="64ad0b618e"><code>64ad0b6</code></a>
automata: fix bug in reverse suffix/inner optimization</li>
<li><a
href="fa91c31a42"><code>fa91c31</code></a>
automata: fix a bug caught by Codex review</li>
<li><a
href="30390ec3e8"><code>30390ec</code></a>
automata: formatting tweaks</li>
<li><a
href="821a8eb1ad"><code>821a8eb</code></a>
automata: refactor reverse suffix/inner search slightly</li>
<li><a
href="10afd704d8"><code>10afd70</code></a>
automata: expose the extracted literals for inner literal
extraction</li>
<li><a
href="8c34f41d3c"><code>8c34f41</code></a>
automata: avoid reverse suffix optimization for non-leftmost-first</li>
<li><a
href="5524f02430"><code>5524f02</code></a>
test: add regression tests for failed reverse suffix/inner
optimizations</li>
<li>Additional commits viewable in <a
href="https://github.com/rust-lang/regex/compare/1.12.4...1.13.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `toml` from 1.1.2+spec-1.1.0 to 1.1.3+spec-1.1.0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="eb251609a3"><code>eb25160</code></a>
chore: Release</li>
<li><a
href="f36fb52c37"><code>f36fb52</code></a>
docs: Update changelog</li>
<li><a
href="3adbbb7860"><code>3adbbb7</code></a>
fix(writer): Don't overflow (<a
href="https://redirect.github.com/toml-rs/toml/issues/1189">#1189</a>)</li>
<li><a
href="fb0c1b376d"><code>fb0c1b3</code></a>
fix(writer): Don't overflow</li>
<li><a
href="5e70a7031d"><code>5e70a70</code></a>
test(writer): Add overflow test</li>
<li><a
href="771a975840"><code>771a975</code></a>
chore: Upgrade toml-test (<a
href="https://redirect.github.com/toml-rs/toml/issues/1186">#1186</a>)</li>
<li><a
href="28f6c9cbc8"><code>28f6c9c</code></a>
chore: Upgrade toml-test</li>
<li><a
href="30d75ca443"><code>30d75ca</code></a>
chore(deps): Update Prek to v0.4.9 (<a
href="https://redirect.github.com/toml-rs/toml/issues/1185">#1185</a>)</li>
<li><a
href="17efe57deb"><code>17efe57</code></a>
chore(deps): Update Rust Stable to v1.97 (<a
href="https://redirect.github.com/toml-rs/toml/issues/1184">#1184</a>)</li>
<li><a
href="c9d0d54b21"><code>c9d0d54</code></a>
style: Make clippy happy</li>
<li>Additional commits viewable in <a
href="https://github.com/toml-rs/toml/compare/toml-v1.1.2...toml-v1.1.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `fastembed` from 5.17.2 to 5.17.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Anush008/fastembed-rs/releases">fastembed's
releases</a>.</em></p>
<blockquote>
<h2>v5.17.3</h2>
<h2><a
href="https://github.com/Anush008/fastembed-rs/compare/v5.17.2...v5.17.3">5.17.3</a>
(2026-07-15)</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update candle-core requirement from 0.10.2 to 0.11.0 by
<a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/Anush008/fastembed-rs/pull/270">Anush008/fastembed-rs#270</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Anush008/fastembed-rs/compare/v5.17.2...v5.17.3">https://github.com/Anush008/fastembed-rs/compare/v5.17.2...v5.17.3</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4e9dc551ba"><code>4e9dc55</code></a>
chore(release): 5.17.3 [skip ci]</li>
<li><a
href="3fd10f984f"><code>3fd10f9</code></a>
chore(deps): update candle-core requirement from 0.10.2 to 0.11.0 (<a
href="https://redirect.github.com/Anush008/fastembed-rs/issues/270">#270</a>)</li>
<li>See full diff in <a
href="https://github.com/Anush008/fastembed-rs/compare/v5.17.2...v5.17.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `uuid` from 1.23.4 to 1.24.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/uuid-rs/uuid/releases">uuid's
releases</a>.</em></p>
<blockquote>
<h2>v1.24.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(fmt): support encoding into MaybeUninit buffers by <a
href="https://github.com/weifanglab"><code>@​weifanglab</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/892">uuid-rs/uuid#892</a></li>
<li>Prepare for 1.24.0 release by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/896">uuid-rs/uuid#896</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/weifanglab"><code>@​weifanglab</code></a> made
their first contribution in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/892">uuid-rs/uuid#892</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/uuid-rs/uuid/compare/v1.23.5...v1.24.0">https://github.com/uuid-rs/uuid/compare/v1.23.5...v1.24.0</a></p>
<h2>v1.23.5</h2>
<h2>What's Changed</h2>
<ul>
<li>doc: Fix broken link by <a
href="https://github.com/frostyplanet"><code>@​frostyplanet</code></a>
in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/891">uuid-rs/uuid#891</a></li>
<li>perf: Optimize UUID hex parsing and formatting by <a
href="https://github.com/geeknoid"><code>@​geeknoid</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/894">uuid-rs/uuid#894</a></li>
<li>Prepare for 1.23.5 release by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/895">uuid-rs/uuid#895</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/geeknoid"><code>@​geeknoid</code></a>
made their first contribution in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/894">uuid-rs/uuid#894</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/uuid-rs/uuid/compare/v1.23.4...v1.23.5">https://github.com/uuid-rs/uuid/compare/v1.23.4...v1.23.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6a8aeab3d0"><code>6a8aeab</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/896">#896</a> from
uuid-rs/cargo/v1.24.0</li>
<li><a
href="e6db8ec087"><code>e6db8ec</code></a>
prepare for 1.24.0 release</li>
<li><a
href="606f2365c7"><code>606f236</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/892">#892</a> from
weifanglab/main</li>
<li><a
href="ab848dbdf6"><code>ab848db</code></a>
feat(fmt): support encoding into MaybeUninit buffers</li>
<li><a
href="5dc6b3d1a9"><code>5dc6b3d</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/895">#895</a> from
uuid-rs/cargo/v1.23.5</li>
<li><a
href="5a7dfe50e2"><code>5a7dfe5</code></a>
prepare for 1.23.5 release</li>
<li><a
href="9b4bfc8fe3"><code>9b4bfc8</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/894">#894</a> from
geeknoid/main</li>
<li><a
href="5acc5a550e"><code>5acc5a5</code></a>
perf: Optimize UUID hex parsing and formatting</li>
<li><a
href="6fa1a1e38a"><code>6fa1a1e</code></a>
feat(fmt): support encoding into MaybeUninit buffers</li>
<li><a
href="1e5d867954"><code>1e5d867</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/891">#891</a> from
frostyplanet/doc</li>
<li>Additional commits viewable in <a
href="https://github.com/uuid-rs/uuid/compare/v1.23.4...v1.24.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `http-body-util` from 0.1.3 to 0.1.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/hyperium/http-body/releases">http-body-util's
releases</a>.</em></p>
<blockquote>
<h2>http-body-util-v0.1.4</h2>
<h2>What's Changed</h2>
<ul>
<li>Add <code>Fused</code> body combinator that always returns
<code>None</code> once completed.</li>
<li>Add <code>BodyExt::into_stream()</code> to convert a body into a
<code>Stream</code>.</li>
<li>Add <code>Full::into_inner()</code> to get the full
<code>Buf</code>.</li>
<li>Add <code>InspectFrame</code> and <code>InspectErr</code>
combinators.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="768504721c"><code>7685047</code></a>
http-body-util v0.1.4</li>
<li><a
href="3396328602"><code>3396328</code></a>
http-body v1.1.0</li>
<li><a
href="2fb78de9c8"><code>2fb78de</code></a>
chore: bump license year (<a
href="https://redirect.github.com/hyperium/http-body/issues/170">#170</a>)</li>
<li><a
href="b16554b604"><code>b16554b</code></a>
chore(ci): bump checkout to v7</li>
<li><a
href="c0c53caee7"><code>c0c53ca</code></a>
chore(ci): use msrv aware update for msrv job</li>
<li><a
href="5ed15d2c3d"><code>5ed15d2</code></a>
tests: fix clippy::double_parens</li>
<li><a
href="c8cb37f9ce"><code>c8cb37f</code></a>
Derive <code>Copy</code> trait to <code>SizeHint</code> struct (<a
href="https://redirect.github.com/hyperium/http-body/issues/164">#164</a>)</li>
<li><a
href="915d6d5cbb"><code>915d6d5</code></a>
feat(util): add <code>InspectErr</code>, <code>InspectFrame</code>
combinators (<a
href="https://redirect.github.com/hyperium/http-body/issues/161">#161</a>)</li>
<li><a
href="0fc0a9415c"><code>0fc0a94</code></a>
docs: fix broken intradoc links (<a
href="https://redirect.github.com/hyperium/http-body/issues/162">#162</a>)</li>
<li><a
href="5a849d49dc"><code>5a849d4</code></a>
chore: add FUNDING.yml</li>
<li>Additional commits viewable in <a
href="https://github.com/hyperium/http-body/compare/http-body-util-v0.1.3...http-body-util-v0.1.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `lru` from 0.18.0 to 0.18.1
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/jeromefroe/lru-rs/blob/master/CHANGELOG.md">lru's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/jeromefroe/lru-rs/tree/0.18.1">v0.18.1</a> -
2026-07-09</h2>
<ul>
<li>Add <code>find_and_promote</code> method.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c6620d1165"><code>c6620d1</code></a>
Merge pull request <a
href="https://redirect.github.com/jeromefroe/lru-rs/issues/237">#237</a>
from jeromefroe/jerome/prepare-0-18-1-release</li>
<li><a
href="da3c0fc276"><code>da3c0fc</code></a>
Prepare 0.18.1 release</li>
<li><a
href="11662633b9"><code>1166263</code></a>
Merge pull request <a
href="https://redirect.github.com/jeromefroe/lru-rs/issues/236">#236</a>
from pixmaip/find-and-promote</li>
<li><a
href="2daba12567"><code>2daba12</code></a>
Apply suggestions from code review</li>
<li><a
href="2ea00dc674"><code>2ea00dc</code></a>
feat: add find_and_promote API</li>
<li>See full diff in <a
href="https://github.com/jeromefroe/lru-rs/compare/0.18.0...0.18.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `cc` from 1.2.66 to 1.2.67
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/releases">cc's
releases</a>.</em></p>
<blockquote>
<h2>cc-v1.2.67</h2>
<h3>Other</h3>
<ul>
<li>Fix clippy warning (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1788">#1788</a>)</li>
<li>Regenerate target info (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1785">#1785</a>)</li>
<li>Add support for <code>aarch64-unknown-linux-pauthtest</code> target
(<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1713">#1713</a>)</li>
<li>Fix nightly compilation error (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1783">#1783</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md">cc's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.2.66...cc-v1.2.67">1.2.67</a>
- 2026-07-11</h2>
<h3>Other</h3>
<ul>
<li>Fix clippy warning (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1788">#1788</a>)</li>
<li>Regenerate target info (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1785">#1785</a>)</li>
<li>Add support for <code>aarch64-unknown-linux-pauthtest</code> target
(<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1713">#1713</a>)</li>
<li>Fix nightly compilation error (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1783">#1783</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fa031a077a"><code>fa031a0</code></a>
chore(cc): release v1.2.67 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1789">#1789</a>)</li>
<li><a
href="842aab16d2"><code>842aab1</code></a>
Bump taiki-e/install-action from 2.81.8 to 2.82.8 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1786">#1786</a>)</li>
<li><a
href="e2f07d0d68"><code>e2f07d0</code></a>
Fix clippy warning (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1788">#1788</a>)</li>
<li><a
href="8ced615d2c"><code>8ced615</code></a>
Regenerate target info (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1785">#1785</a>)</li>
<li><a
href="2943b52512"><code>2943b52</code></a>
Add missing todo for deprecated API</li>
<li><a
href="43ae1bf3ff"><code>43ae1bf</code></a>
Add support for <code>aarch64-unknown-linux-pauthtest</code> target (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1713">#1713</a>)</li>
<li><a
href="a5c584a1fa"><code>a5c584a</code></a>
Fix nightly compilation error (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1783">#1783</a>)</li>
<li>See full diff in <a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.2.66...cc-v1.2.67">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-21 11:20:59 -05:00
Zhenjia ZHOU
4035c04187
feat(text-crusher): CJK-aware segmentation + relevance via ICU (#1504)
## Description

`TextCrusher` (the native extractive prose compressor added in #1171)
only handled ASCII: `split_segments` split on `.!?`+whitespace and
`tokens` split on whitespace/alphanumeric runs. CJK
(Chinese/Japanese/Korean) has neither spaces nor ASCII terminators, so a
whole CJK paragraph collapsed into **one segment / one token** — it
passed through at ~0% compression, and BM25 relevance + salience scored
zero terms.

This makes `TextCrusher` CJK-aware. CJK-bearing content takes an ICU
(`icu_segmenter`, UAX#29 sentence + dictionary word) segmentation path,
with a length fallback for terminator-sparse runs, a local BM25 over the
ICU word tokens, and ICU-token salience. Dispatch is on **content
only**, so pure-ASCII text is byte-identical to before — the shared
`BM25Scorer` and the ASCII path are untouched.

It also adds a committed, reproducible answer-retention eval
(`benchmarks/i18n_compression_eval.py`) with a deterministic zh/ja/ko CI
regression gate, so the improvement below is permanently verifiable
rather than a one-off measurement.

Extends #1171.

## Type of Change

- [x] Bug fix (CJK passed through near-uncompressed)
- [x] New feature (CJK segmentation / relevance support)
- [x] Performance improvement (CJK now compresses; ICU segmenters
cached, not rebuilt per call)

## Changes Made

- `is_cjk` predicate gates a CJK path (ideographs, kana, Hangul, CJK
punctuation, full/half-width forms).
- `split_segments` → ICU `SentenceSegmenter` for CJK + a mandatory
length fallback (whitespace / CJK punctuation / hard cap) for
terminator-sparse runs; ASCII path unchanged.
- `tokens` → ICU `WordSegmenter` (dictionary) for CJK; ASCII path
unchanged.
- `relevance_cjk`: a local BM25 over ICU word tokens — the shared ASCII
`BM25Scorer` scores zero terms for CJK and is parity-locked, so this is
an intentional separate scorer (documented in code).
- CJK salience uses ICU tokens (whitespace-split gave one giant "word" →
zero salience).
- `count_tokens`: CJK-aware so `compression_ratio` isn't nonsense for
space-free text.
- ICU segmenters resolved once in `static LazyLock` (compiled_data is
static) instead of rebuilt per call.
- New dep `icu_segmenter` 2.2, `compiled_data` only (see Dependency
below).
- `benchmarks/i18n_compression_eval.py` +
`tests/test_transforms/test_text_crusher_cjk_eval.py`: a zh/ja/ko
answer-retention eval — a deterministic needle CI gate (always-runs, no
external data), real-transcript fidelity with CJK-aware salient, and
optional `multi-wiki-qa` natural-data retention (loaded via the
`[evals]` `datasets` extra, skipped if absent; data never vendored —
CC-BY-NC-SA).

## Testing

- [x] Unit tests pass (`pytest` + `cargo test`)
- [x] Linting passes (`ruff check`/`format` on the new eval + test —
clean)
- [ ] Type checking passes (`mypy headroom`) — N/A, the only Python
added is a benchmark + test, not `headroom/` source
- [x] New tests added for new functionality
- [x] Manual testing performed (see Real Behavior Proof)

### Test Output

```text
$ cargo test -p headroom-core --lib text_crusher
running 12 tests
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 841 filtered out

$ .venv/bin/python -m pytest tests/test_transforms/test_text_crusher*.py
15 passed

$ .venv/bin/python -m pytest tests/test_transforms/test_text_crusher_cjk_eval.py
6 passed   # deterministic zh/ja/ko needle CI gate

$ cargo clippy -p headroom-core && ruff check benchmarks/i18n_compression_eval.py   # both clean
```

## Real Behavior Proof

- Environment: macOS (Darwin 25.3.0), Python in a uv venv,
`headroom-core` built via `uv pip install -e .` (maturin), branch
`feat/cjk-text-compression`.
- Exact command / steps: built `_core`, then ran a mixed
Chinese+Japanese doc (no spaces, `。` terminators) through
`TextCrusher().compress(doc, "认证令牌缓存策略", 0.3)`; separately evaluated
answer-retention on the public CMRC2018 Chinese QA dev set (bury the
gold-answer paragraph among 25 distractors, query = the question,
compress to 30%, check the gold answer survives), and end-to-end through
`ContentRouter`.
- Observed result: a mixed Chinese+Japanese doc compressed 189 → 78
tokens (ratio 0.41, kept 3/8 segments) with the query-relevant sentence
surviving — before this change the same doc was a single segment → 100%
passthrough. On the public CMRC2018 Chinese QA dev set, answer-retention
under 30% compression rose 34% → 93% (multiple seeds). End-to-end
through `ContentRouter` on real CJK content, aggregate savings rose 16%
→ 40%. Pure-ASCII (English) output stayed byte-identical (the English
parity fixtures did not move). Demo terminal output:

    ```text
    ORIGINAL  tokens= 189  chars=189
    COMPRESS  tokens=  78  ratio=0.41  segments kept 3/8
    QUERY-RELEVANT sentence survived: True
    --- compressed output (verbatim kept CJK sentences) ---
    认证令牌的缓存策略采用最近最少使用淘汰算法来管理过期条目。
    请求重试使用指数退避并设置最大次数上限。
    数据备份每天凌晨执行并保留最近三十天的快照。
    ```
The committed eval now demonstrates this across all three CJK languages.
The deterministic needle gate (in CI via
`tests/test_transforms/test_text_crusher_cjk_eval.py`, 6 passed) has
TextCrusher keep the query-relevant needle while truncate/random drop it
in zh, ja, and ko. On real `multi-wiki-qa` natural data (n=80/lang),
query-aware answer-retention is **zh 74% / ja 70% / ko 50%** vs
**25–41%** for the truncate/random baselines:

    ```text
=== Part A: multi-wiki-qa answer-retention (n=80/lang, target_ratio=0.3)
===
      lang    text_crusher  truncate  random
      zh-cn           74%       25%     38%
      ja              70%       31%     39%
      ko              50%       26%     41%
    ```
Korean is measurably weaker (ICU has no Korean dictionary and falls back
to UAX#29 word-breaking) — still well above baselines, and scoped as a
follow-up.
- Not tested: the live proxy HTTP path (validated at the `ContentRouter`
/ `TextCrusher` layer, not via a running proxy); no-space Korean
(standard Korean is space-delimited and is covered); non-CJK SE-Asian
scripts (out of scope).

## Dependency (per CONTRIBUTING supply-chain policy)

`icu_segmenter` 2.2 (ICU4X), `features = ["compiled_data"]`:

- **Why this package (vs. ourselves / existing deps):** CJK needs
dictionary/UAX#29 segmentation. A hand-rolled char-bigram scored
slightly worse on real data (CMRC2018 answer-retention: 92.5% ICU vs 91%
bigram, 4 seeds); jieba/lindera are ZH-only or 13–207 MB dicts. ICU4X
covers zh/ja/ko in one crate. The existing `unicode-segmentation` does
UAX#29 only (no CJK dictionary), so it can't word-segment space-free
CJK.
- **Who maintains it:** the official `unicode-org` ICU4X project; active
release cadence (2.2 in 2025); no known CVEs.
- **Install surface:** ~13 new pure-Rust crates, no build scripts, no
native code, no build/runtime network. `compiled_data` bundles locale
data at compile time (hermetic). `auto`/`lstm` deliberately NOT enabled
— LSTM covers SE-Asian scripts (Thai/Lao), not CJK, and would pull in
`libm` for nothing.
- **Why this version:** 2.x is the stabilized ICU4X API (1.x used a
different data-provider model); floored at 2.2 (Cargo.lock pins the
patch) since segmenter boundaries are observable in output and bumps
should be deliberate.

## 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 (CHANGELOG)
- [x] My changes generate no new warnings (clippy + fmt clean)
- [x] I have added tests that prove my feature works
- [x] New and existing unit tests pass locally with my changes
- [x] I have updated the CHANGELOG.md

## Additional Notes

- **Parity:** the shared `BM25Scorer` (byte-exact parity-locked with
`headroom/relevance/bm25.py`) is untouched. `relevance_cjk` is a
separate local scorer because the shared one's tokenizer is ASCII-only.
The whole CJK path lives in Rust (`text_crusher.py` is a thin wrapper
over `_core`), so there is no Python mirror to keep in sync; the parity
fixtures stay green (only the CJK `unicode` fixture was re-recorded,
intentionally; English fixtures unchanged).
- **Known by-design gap (not a bug):** CJK content + a pure-ASCII query
yields no token overlap, so relevance falls back to recency + salience
(cross-script query matching is unsupported).
- The Python added is a benchmark
(`benchmarks/i18n_compression_eval.py`) plus its test, not `headroom/`
runtime source — both are `ruff`-clean; `mypy headroom` is unaffected.
- **License:** the optional Part A pulls `alexandrainst/multi-wiki-qa`
(CC-BY-NC-SA-4.0) at run time via the `[evals]` extra and is skipped if
absent — the dataset is never vendored into the repo, and the always-run
CI gate (Part C) uses only our own deterministic data.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 19:58:48 +00:00
Parideboy
c46cd8f950
fix(core): load ONNX Runtime dynamically so headroom._core imports on non-AVX2 x86-64 (#1715)
## Description

`import headroom._core` dies with SIGILL (`Illegal instruction`) on
x86-64 CPUs without AVX2 (Pentium N4200, Celeron N4500, AMD FX 8350 —
all reported on the issue). The repo sets no `RUSTFLAGS`/`target-cpu`
anywhere, so first-party Rust code is baseline x86-64; the AVX2 code
comes from Microsoft's prebuilt ONNX Runtime, statically linked into the
extension by fastembed's `ort-download-binaries-rustls-tls` feature on
non-Windows targets. Because it is statically linked, its code is mapped
and initialized when the extension module loads — **before** the runtime
AVX2 guard from #1162 can run, which is why that fix helped Magika init
but not the import-time crash.

Fix, mirroring what Windows already does for its own reasons (DirectML
link libs): build with `ort-load-dynamic` on every platform, so ONNX
Runtime is only `dlopen`'d at first use, where the #1162 AVX2 guard
falls back to the non-ONNX detection tiers on unsupported CPUs. Since
both target blocks became identical, they are collapsed into one
platform-independent `fastembed` dependency.

To keep Magika/fastembed working out of the box on Linux/macOS, the
existing `ORT_DYLIB_PATH` auto-pin (`headroom/_ort.py`, previously
Windows-only) now resolves the pip `onnxruntime` package's shared
library on all platforms (`onnxruntime.dll` / `libonnxruntime.so*` /
`libonnxruntime*.dylib`). The pip `onnxruntime` CPU wheels use runtime
CPU dispatch, so they also work on pre-AVX2 machines — non-AVX2 users
get working ML detection instead of a crash. Without the `onnxruntime`
package, ML detection degrades gracefully to the non-ONNX tiers exactly
as it already does on Windows.

Fixes #1278

## 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

- `crates/headroom-core/Cargo.toml`: replaced the per-target `fastembed`
blocks (`ort-download-binaries-rustls-tls` on non-Windows,
`ort-load-dynamic` on Windows) with a single platform-independent
dependency on `ort-load-dynamic`, with a comment documenting both the
DirectML and the AVX2/#1278 rationale.
- `Cargo.lock`: regenerated — `ort-sys` drops its static-download
dependencies (`hmac-sha256`, `lzma-rust2`, `ureq`); no version bumps.
- `headroom/_ort.py`: `ORT_DYLIB_PATH` auto-pin extended from
Windows-only to all platforms via a small `_find_dylib` helper that
resolves the platform's shared-library name inside the pip `onnxruntime`
package.
- `tests/test_transforms/test_ort_dylib.py`: replaced the obsolete
`test_noop_on_non_windows` with Linux (versioned `.so`) and macOS
(`.dylib`) pin tests; module docstring updated.
- `docs/content/docs/configuration.mdx`: `ORT_DYLIB_PATH` row updated
from Windows-only wording to the cross-platform behavior.

## Testing

- [x] Unit tests pass (`pytest`)
- [x] Linting passes (`ruff check .`)
- [x] Type checking passes (`mypy headroom`)
- [x] New tests added for new functionality
- [x] Manual testing performed

### Test Output

```text
$ cargo fmt --all -- --check && cargo clippy --workspace -- -D warnings && cargo test -p headroom-core --lib
clean
test result: 844 passed; 0 failed; 1 ignored

$ python -m pytest tests/test_transforms/test_ort_dylib.py -q
8 passed

$ ruff check headroom/_ort.py tests/test_transforms/test_ort_dylib.py
All checks passed!
```

## Real Behavior Proof

- Environment: Windows 11 (AVX2-capable — the SIGILL itself is not
reproducible on this machine), Python 3.13, Rust 1.95.0, local checkout
branched from `upstream/main` (9fbd47ba).
- Exact command / steps: `cargo check -p headroom-core` after the
feature switch; inspected the `Cargo.lock` diff; rebuilt and ran `python
-c "import headroom; from headroom._core import detect_content_type;
print(detect_content_type('hello world'))"`; ran the ort-pin test suite
with monkeypatched `linux`/`darwin` platforms.
- Observed result: build succeeds with `ort-load-dynamic`; the lockfile
shows `ort-sys` no longer pulls the binary-download machinery
(`hmac-sha256`, `lzma-rust2`, `ureq` removed), confirming the
statically-linked prebuilt ORT is gone; import + content detection works
with `ORT_DYLIB_PATH` auto-pinned to the pip onnxruntime library; all 8
pin tests pass including the new Linux/macOS branches.
- Not tested: actual pre-AVX2 x86-64 hardware (none available — the fix
removes AVX2 code from the import path by construction, and the issue
reporters on #1278 can verify); Linux/macOS wheel runtime behavior
beyond CI's ubuntu/macOS wheel-build jobs; embedding quality/performance
under a pip-provided ORT version differing from the previously vendored
one.

## Review Readiness

- [x] I have performed a self-review
- [x] This PR is ready for human review

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-07-14 13:25:41 -04:00
JD Davis
2c9eb7c5f1
feat(simulators): add provider simulator service (#2014)
## Description  
Adds a Rust-only `headroom-simulators` workspace crate: a deterministic
local upstream simulator service for Headroom proxy and pipeline
validation. It supplies configurable stubs plus bottled provider-shaped
responses for supported provider/path surfaces without calling real
LLMs.

## Type of Change  
- [x] Bug fix (non-breaking change that fixes an issue)  
- [x] 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  
- Added `crates/headroom-simulators` Rust crate with library and
`headroom-simulators` binary.
- Added clean domain classification for supported surfaces: Anthropic
`/v1/messages`, OpenAI chat/responses/conversations, Bedrock
invoke/stream routes, Vertex raw/stream predict, health, and generic
fallback.
- Added JSON-configured stub matching by method, path, body substring,
and JSON pointer.
- Added bottled provider-shaped JSON, SSE, and Bedrock EventStream
responses for unconfigured requests.
- Added a container `Dockerfile` and README for local/GitHub Actions
usage.
- Added unit and HTTP integration tests for defaults, configured stubs,
SSE, Vertex, and Bedrock EventStream behavior.
- Added proxy-level simulator-backed E2E tests that run Headroom against
the simulator across Anthropic, OpenAI Chat, OpenAI Responses, OpenAI
Conversations, Bedrock invoke/converse/streaming, Vertex raw/stream
predict, and upstream health.
- Added simulator-backed provider error-path E2E coverage for OpenAI
429, Anthropic 529, Bedrock 502, and Vertex 503 responses flowing
through Headroom unchanged.
- Added Headroom-owned preflight error E2E coverage proving Bedrock
missing credentials and invalid Vertex envelopes stop inside the proxy
instead of silently falling through to the simulator/provider.
- Fixed direct Rust `headroom-core` binaries/tests on Windows so Magika
initializes ONNX Runtime via `ort::init_from` from an explicit pip
`onnxruntime` library path, with fail-fast fallback only when no safe
runtime is discoverable.
- Added a Rust CI `simulator-e2e` matrix for `ubuntu-latest`,
`macos-latest`, and `windows-latest` that runs `cargo test -p
headroom-proxy --test e2e_simulators`.
- Gated dynamic Magika `Path`/`PathBuf` imports to Windows and x86_64
macOS so Linux clippy does not see unused dynamic-ORT-only imports.

## Testing  
- [ ] Unit tests pass (`pytest`)  
- [ ] Linting passes (`ruff check .`)  
- [ ] Type checking passes (`mypy headroom`)  
- [x] New tests added for new functionality  
- [x] Manual testing performed

### Test Output  
cargo fmt --all -- --check  
# passed  

cargo clippy --workspace -- -D warnings  
# passed  

$env:ORT_DYLIB_PATH=$null  
cargo test -p headroom-core transforms::magika_detector::tests:: --lib  
# 17 passed, 0 failed; Magika initialized from discovered pip
onnxruntime DLL

$env:ORT_DYLIB_PATH=$null  
cargo test --workspace  
# passed  

gitleaks protect --staged --no-banner --redact  
# no leaks found  

gitleaks git --log-opts="headroomlabs/main..HEAD" --no-banner --redact  
# 5 commits scanned; no leaks found

## Real Behavior Proof  
- **Environment:** Windows PowerShell, Rust toolchain `1.95.0`, clean
worktree from `headroomlabs/main` at `9bacf481`.
- **Exact simulator command / steps:**  
  - `cargo run -p headroom-simulators -- --listen 127.0.0.1:8789`  
- Point Headroom proxy upstream at `http://127.0.0.1:8789` for local
deterministic provider responses.
- Use optional `--config path/to/simulator.json` to bind exact request
fixtures.
- **Observed simulator result:**  
  - OpenAI chat default returns `chat.completion` shape.  
  - OpenAI Responses stream returns named SSE events.  
  - Vertex raw predict returns Anthropic message shape.  
- Bedrock stream can return binary `application/vnd.amazon.eventstream`
bytes.
  - Configured stubs override bottled defaults.  
- **Observed Magika result:**  
- Direct Rust `headroom-core` tests pass with `ORT_DYLIB_PATH` unset.
- Magika discovers the installed pip `onnxruntime.dll`, loads it via
`ort::init_from`, and only falls back if no safe runtime is available.
- **Not tested:**  
- No live provider calls; simulator behavior is intentionally offline
and deterministic.

## 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  
- [x] My changes generate no new warnings  
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes  
- [ ] I have updated the CHANGELOG.md if applicable

## Screenshots (if applicable)  
N/A

## Additional Notes  
No CHANGELOG entry was added because this introduces a developer/CI
simulator crate plus a Windows direct-Rust Magika runtime fix, without
changing shipped Python package behavior. The simulator intentionally
does not include a lightweight fallback LLM in this slice; unbound
inputs receive deterministic bottled responses so tests stay
reproducible and offline.
2026-07-11 09:41:49 -07:00
dependabot[bot]
5229c98228
deps: bump prometheus from 0.13.4 to 0.14.0 (#1518)
Bumps [prometheus](https://github.com/tikv/rust-prometheus) from 0.13.4
to 0.14.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tikv/rust-prometheus/blob/master/CHANGELOG.md">prometheus's
changelog</a>.</em></p>
<blockquote>
<h2>0.14.0</h2>
<ul>
<li>
<p>API change: Use <code>AsRef&lt;str&gt;</code> for owned label values
(<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/537">#537</a>)</p>
</li>
<li>
<p>Improvement: Hashing improvements (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/532">#532</a>)</p>
</li>
<li>
<p>Dependency upgrade: Update <code>hyper</code> to 1.6 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/524">#524</a>)</p>
</li>
<li>
<p>Dependency upgrade: Update <code>procfs</code> to 0.17 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/543">#543</a>)</p>
</li>
<li>
<p>Dependency upgrade: Update <code>protobuf</code> to 3.7.2 for
RUSTSEC-2024-0437 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/541">#541</a>)</p>
</li>
<li>
<p>Dependency upgrade: Update <code>thiserror</code> to 2.0 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/534">#534</a>)</p>
</li>
<li>
<p>Internal change: Fix LSP and Clippy warnings (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/540">#540</a>)</p>
</li>
<li>
<p>Internal change: Bump MSRV to 1.81 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/539">#539</a>)</p>
</li>
<li>
<p>Documentation: Fix <code>register_histogram_vec_with_registry</code>
docstring (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/528">#528</a>)</p>
</li>
<li>
<p>Documentation: Fix typos in static-metric docstrings (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/479">#479</a>)</p>
</li>
<li>
<p>Documentation: Add missing <code>protobuf</code> feature to README
list (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/531">#531</a>)</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e07efb4f37"><code>e07efb4</code></a>
prometheus: release 0.14.0 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/545">#545</a>)</li>
<li><a
href="26e46ec03a"><code>26e46ec</code></a>
Hashing improvements (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/532">#532</a>)</li>
<li><a
href="e17c5ced2b"><code>e17c5ce</code></a>
build(deps): update procfs requirement from ^0.16 to ^0.17 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/543">#543</a>)</li>
<li><a
href="e5809b7ab9"><code>e5809b7</code></a>
build(deps): update hyper requirement from ^0.14 to ^1.4 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/524">#524</a>)</li>
<li><a
href="4a0e282888"><code>4a0e282</code></a>
Use AsRef&lt;str&gt; for owned label values (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/537">#537</a>)</li>
<li><a
href="c3865f3c40"><code>c3865f3</code></a>
cargo: upgrade to protobuf 3.7 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/541">#541</a>)</li>
<li><a
href="7e4e6f2d33"><code>7e4e6f2</code></a>
docs: fix <code>register_histogram_vec_with_registry</code> docstring
(<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/528">#528</a>)</li>
<li><a
href="5b62f4b78b"><code>5b62f4b</code></a>
Fix LSP and Clippy warnings and errors (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/540">#540</a>)</li>
<li><a
href="52d76fc2d8"><code>52d76fc</code></a>
cargo: bump MSRV to 1.81 (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/539">#539</a>)</li>
<li><a
href="3bd0e82f1f"><code>3bd0e82</code></a>
Upgrade <code>thiserror</code> crate from 1.0 to 2.0 version (<a
href="https://redirect.github.com/tikv/rust-prometheus/issues/534">#534</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tikv/rust-prometheus/compare/v0.13.4...v0.14.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=prometheus&package-manager=cargo&previous-version=0.13.4&new-version=0.14.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-11 10:33:54 -05:00
dependabot[bot]
e448d7ba4d
deps: bump thiserror from 1.0.69 to 2.0.18 (#1519)
Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.69 to
2.0.18.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/thiserror/releases">thiserror's
releases</a>.</em></p>
<blockquote>
<h2>2.0.18</h2>
<ul>
<li>Make compatible with project-level <code>needless_lifetimes =
&quot;forbid&quot;</code> (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/443">#443</a>,
thanks <a
href="https://github.com/LucaCappelletti94"><code>@​LucaCappelletti94</code></a>)</li>
</ul>
<h2>2.0.17</h2>
<ul>
<li>Use differently named __private module per patch release (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/434">#434</a>)</li>
</ul>
<h2>2.0.16</h2>
<ul>
<li>Add to &quot;no-std&quot; crates.io category (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/429">#429</a>)</li>
</ul>
<h2>2.0.15</h2>
<ul>
<li>Prevent <code>Error::provide</code> API becoming unavailable from a
future new compiler lint (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/427">#427</a>)</li>
</ul>
<h2>2.0.14</h2>
<ul>
<li>Allow build-script cleanup failure with NFSv3 output directory to be
non-fatal (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/426">#426</a>)</li>
</ul>
<h2>2.0.13</h2>
<ul>
<li>Documentation improvements</li>
</ul>
<h2>2.0.12</h2>
<ul>
<li>Prevent elidable_lifetime_names pedantic clippy lint in generated
impl (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/413">#413</a>)</li>
</ul>
<h2>2.0.11</h2>
<ul>
<li>Add feature gate to tests that use std (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/409">#409</a>,
<a
href="https://redirect.github.com/dtolnay/thiserror/issues/410">#410</a>,
thanks <a
href="https://github.com/Maytha8"><code>@​Maytha8</code></a>)</li>
</ul>
<h2>2.0.10</h2>
<ul>
<li>Support errors containing a generic type parameter's associated type
in a field (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/408">#408</a>)</li>
</ul>
<h2>2.0.9</h2>
<ul>
<li>Work around <code>missing_inline_in_public_items</code> clippy
restriction being triggered in macro-generated code (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/404">#404</a>)</li>
</ul>
<h2>2.0.8</h2>
<ul>
<li>Improve support for macro-generated <code>derive(Error)</code> call
sites (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/399">#399</a>)</li>
</ul>
<h2>2.0.7</h2>
<ul>
<li>Work around conflict with #[deny(clippy::allow_attributes)] (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/397">#397</a>,
thanks <a
href="https://github.com/zertosh"><code>@​zertosh</code></a>)</li>
</ul>
<h2>2.0.6</h2>
<ul>
<li>Suppress deprecation warning on generated From impls (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/396">#396</a>)</li>
</ul>
<h2>2.0.5</h2>
<ul>
<li>Prevent deprecation warning on generated impl for deprecated type
(<a
href="https://redirect.github.com/dtolnay/thiserror/issues/394">#394</a>)</li>
</ul>
<h2>2.0.4</h2>
<ul>
<li>Eliminate needless_lifetimes clippy lint in generated
<code>From</code> impls (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/391">#391</a>,
thanks <a
href="https://github.com/matt-phylum"><code>@​matt-phylum</code></a>)</li>
</ul>
<h2>2.0.3</h2>
<ul>
<li>Support the same Path field being repeated in both Debug and Display
representation in error message (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/383">#383</a>)</li>
<li>Improve error message when a format trait used in error message is
not implemented by some field (<a
href="https://redirect.github.com/dtolnay/thiserror/issues/384">#384</a>)</li>
</ul>
<h2>2.0.2</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dc0f6a23a3"><code>dc0f6a2</code></a>
Release 2.0.18</li>
<li><a
href="0275292735"><code>0275292</code></a>
Touch up PR 443</li>
<li><a
href="3c33bc60ad"><code>3c33bc6</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/thiserror/issues/443">#443</a>
from LucaCappelletti94/master</li>
<li><a
href="995939cc2e"><code>995939c</code></a>
Reproduce issue 442</li>
<li><a
href="21653d1d33"><code>21653d1</code></a>
Made clippy lifetime allows conditional</li>
<li><a
href="45e5388009"><code>45e5388</code></a>
Update actions/upload-artifact@v5 -&gt; v6</li>
<li><a
href="386aac126a"><code>386aac1</code></a>
Update actions/upload-artifact@v4 -&gt; v5</li>
<li><a
href="ec50561375"><code>ec50561</code></a>
Update actions/checkout@v5 -&gt; v6</li>
<li><a
href="247eab5d79"><code>247eab5</code></a>
Update name of empty_enum clippy lint</li>
<li><a
href="91b181f089"><code>91b181f</code></a>
Raise required compiler to Rust 1.68</li>
<li>Additional commits viewable in <a
href="https://github.com/dtolnay/thiserror/compare/1.0.69...2.0.18">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.69&new-version=2.0.18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-11 10:33:38 -05:00
dependabot[bot]
98f7f1c2a3
deps: bump tower-http from 0.6.11 to 0.7.0 (#1520)
Bumps [tower-http](https://github.com/tower-rs/tower-http) from 0.6.11
to 0.7.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tower-rs/tower-http/releases">tower-http's
releases</a>.</em></p>
<blockquote>
<h2>tower-http-0.7.0</h2>
<p><a
href="https://github.com/tower-rs/tower-http/compare/tower-http-0.6.11...tower-http-0.7.0">Changes
since 0.6.11</a></p>
<h2>Added</h2>
<ul>
<li>
<p><code>csrf</code>: add cross-site request forgery (CSRF) protection
middleware, porting the cross-origin protection scheme introduced in Go
1.25 (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/699">#699</a>)</p>
<pre lang="rust"><code>use tower::ServiceBuilder;
use tower_http::csrf::CsrfLayer;
<p>// Rejects cross-origin state-changing requests using
<code>Sec-Fetch-Site</code>,<br />
// an <code>Origin</code> allow-list, and an
<code>Origin</code>/<code>Host</code> fallback. No per-request<br />
// token state required.<br />
let layer = CsrfLayer::new().add_trusted_origin(&quot;<a
href="https://example.com">https://example.com</a>&quot;)?;</p>
<p>let service =
ServiceBuilder::new().layer(layer).service_fn(handler);<br />
</code></pre></p>
</li>
<li>
<p><code>timeout</code>: add <code>DeadlineBody</code> for non-resetting
body timeouts, applied via the new <code>RequestBodyDeadlineLayer</code>
and <code>ResponseBodyDeadlineLayer</code> (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/688">#688</a>)</p>
<p>Unlike <code>TimeoutBody</code>, which resets its deadline on every
frame, <code>DeadlineBody</code> caps the total time of a body transfer.
A slow client trickling one byte at a time never trips an idle timeout
but will trip a deadline.</p>
<pre lang="rust"><code>use std::time::Duration;
use tower::ServiceBuilder;
use tower_http::timeout::RequestBodyDeadlineLayer;
<p>// Abort the request body transfer after 30s total, regardless of
how<br />
// frequently data arrives.<br />
let service = ServiceBuilder::new()<br />
.layer(RequestBodyDeadlineLayer::new(Duration::from_secs(30)))<br />
.service_fn(handler);<br />
</code></pre></p>
</li>
<li>
<p><code>fs</code>: add strong <code>ETag</code> support to
<code>ServeDir</code>, including <code>If-Match</code> and
<code>If-None-Match</code> precondition handling per RFC 9110. <code>304
Not Modified</code> responses now carry the <code>ETag</code> and
<code>Last-Modified</code> validators (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/691">#691</a>)</p>
</li>
<li>
<p><code>fs</code>: add a <code>Backend</code> trait to make
<code>ServeDir</code> work with non-filesystem sources (e.g. embedded
assets or object storage). The default <code>TokioBackend</code>
preserves existing behavior. Use <code>ServeDir::with_backend()</code>
to plug in custom implementations (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/684">#684</a>)</p>
<pre lang="rust"><code>use tower_http::services::fs::ServeDir;
<p>// <code>MyBackend</code> implements
<code>tower_http::services::fs::Backend</code>.<br />
// The default <code>ServeDir::new()</code> continues to use
<code>TokioBackend</code> (local FS).<br />
let service = ServeDir::with_backend(&quot;assets&quot;,
MyBackend::new());<br />
</code></pre></p>
</li>
<li>
<p><code>fs</code>: add <code>html_as_default_extension</code> option to
<code>ServeDir</code>, appending <code>.html</code> when the request
path has no extension (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/519">#519</a>)</p>
</li>
<li>
<p><code>fs</code>: add <code>redirect_path_prefix</code> option to
<code>ServeDir</code>, prepending a prefix on trailing-slash redirects
so the service can be mounted under a sub-path (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/486">#486</a>)</p>
</li>
<li>
<p><code>validate-request</code>: add
<code>ValidateRequestHeaderLayer::has_header_value()</code> to reject
requests when a header does not have an expected value (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/360">#360</a>)</p>
</li>
<li>
<p><code>body</code>: <code>UnsyncBoxBody::new()</code> constructor and
<code>From&lt;ServeFileSystemResponseBody&gt;</code> conversion to avoid
double-boxing when combining <code>ServeDir</code> responses with other
body types (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/537">#537</a>)</p>
</li>
<li>
<p><code>limit</code>: implement <code>Default</code> for
<code>limit::ResponseBody</code> when the wrapped body also implements
<code>Default</code> (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/679">#679</a>)</p>
</li>
</ul>
<h2>Changed</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b194fcfef3"><code>b194fcf</code></a>
v0.7.0</li>
<li><a
href="af828a6ec9"><code>af828a6</code></a>
feat(follow_redirect)!: preserve request extensions across redirects (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/706">#706</a>)</li>
<li><a
href="8cb8d99a84"><code>8cb8d99</code></a>
feat(ValidateRequestHeaderLayer): add
has_header(&quot;...&quot;).with_value(&quot;...&quot;) fun...</li>
<li><a
href="3b56d2d2e8"><code>3b56d2d</code></a>
feat!: Add configurable Backend trait for ServeDir, bump MSRV 1.65 (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/684">#684</a>)</li>
<li><a
href="8508716431"><code>8508716</code></a>
Add <code>redirect_path_prefix</code> option (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/486">#486</a>)</li>
<li><a
href="56327b27f4"><code>56327b2</code></a>
Add Windows drive-prefix path regression test (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/705">#705</a>)</li>
<li><a
href="54c6db8590"><code>54c6db8</code></a>
feat(compression)!: upgrade SizeAbove threshold from u16 to u64 (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/704">#704</a>)</li>
<li><a
href="68cd6d8f3c"><code>68cd6d8</code></a>
Add DeadlineBody for non-resetting body timeouts (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/688">#688</a>)</li>
<li><a
href="fa8a98cb3e"><code>fa8a98c</code></a>
feat(fs): add strong ETag support to ServeDir (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/691">#691</a>)</li>
<li><a
href="36d2205eb6"><code>36d2205</code></a>
fix: Make SetMultiple*Header Clone for !Clone http bodies (<a
href="https://redirect.github.com/tower-rs/tower-http/issues/703">#703</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tower-rs/tower-http/compare/tower-http-0.6.11...tower-http-0.7.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tower-http&package-manager=cargo&previous-version=0.6.11&new-version=0.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-11 10:33:28 -05:00
dependabot[bot]
6c705b4066
deps: bump toml from 0.8.23 to 1.1.2+spec-1.1.0 (#1517)
Bumps [toml](https://github.com/toml-rs/toml) from 0.8.23 to
1.1.2+spec-1.1.0.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a3d0047c95"><code>a3d0047</code></a>
chore: Release</li>
<li><a
href="cc37615fc8"><code>cc37615</code></a>
docs: Update changelog</li>
<li><a
href="7f5e9e130a"><code>7f5e9e1</code></a>
fix(parser): Consolidate invalid unquoted key into one error (<a
href="https://redirect.github.com/toml-rs/toml/issues/1138">#1138</a>)</li>
<li><a
href="52feb9070c"><code>52feb90</code></a>
fix(parser): Consolidate invalid unquoted key into one error</li>
<li><a
href="aad85d4921"><code>aad85d4</code></a>
chore(deps): Update j178/prek-action action to v2 (<a
href="https://redirect.github.com/toml-rs/toml/issues/1136">#1136</a>)</li>
<li><a
href="8b1ac44bca"><code>8b1ac44</code></a>
chore(deps): Update compatible (dev) (<a
href="https://redirect.github.com/toml-rs/toml/issues/1135">#1135</a>)</li>
<li><a
href="9effd79ff2"><code>9effd79</code></a>
chore(deps): Update j178/prek-action action to v2</li>
<li><a
href="9db8aad6ea"><code>9db8aad</code></a>
chore: Release</li>
<li><a
href="e55a6633d9"><code>e55a663</code></a>
docs: Update changelog</li>
<li><a
href="c11d7d7ad3"><code>c11d7d7</code></a>
Optimisations (<a
href="https://redirect.github.com/toml-rs/toml/issues/1133">#1133</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/toml-rs/toml/compare/toml-v0.8.23...toml-v1.1.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=toml&package-manager=cargo&previous-version=0.8.23&new-version=1.1.2+spec-1.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-11 10:32:53 -05:00
dependabot[bot]
45601d93bc
deps: bump the cargo-minor-patch group across 1 directory with 7 updates (#1909)
Bumps the cargo-minor-patch group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [bytes](https://github.com/tokio-rs/bytes) | `1.12.0` | `1.12.1` |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.102` | `1.0.103` |
| [aws-credential-types](https://github.com/smithy-lang/smithy-rs) |
`1.2.14` | `1.3.0` |
| [uuid](https://github.com/uuid-rs/uuid) | `1.23.3` | `1.23.4` |
| [humantime](https://github.com/chronotope/humantime) | `2.3.0` |
`2.4.0` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.65` | `1.2.66` |


Updates `bytes` from 1.12.0 to 1.12.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/bytes/releases">bytes's
releases</a>.</em></p>
<blockquote>
<h2>Bytes v1.12.1</h2>
<h1>1.12.1 (July 8th, 2026)</h1>
<h3>Fixed</h3>
<ul>
<li>Properly handle when <code>Box::new</code> panics (<a
href="https://redirect.github.com/tokio-rs/bytes/issues/837">#837</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md">bytes's
changelog</a>.</em></p>
<blockquote>
<h1>1.12.1 (July 8th, 2026)</h1>
<h3>Fixed</h3>
<ul>
<li>Properly handle when <code>Box::new</code> panics (<a
href="https://redirect.github.com/tokio-rs/bytes/issues/837">#837</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="76c0fbb54e"><code>76c0fbb</code></a>
Release bytes v1.12.1 (<a
href="https://redirect.github.com/tokio-rs/bytes/issues/838">#838</a>)</li>
<li><a
href="924c82bf00"><code>924c82b</code></a>
Handle unwinding from Box::new (<a
href="https://redirect.github.com/tokio-rs/bytes/issues/837">#837</a>)</li>
<li>See full diff in <a
href="https://github.com/tokio-rs/bytes/compare/v1.12.0...v1.12.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `anyhow` from 1.0.102 to 1.0.103
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/dtolnay/anyhow/releases">anyhow's
releases</a>.</em></p>
<blockquote>
<h2>1.0.103</h2>
<ul>
<li>Fix Stacked Borrows violation (UB) in
<code>Error::downcast_mut</code> (<a
href="https://redirect.github.com/dtolnay/anyhow/issues/451">#451</a>,
<a
href="https://redirect.github.com/dtolnay/anyhow/issues/452">#452</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5bdb0e24db"><code>5bdb0e2</code></a>
Release 1.0.103</li>
<li><a
href="e621bd35dd"><code>e621bd3</code></a>
Merge pull request <a
href="https://redirect.github.com/dtolnay/anyhow/issues/452">#452</a>
from dtolnay/downcast</li>
<li><a
href="6e8c000690"><code>6e8c000</code></a>
Eliminate pointer-&gt;reference-&gt;pointer during downcast</li>
<li><a
href="67c4abd771"><code>67c4abd</code></a>
Add regression test for issue 451</li>
<li><a
href="917a169320"><code>917a169</code></a>
Update actions/upload-artifact@v6 -&gt; v7</li>
<li><a
href="d9dc3faf78"><code>d9dc3fa</code></a>
Update actions/checkout@v6 -&gt; v7</li>
<li><a
href="841522b2aa"><code>841522b</code></a>
Raise minimum tested compiler to rust 1.85</li>
<li>See full diff in <a
href="https://github.com/dtolnay/anyhow/compare/1.0.102...1.0.103">compare
view</a></li>
</ul>
</details>
<br />

Updates `aws-credential-types` from 1.2.14 to 1.3.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `aws-smithy-runtime-api` from 1.12.3 to 1.13.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/smithy-lang/smithy-rs/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `uuid` from 1.23.3 to 1.23.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/uuid-rs/uuid/releases">uuid's
releases</a>.</em></p>
<blockquote>
<h2>v1.23.4</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix up name of fuzz script in readme by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/888">uuid-rs/uuid#888</a></li>
<li>document fixes by <a
href="https://github.com/frostyplanet"><code>@​frostyplanet</code></a>
in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/889">uuid-rs/uuid#889</a></li>
<li>Prepare for 1.23.4 release by <a
href="https://github.com/KodrAus"><code>@​KodrAus</code></a> in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/890">uuid-rs/uuid#890</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/frostyplanet"><code>@​frostyplanet</code></a>
made their first contribution in <a
href="https://redirect.github.com/uuid-rs/uuid/pull/889">uuid-rs/uuid#889</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/uuid-rs/uuid/compare/v1.23.3...v1.23.4">https://github.com/uuid-rs/uuid/compare/v1.23.3...v1.23.4</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3296d64a19"><code>3296d64</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/890">#890</a> from
uuid-rs/cargo/v1.23.4</li>
<li><a
href="cba53d0da2"><code>cba53d0</code></a>
prepare for 1.23.4 release</li>
<li><a
href="e347af48aa"><code>e347af4</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/889">#889</a> from
frostyplanet/main</li>
<li><a
href="e9bf55c222"><code>e9bf55c</code></a>
doc: Fix broken link warnings</li>
<li><a
href="5351af40a0"><code>5351af4</code></a>
doc: Enable feature flag label for docs.rs</li>
<li><a
href="1e6a9669e3"><code>1e6a966</code></a>
Merge pull request <a
href="https://redirect.github.com/uuid-rs/uuid/issues/888">#888</a> from
uuid-rs/KodrAus-patch-1</li>
<li><a
href="c9619f639c"><code>c9619f6</code></a>
fix up name of fuzz script in readme</li>
<li>See full diff in <a
href="https://github.com/uuid-rs/uuid/compare/v1.23.3...v1.23.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `humantime` from 2.3.0 to 2.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/chronotope/humantime/releases">humantime's
releases</a>.</em></p>
<blockquote>
<h2>2.4.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat: allow creating Duration in const context by <a
href="https://github.com/ctron"><code>@​ctron</code></a> in <a
href="https://redirect.github.com/chronotope/humantime/pull/70">chronotope/humantime#70</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fc092817fa"><code>fc09281</code></a>
chore: prepare release 2.4.0</li>
<li><a
href="8a022cce55"><code>8a022cc</code></a>
feat: allow creating Duration in const context</li>
<li><a
href="27a4f77519"><code>27a4f77</code></a>
Explicitly set rust-version to 1.60</li>
<li><a
href="acc3c19658"><code>acc3c19</code></a>
ci: upgrade to actions/checkout v7</li>
<li><a
href="3acf96bb88"><code>3acf96b</code></a>
ci: fix workflow formatting</li>
<li>See full diff in <a
href="https://github.com/chronotope/humantime/compare/v2.3.0...v2.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `cc` from 1.2.65 to 1.2.66
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/releases">cc's
releases</a>.</em></p>
<blockquote>
<h2>cc-v1.2.66</h2>
<h3>Other</h3>
<ul>
<li>Fix target parsing for aarch64-unknown-linux-pauthtest (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1779">#1779</a>)</li>
<li>Support new QNX targets (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1775">#1775</a>)</li>
<li>Add kache to the supported compiler wrappers (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1770">#1770</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md">cc's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.2.65...cc-v1.2.66">1.2.66</a>
- 2026-07-05</h2>
<h3>Other</h3>
<ul>
<li>Fix target parsing for aarch64-unknown-linux-pauthtest (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1779">#1779</a>)</li>
<li>Support new QNX targets (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1775">#1775</a>)</li>
<li>Add kache to the supported compiler wrappers (<a
href="https://redirect.github.com/rust-lang/cc-rs/pull/1770">#1770</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9c53ddc649"><code>9c53ddc</code></a>
chore(cc): release v1.2.66 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1777">#1777</a>)</li>
<li><a
href="f2836c0fc5"><code>f2836c0</code></a>
Fix target parsing (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1779">#1779</a>)</li>
<li><a
href="32996914ec"><code>3299691</code></a>
ci(test-wasm): do not download pre release of wasi-sdk (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1778">#1778</a>)</li>
<li><a
href="bfd1ac98d4"><code>bfd1ac9</code></a>
Support new QNX targets (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1775">#1775</a>)</li>
<li><a
href="1887a73fdd"><code>1887a73</code></a>
Add kache to the supported compiler wrappers (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1770">#1770</a>)</li>
<li><a
href="e4847e1720"><code>e4847e1</code></a>
Bump actions/checkout from 6.0.3 to 7.0.0 (<a
href="https://redirect.github.com/rust-lang/cc-rs/issues/1767">#1767</a>)</li>
<li>See full diff in <a
href="https://github.com/rust-lang/cc-rs/compare/cc-v1.2.65...cc-v1.2.66">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 09:21:38 -04: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
Paperinik
dca9853ed9
feat(wrap): make tokensave the primary coding-task compressor, Serena the backup (#1230)
## Description

Makes **tokensave**
([github.com/aovestdipaperino/tokensave](https://github.com/aovestdipaperino/tokensave))
the **primary coding-task compressor** that `headroom wrap` installs,
and demotes **Serena** to a **backup**. tokensave is a local semantic
code-graph MCP server (`tokensave serve`): the agent queries it for
symbols, call chains, and impact analysis instead of grepping/reading
whole files — the same role Serena filled, but as a pre-indexed graph.
Serena now only registers when tokensave is unavailable (or when forced
with `--serena`).

Closes #

## Type of Change

- [ ] Bug fix (non-breaking change that fixes an issue)
- [x] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)

## Changes Made

- `headroom/graph/tokensave_installer.py` (new): fetch the prebuilt
tokensave release binary for the platform (release-binary only — no
`cargo` compile at wrap time); honors `HEADROOM_BINARIES_OFFLINE`;
returns `None` (→ Serena) when no asset exists (e.g. x86_64 macOS) or
the download fails.
- `mcp_registry`: `build_tokensave_spec()`; registration/disable/migrate
go through the existing `ServerSpec` + ownership-ledger flow, identical
to Serena.
- `cli/wrap.py`: new `_setup_coding_compressor` primary/backup policy;
tokensave setup/disable/migrate/index helpers. New flags
`--no-tokensave` (skip primary) and `--serena` (force backup on);
`--no-serena` now means "never register the backup". Default wrap
removes a previously Headroom-installed Serena entry once tokensave is
primary (user-managed entries preserved). `--code-graph` repointed to
tokensave; the legacy `codebase-memory-mcp` install path is dropped
(unwrap still cleans up legacy entries). `unwrap claude|codex` remove a
ledger-owned tokensave entry.
- Strands `HeadroomBundle`: `enable_tokensave_mcp=True` (primary);
`enable_serena_mcp` now defaults `False` (backup).
- `docs/content/docs/proxy.mdx`: `--code-graph` description updated from
codebase-memory-mcp to tokensave.
- Tests: tokensave installer (incl. error paths),
register/disable/migrate, primary/backup policy, and the
binary-resolution/indexing helpers. A scoped
`tests/test_cli/conftest.py` offline guard keeps the CLI suite hermetic.

## Testing

- [x] Unit tests pass (`pytest`)
- [x] Linting passes (`ruff check .`)
- [x] Type checking passes (`mypy headroom`)
- [x] New tests added for new functionality
- [ ] Manual testing performed

### Test Output

```text
$ uv run pytest -q tests/test_graph_tokensave.py tests/test_cli/test_tokensave_setup.py tests/test_cli/test_tokensave_helpers.py
41 passed

$ uv run pytest -q tests/test_cli/ tests/test_graph.py tests/test_graph_tokensave.py
421 passed   # full CLI + graph suites, incl. all pre-existing Serena/unwrap/registry tests

$ uv run pytest -q tests/test_mcp_registry/ tests/test_proxy_healthchecks.py
passed

$ uv run ruff format --check headroom/ tests/      # 822 files already formatted
$ uv run ruff check <changed files>                # All checks passed!
$ uv run mypy headroom/graph/tokensave_installer.py headroom/mcp_registry/install.py
Success: no issues found in 2 source files

# Coverage on new module
headroom/graph/tokensave_installer.py    99%
```

## Real Behavior Proof

- Environment: macOS (darwin arm64), Python 3.14, `uv` dev env;
tokensave 7.0.2 binary present on PATH and exercised against this repo's
`.tokensave/` graph during development. The installer pins release
**v7.0.2** (SHA-256-verified) across macOS arm64, Linux aarch64/x86_64,
and Windows x86_64/aarch64.
- Exact command / steps: `headroom wrap claude` registers `tokensave
serve` as the primary MCP code-graph server and indexes the project;
with the binary removed from PATH and `HEADROOM_BINARIES_OFFLINE=1`, the
same command falls back to registering Serena. Behavior is pinned by the
unit tests (binary-present → tokensave registered + Serena entry
removed; binary-absent → Serena fallback; `--serena` forces backup on;
`--no-serena` suppresses it; `--no-tokensave` disables primary).
- Observed result: tokensave registered as primary on the binary-present
path; Serena registered on the unavailable path; unwrap removes only
ledger-owned entries.
- Not tested: live end-to-end agent session inside Claude Code / Codex
against a real provider API; Windows/Linux release-asset download
(covered by unit tests with mocked archives, not a live fetch).

## 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
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] I have updated the CHANGELOG.md if applicable

## Additional Notes

- CHANGELOG is left untouched: this repo generates it via release-please
from Conventional Commits, so a manual edit is N/A.
- `strands/bundle.py` shows 0% patch coverage because that module
hard-imports the optional `strands` SDK, which CI does not install (the
pre-existing `_make_serena_client` was likewise uncovered) — not a
regression.
- A `test (3)` shard failure on `headroom.memory.bridge` is a
pre-existing offline-CI flake (cannot reach huggingface.co); it touches
no file in this PR and the scoped offline guard only applies under
`tests/test_cli/`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 16:55:37 -05:00
Parideboy
3ccdad6c67
Pin ORT dylib on Windows; init Python logging (#1010)
## Description

On Windows, headroom's Rust core resolves `onnxruntime.dll` at runtime
via `ort-load-dynamic`. Without an explicit `ORT_DYLIB_PATH`, the bare
DLL search can land on `C:\Windows\System32\onnxruntime.dll`, the
Windows ML OS component, and `Session::new()` can deadlock instead of
returning an error. Since a hang is not an `Err`, the tiered fallback
cannot engage until the proxy-level timeout fires.

This PR pins `ORT_DYLIB_PATH` to the pip-installed `onnxruntime` DLL at
import time, and wires Rust `tracing` events into Python logging so the
proxy log surfaces these failures when they occur.

Closes #928

## 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

- Added `headroom/_ort.py` with a Windows-only, idempotent
`ensure_ort_dylib_pinned()` resolver that respects an existing
`ORT_DYLIB_PATH`.
- Call the pin from `headroom/__init__.py` before importing `_core`
consumers.
- Log the effective ORT dylib path from the content router startup path
on Windows.
- Enable Rust tracing-to-log compatibility and initialize `pyo3-log` in
the `_core` module.
- Add timeout diagnostics in the Magika detector with the effective
`ORT_DYLIB_PATH`.
- Document `ORT_DYLIB_PATH` and `HEADROOM_MAGIKA_INIT_TIMEOUT_SECS`.
- Add unit coverage for the resolver behavior.

## Testing

- [x] Unit tests pass (`python -m pytest
tests/test_transforms/test_ort_dylib.py -q`)
- [x] Linting passes (`ruff check headroom/_ort.py headroom/__init__.py
headroom/transforms/content_router.py
tests/test_transforms/test_ort_dylib.py`)
- [x] Formatting passes (`ruff format --check headroom/_ort.py
headroom/__init__.py headroom/transforms/content_router.py
tests/test_transforms/test_ort_dylib.py`)
- [x] New tests added for new functionality
- [x] Manual testing performed

### Test Output

```text
$ python -m pytest tests/test_transforms/test_ort_dylib.py -q
7 passed in 0.19s

$ ruff check headroom/_ort.py headroom/__init__.py headroom/transforms/content_router.py tests/test_transforms/test_ort_dylib.py
All checks passed!

$ ruff format --check headroom/_ort.py headroom/__init__.py headroom/transforms/content_router.py tests/test_transforms/test_ort_dylib.py
4 files already formatted

$ cargo check -p headroom-py
cargo: The term 'cargo' is not recognized as a name of a cmdlet, function, script file, or executable program.
```

## Real Behavior Proof

- Environment: Windows 11 24H2, Python 3.13, RTX 4080
- Exact command / steps: `python -c "import headroom; from
headroom._core import detect_content_type as d;
print(d(open('headroom/compress.py').read()).content_type)"`
- Observed result: `source_code` in 301ms, clean exit, `Magika: ENABLED`
in proxy log
- Not tested: macOS/Linux manual runtime behavior; `_ort.py` is a no-op
outside Windows, and CI covers cross-platform build/test behavior.

## 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
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] I have updated the CHANGELOG.md if applicable (N/A: repo uses
release-please)

## Additional Notes

The branch was rebased onto current `main` and the commit subject was
updated to satisfy commitlint. Local Rust verification could not be run
on this Windows machine because `cargo` is not installed; GitHub CI
should be treated as the Rust build verification for the `pyo3-log`
dependency and workspace lockfile changes.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 07:46:24 -05:00
Yasser Sheikh
0dc2e1cb3f
feat(bedrock): cross-region + Converse compression; bundle proxy binary in images (#999)
## Description

The native Bedrock path (Phase D) compresses + signs
Anthropic-on-Bedrock requests, but
two real-world cases slipped through, and the native binary that powers
it was never
shipped. This PR closes those gaps as a focused set of give-backs.

Aligns with the Rust migration plan (see below).

## Type of Change

- [x] Bug fix (non-breaking change that fixes an issue)
- [x] New feature (non-breaking change that adds functionality)
- [ ] Breaking change
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)

## Changes Made

- **Cross-region inference-profile detection** via a new
`bedrock::vendor` module
(`canonical_vendor()`), following the design proposed in #953: strip a
known geo prefix
(`eu.`/`us.`/`apac.`/`global.`) then match the canonical vendor.
Geo-prefixed Anthropic
profiles (`eu.anthropic.…`) now get live-zone compression instead of
being silently
  skipped; geo-prefixed non-Anthropic vendors stay correctly excluded.
- **Converse-body compression (two parts)**:
1. `run_anthropic_compression` no longer bails to passthrough when the
body lacks an
InvokeModel `anthropic_version` envelope; envelope re-emit stays gated
on successful parse.
2. The **live-zone dispatcher now recognizes Bedrock Converse content
blocks**. Converse
blocks carry no `type` discriminator (the variant is the key: `{"text":
…}` vs
Anthropic's `{"type":"text","text":…}`), so real Converse user-message
text was still
passing through uncompressed. A typeless block whose `text` is a JSON
string now routes
through the same surgical text path. Anthropic blocks always carry
`type`, so the
Anthropic path is byte-for-byte unchanged; non-text Converse blocks
(`{"image":…}`,
     `{"toolUse":…}`) stay unrecognized and no-op.
- **Correct `/converse` upstream routing**: the non-streaming handler
resolved the upstream
action from a hard-coded `"invoke"`, so `/converse` requests were
forwarded to Bedrock's
`/invoke` endpoint. It now resolves the action from the inbound path
(`extract_invoke_action`),
mirroring the streaming handler's `extract_streaming_action`. SigV4
signs the same URL it
  forwards, so the signature stays consistent.
- **`aws-config` `sso` feature**: SSO profiles now resolve through the
default credential
chain for SigV4 — the credential chain in `docs/bedrock.md` already
promised SSO; this
  makes the code match.
- **Ship the `headroom-proxy` binary in published images**
(`Dockerfile`): built in the
builder stage (`--locked`, with the cargo registry cache mounted at
`CARGO_HOME`) and
  copied into both the debian and distroless runtime images.
- **Docs** (`docs/bedrock.md`): document cross-region inference profiles
and a "Running the
proxy" section. AWS credentials mount at `/home/nonroot/.aws` (the
default nonroot image
home) where the SDK looks for `~/.aws`, with a note on the root-image
alternative.

## Related issues

- Closes #976 — ship the `headroom-proxy` binary in published images
(this PR implements
  the exact fix proposed there).
- Addresses the **cross-region inference-profile** half of #953 via its
proposed
`canonical_vendor()` design. Non-Anthropic vendor compression parity
(Nova/GLM/MiniMax/
Kimi) is the natural follow-up — `bedrock::vendor` is the shared
resolver it can build on.
- Extends the native Bedrock InvokeModel compression requested in #734
(the Bedrock slice of
  #510) to cross-region profiles and Converse bodies.
- Partially enables #181 (native, Python-free packaging): the native
binary now ships in the
  images, though full Python-free distribution remains out of scope.

## Alignment with the Rust migration plan

Per `docs/spec/022-rust-migration.md`, the migration is **proxy-first**:
`headroom-proxy` is
the deployable Rust artifact, native routes replace Python passthroughs
one at a time
(Stage 4 = provider expansion, Bedrock included), and the binary is
meant to be "built,
tested, and **released together with the Python package**." Two ways
this PR advances that:

- The binary-in-images change makes the codebase do what the spec
already states (ship the
artifact) — closing the gap that forced downstreams to build from
source.
- Hardening the native Bedrock route (cross-region, Converse routing +
body compression) is
exactly the Stage-4 provider-expansion work, keeping the native path at
parity with real
  traffic so it can be the default rather than a passthrough.

## Testing

- [x] Unit tests pass (`cargo test -p headroom-core -p headroom-proxy` —
full suites, 0 failures)
- [x] Linting passes (`cargo clippy -p headroom-core -p headroom-proxy
--all-targets -- -D warnings`)
- [x] Formatting passes (`cargo fmt -- --check`)
- [x] New tests added — `bedrock::vendor` (foundation +
inference-profile matching),
`extract_invoke_action` + converse upstream URL, and live-zone Converse
text-block routing
(`block_has_string_text_field`, converse-vs-anthropic dispatch
equivalence).
- [x] Manual testing performed

### Test Output

```text
$ cargo test -p headroom-core -p headroom-proxy   # all suites: ok, 0 failed
$ cargo clippy -p headroom-core -p headroom-proxy --all-targets -- -D warnings   # Finished, no warnings
$ cargo fmt -- --check                            # clean
# image validation (local, proxy/code extras):
$ docker build --target runtime ...      # debian: /usr/local/bin/headroom-proxy, --help OK
$ docker build --target runtime-slim ... # distroless: binary links + --help OK
```

## Real Behavior Proof

- Environment: native Bedrock proxy against `bedrock-runtime.eu-west-2`,
SSO profile, model
  `eu.anthropic.claude-haiku-4-5-20251001-v1:0`.
- Exact command / steps: POST a large multi-turn Converse body to
`/model/eu.anthropic.claude-haiku-4-5-20251001-v1:0/converse`;
separately build the
`runtime` + `runtime-slim` targets and run
`/usr/local/bin/headroom-proxy --help`.
- Observed result: before — `bedrock_compression_skipped` (geo-prefixed
id not recognized),
forwarded uncompressed to the wrong `/invoke` upstream; after —
geo-prefixed id recognized,
`/converse` forwarded to the `/converse` upstream, live-zone dispatcher
compresses the
Converse user-message text, measurable token savings. Images contain a
runnable
  `headroom-proxy` in both variants.
- Not tested: non-Anthropic vendor compression parity (#953 follow-up);
Converse
`toolResult` nested-text compression (follow-up — only top-level
Converse text blocks
  compress today).

## 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
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective
- [x] New and existing unit tests pass locally with my changes
- [x] I have updated the CHANGELOG.md if applicable

## Additional Notes

- An earlier revision flipped the EventStream `Accept` default
(`*/*`/absent → passthrough);
**dropped** — `*/*` is what most clients (incl. reqwest and the proxy's
own metrics tests)
send while expecting SSE, so forcing passthrough breaks the standard SSE
path.
- The binary build adds the native-proxy compile to the image build;
happy to gate it behind
  a build arg if maintainers prefer it opt-in.
- Addressed a Copilot review round: corrected the `/converse` upstream
routing, the stale
`run_anthropic_compression` comment, the Dockerfile cargo cache mount +
`--locked`, and the
  nonroot AWS-credentials docs example.
2026-06-16 09:45:24 -05:00
dependabot[bot]
4ff7b4426d
ci: bump pyo3 from 0.22.6 to 0.24.1 in the cargo group across 1 directory (#270)
Bumps the cargo group with 1 update in the / directory:
[pyo3](https://github.com/pyo3/pyo3).

Updates `pyo3` from 0.22.6 to 0.24.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pyo3/pyo3/releases">pyo3's
releases</a>.</em></p>
<blockquote>
<h2>PyO3 0.24.1</h2>
<p>This release is a security fix for the
<code>PyString::from_object</code> method, which passed
<code>&amp;str</code> data to the Python C API without checking for a
terminating nul byte. All historical PyO3 versions are affected, and we
recommend you upgrade if you are using
<code>PyString::from_object</code>. Thank you to <a
href="https://github.com/vthib"><code>@​vthib</code></a> for the report
and <a href="https://github.com/Dr-Emann"><code>@​Dr-Emann</code></a>
for the fix. A RUSTSEC advisory will be published shortly.</p>
<p>Aside from the security fix, this release contains a number of other
non-breaking additions:</p>
<ul>
<li>An <code>abi3-py313</code> feature to support compiling with the
Python 3.13 stable ABI.</li>
<li><code>PyAnyMethods::getattr_opt</code> to get optional attributes
without paying the cost of a Python exception when the attribute in
question does not exist.</li>
<li>Constructor for <code>PyInt::new</code>.</li>
<li><code>with_critical_section2</code> for locking two objects at the
same time on the free-threaded build.</li>
<li>Fix for a PyO3 0.24.0 regression with
<code>Option&lt;&amp;str&gt;</code> and
<code>Option&lt;&amp;T&gt;</code> (where <code>T: PyClass</code>)
function arguments no longer being permitted</li>
</ul>
<p>There are also a few other small bug fixes for edge cases, mostly
related to compile errors from PyO3's macro code.</p>
<p>Thank you to the following contributors for the improvements:</p>
<p><a
href="https://github.com/bschoenmaeckers"><code>@​bschoenmaeckers</code></a>
<a href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a>
<a href="https://github.com/Dr-Emann"><code>@​Dr-Emann</code></a>
<a href="https://github.com/emmagordon"><code>@​emmagordon</code></a>
<a href="https://github.com/epontan"><code>@​epontan</code></a>
<a href="https://github.com/Icxolu"><code>@​Icxolu</code></a>
<a
href="https://github.com/IvanIsCoding"><code>@​IvanIsCoding</code></a>
<a href="https://github.com/jelmer"><code>@​jelmer</code></a>
<a href="https://github.com/jonaspleyer"><code>@​jonaspleyer</code></a>
<a href="https://github.com/ngoldbaum"><code>@​ngoldbaum</code></a>
<a
href="https://github.com/Owen-CH-Leung"><code>@​Owen-CH-Leung</code></a>
<a href="https://github.com/Tpt"><code>@​Tpt</code></a>
<a
href="https://github.com/Trolldemorted"><code>@​Trolldemorted</code></a>
<a href="https://github.com/XuehaiPan"><code>@​XuehaiPan</code></a></p>
<h2>PyO3 0.24.0</h2>
<p>This release is an incremental improvement of refinements and
optimizations following the new APIs established in PyO3's last few
releases.</p>
<p>Support for <code>jiff</code> datetime conversions have been added,
and also UUID conversions.</p>
<p>The <code>FromPyObject</code> derive macro has gained new
<code>#[pyo3(default = ...)]</code> and <code>#[pyo3(rename_all =
...)]</code> options, and the <code>IntoPyObject</code> derive macro has
gained a new <code>#[pyo3(into_py_with = ...)]</code> option.</p>
<p>PyO3 will now pass positional arguments to Python functions using the
&quot;vectorcall&quot; protocol in many cases, which should be an
optimization over the previous behaviour (of creating a Python tuple of
positional arguments).</p>
<p>Many methods on iterators of Python collections have been
optimized.</p>
<p>There are also many other incremental improvements, bug fixes and
smaller features.</p>
<p>Thank you to everyone who contributed code, documentation, design
ideas, bug reports, and feedback. The following contributors' commits
are included in this release:</p>
<p><a href="https://github.com/0x676e67"><code>@​0x676e67</code></a>
<a href="https://github.com/alex"><code>@​alex</code></a>
<a href="https://github.com/arielb1"><code>@​arielb1</code></a>
<a
href="https://github.com/bschoenmaeckers"><code>@​bschoenmaeckers</code></a>
<a
href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/PyO3/pyo3/blob/main/CHANGELOG.md">pyo3's
changelog</a>.</em></p>
<blockquote>
<h2>[0.24.1] - 2025-03-31</h2>
<h3>Added</h3>
<ul>
<li>Add <code>abi3-py313</code> feature. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4969">#4969</a></li>
<li>Add <code>PyAnyMethods::getattr_opt</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4978">#4978</a></li>
<li>Add <code>PyInt::new</code> constructor for all supported number
types (i32, u32, i64, u64, isize, usize). <a
href="https://redirect.github.com/PyO3/pyo3/pull/4984">#4984</a></li>
<li>Add <code>pyo3::sync::with_critical_section2</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4992">#4992</a></li>
<li>Implement <code>PyCallArgs</code> for <code>Borrowed&lt;'_, 'py,
PyTuple&gt;</code>, <code>&amp;Bound&lt;'py, PyTuple&gt;</code>, and
<code>&amp;Py&lt;PyTuple&gt;</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/5013">#5013</a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix <code>is_type_of</code> for native types not using same
specialized check as <code>is_type_of_bound</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4981">#4981</a></li>
<li>Fix <code>Probe</code> class naming issue with
<code>#[pymethods]</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4988">#4988</a></li>
<li>Fix compile failure with required <code>#[pyfunction]</code>
arguments taking <code>Option&lt;&amp;str&gt;</code> and
<code>Option&lt;&amp;T&gt;</code> (for <code>#[pyclass]</code> types).
<a href="https://redirect.github.com/PyO3/pyo3/pull/5002">#5002</a></li>
<li>Fix <code>PyString::from_object</code> causing of bounds reads with
<code>encoding</code> and <code>errors</code> parameters which are not
nul-terminated. <a
href="https://redirect.github.com/PyO3/pyo3/pull/5008">#5008</a></li>
<li>Fix compile error when additional options follow after
<code>crate</code> for <code>#[pyfunction]</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/5015">#5015</a></li>
</ul>
<h2>[0.24.0] - 2025-03-09</h2>
<h3>Packaging</h3>
<ul>
<li>Add supported CPython/PyPy versions to cargo package metadata. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4756">#4756</a></li>
<li>Bump <code>target-lexicon</code> dependency to 0.13. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4822">#4822</a></li>
<li>Add optional <code>jiff</code> dependency to add conversions for
<code>jiff</code> datetime types. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4823">#4823</a></li>
<li>Add optional <code>uuid</code> dependency to add conversions for
<code>uuid::Uuid</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4864">#4864</a></li>
<li>Bump minimum supported <code>inventory</code> version to 0.3.5. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4954">#4954</a></li>
</ul>
<h3>Added</h3>
<ul>
<li>Add <code>PyIterator::send</code> method to allow sending values
into a python generator. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4746">#4746</a></li>
<li>Add <code>PyCallArgs</code> trait for passing arguments into the
Python calling protocol. This enabled using a faster calling convention
for certain types, improving performance. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4768">#4768</a></li>
<li>Add <code>#[pyo3(default = ...']</code> option for
<code>#[derive(FromPyObject)]</code> to set a default value for
extracted fields of named structs. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4829">#4829</a></li>
<li>Add <code>#[pyo3(into_py_with = ...)]</code> option for
<code>#[derive(IntoPyObject, IntoPyObjectRef)]</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4850">#4850</a></li>
<li>Add FFI definitions <code>PyThreadState_GetFrame</code> and
<code>PyFrame_GetBack</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4866">#4866</a></li>
<li>Optimize <code>last</code> for <code>BoundListIterator</code>,
<code>BoundTupleIterator</code> and <code>BorrowedTupleIterator</code>.
<a href="https://redirect.github.com/PyO3/pyo3/pull/4878">#4878</a></li>
<li>Optimize <code>Iterator::count()</code> for <code>PyDict</code>,
<code>PyList</code>, <code>PyTuple</code> &amp; <code>PySet</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4878">#4878</a></li>
<li>Optimize <code>nth</code>, <code>nth_back</code>,
<code>advance_by</code> and <code>advance_back_by</code> for
<code>BoundTupleIterator</code> <a
href="https://redirect.github.com/PyO3/pyo3/pull/4897">#4897</a></li>
<li>Add support for <code>types.GenericAlias</code> as
<code>pyo3::types::PyGenericAlias</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4917">#4917</a></li>
<li>Add <code>MutextExt</code> trait to help avoid deadlocks with the
GIL while locking a <code>std::sync::Mutex</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4934">#4934</a></li>
<li>Add <code>#[pyo3(rename_all = &quot;...&quot;)]</code> option for
<code>#[derive(FromPyObject)]</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4941">#4941</a></li>
</ul>
<h3>Changed</h3>
<ul>
<li>Optimize <code>nth</code>, <code>nth_back</code>,
<code>advance_by</code> and <code>advance_back_by</code> for
<code>BoundListIterator</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4810">#4810</a></li>
<li>Use <code>DerefToPyAny</code> in blanket implementations of
<code>From&lt;Py&lt;T&gt;&gt;</code> and <code>From&lt;Bound&lt;'py,
T&gt;&gt;</code> for <code>PyObject</code>. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4593">#4593</a></li>
<li>Map
<code>io::ErrorKind::IsADirectory</code>/<code>NotADirectory</code> to
the corresponding Python exception on Rust 1.83+. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4747">#4747</a></li>
<li><code>PyAnyMethods::call</code> and friends now require
<code>PyCallArgs</code> for their positional arguments. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4768">#4768</a></li>
<li>Expose FFI definitions for <code>PyObject_Vectorcall(Method)</code>
on the stable abi on 3.12+. <a
href="https://redirect.github.com/PyO3/pyo3/pull/4853">#4853</a></li>
<li><code>#[pyo3(from_py_with = ...)]</code> now take a path rather than
a string literal <a
href="https://redirect.github.com/PyO3/pyo3/pull/4860">#4860</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a213b368bd"><code>a213b36</code></a>
release: 0.24.1 (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5021">#5021</a>)</li>
<li><a
href="d85a02d9b1"><code>d85a02d</code></a>
split <code>PyFunctionArgument</code> to specialize <code>Option</code>
(<a
href="https://redirect.github.com/pyo3/pyo3/issues/5002">#5002</a>)</li>
<li><a
href="c37a50a7a3"><code>c37a50a</code></a>
Add example of more complex exceptions (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5014">#5014</a>)</li>
<li><a
href="dcacb9bbbc"><code>dcacb9b</code></a>
Simplify PyFunctionArgument impl on &amp;Bound&lt;T&gt; (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5018">#5018</a>)</li>
<li><a
href="03c31c5c7a"><code>03c31c5</code></a>
fix <code>#[pyfunction]</code> option parsing (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5015">#5015</a>)</li>
<li><a
href="0f49eb14b0"><code>0f49eb1</code></a>
docs: Remove examples with outdated PyO3 and unmaintained projects (<a
href="https://redirect.github.com/pyo3/pyo3/issues/4952">#4952</a>)</li>
<li><a
href="1b00b0d27f"><code>1b00b0d</code></a>
implement <code>PyCallArgs</code> for borrowed types (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5013">#5013</a>)</li>
<li><a
href="5caaa371dc"><code>5caaa37</code></a>
fix: convert to cstrings in PyString::from_object (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5008">#5008</a>)</li>
<li><a
href="4aca459fd3"><code>4aca459</code></a>
docs: guide - add link to tables and traits (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5001">#5001</a>)</li>
<li><a
href="0452c0ee52"><code>0452c0e</code></a>
replace quansight-labs/setup-python with actions/setup-python (<a
href="https://redirect.github.com/pyo3/pyo3/issues/5007">#5007</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pyo3/pyo3/compare/v0.22.6...v0.24.1">compare
view</a></li>
</ul>
</details>
<br />

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-06-10 23:01:33 -05:00
Tejas Chopra
c83687798b Fix Windows ORT builds and Docker signing retries 2026-05-10 20:59:28 -07:00
chopratejas
4a3b76bcc8 fix: PR-E1 tool array deterministic sort (Phase E)
Sort `tools[]` alphabetically by name on the way out so cache hits no
longer depend on the customer-side iteration order (commonly hash-
randomized via `set()` / `dict`). Mutates request bytes only when:

  1. Auth mode is PAYG (`headroom_core::auth_mode::classify`).
  2. No tool already carries a `cache_control` marker (reordering
     would shift cache scope and silently void customer intent).

Every gate skip emits a structured `e1_skipped` event with `reason =
auth_mode | marker_present` so dashboards can see policy adoption.

Wired into all three live-zone walkers — Anthropic `/v1/messages`,
OpenAI `/v1/chat/completions`, OpenAI `/v1/responses` — plus the
Bedrock invoke + invoke-streaming entry points. Each passes
`auth_mode` (already pre-classified by Phase F PR-F1 middleware)
into the dispatcher so the gate evaluates without re-classifying.

Sort key uses `tool["name"]` (Anthropic) or `tool["function"]["name"]`
(OpenAI). Unnamed tools (rare; malformed inputs only) fall back to
MD5 of canonical-JSON serialization for a stable in-process key —
collision odds are astronomically small and `Vec::sort_by` is stable.

Tests: unit tests for sort + marker detection + idempotency + the
permutation property; integration tests boot the real proxy in front
of a wiremock upstream and assert PAYG -> sorted, OAuth/Subscription/
marker -> byte-equal passthrough (SHA-256).
2026-05-05 15:35:27 -07:00
chopratejas
e2146724af fix: ship glibc 2.38 compat shim + wheel symbol audit (closes #355)
Issue #355: published headroom_ai-*-manylinux_2_28_*.whl fails to import on Ubuntu 22.04, Debian 11/12, Conda envs with libc < 2.38: 'ImportError: undefined symbol: __isoc23_strtoll'.

Root cause: ORT prebuilt artifacts (downloaded via fastembed's ort-download-binaries-rustls-tls feature) are compiled with gcc-14.2.1 on a glibc-2.38+ host and reference __isoc23_strtoll. Our manylinux build host has glibc 2.38 so the link succeeds; end users with older glibc don't.

Two-part fix: (1) crates/headroom-py/glibc_compat.c provides weak-alias definitions for __isoc23_strtol/strtoll/strtoul/strtoull delegating to the older strtol* family, compiled by build.rs on Linux/glibc only. The dynamic linker prefers glibc's strong symbol when present (>= 2.38) and falls back to ours when not (< 2.38). (2) scripts/audit_wheel_glibc_symbols.py is a release.yml gate that runs objdump -T on every Linux wheel and rejects any UND symbol whose required glibc version exceeds the wheel's manylinux floor.

Validated: the audit correctly rejects the actually-broken v0.20.26 wheel with a precise diagnostic. The shim itself is a tiny static link with zero runtime cost.

Regression tests in tests/test_release_workflows.py pin the shim's load-bearing pieces (.c file, build.rs trigger, [build-dependencies] cc dep) and the audit invocation in release.yml. Future drift fails at PR time, not in the next release.

This is the same bug class as PR #371 (rustls-everywhere). Each instance gets fixed; the audit gate now catches the *class* — any future static linkage that introduces a post-floor symbol gets blocked before publish.
2026-05-04 21:31:19 -07:00
chopratejas
c10a2195af fix(proxy): PR-D4 native Vertex publisher path + ADC bearer auth
Adds a Rust-native Vertex AI publisher route ahead of the LiteLLM
Python converter (which dropped `thinking`, `redacted_thinking`,
`document`, `image`, `server_tool_use`, `mcp_tool_use` block kinds —
the P4-37 / P4-38 bug). After this PR the Vertex `:rawPredict` and
`:streamRawPredict` calls survive byte-equal upstream and benefit
from the live-zone Anthropic dispatcher (PR-B-series) running over
the body — same behaviour as `/v1/messages`.

New module `crates/headroom-proxy/src/vertex/`:

- `mod.rs` — single dispatch handler at the
  `/v1beta1/.../models/:model_action` route. Splits the trailing
  `:<verb>` segment with `str::rsplit_once(':')` (no regex) and
  flips an `attach_sse_tee` flag to dispatch to the streaming or
  non-streaming arm. Both verbs share one axum route shape because
  matchit can't distinguish two patterns that overlap on a
  parameter.
- `envelope.rs` — `VertexEnvelope` parser. Confirms
  `anthropic_version` present + `model` field absent (the two
  fingerprints of the Vertex envelope vs `/v1/messages`).
- `adc.rs` — `TokenSource` trait + `GcpAdcTokenSource` (production,
  `gcp_auth` 0.12) + `StaticTokenSource` (tests). Caches tokens
  with a 60s refresh-ahead-of-expiry window. Emits structured
  `event = "vertex_adc_token_refreshed"` per refresh.
- `raw_predict.rs` — POST handler + shared `forward_vertex_request`.
  Buffers body, parses envelope, runs live-zone Anthropic
  compression, fetches ADC bearer, attaches
  `Authorization: Bearer <token>` (overwrites client-supplied
  Authorization header), forwards. SSE telemetry tee for the
  streaming verb reuses PR-C1's `AnthropicStreamState` directly
  (Vertex streams plain SSE, unlike Bedrock's binary EventStream).
- `stream_raw_predict.rs` — module-level docs + alias to the
  shared dispatcher (the streaming-vs-non-streaming difference is
  one boolean flag inside the shared forwarder).

Modifications:

- `proxy.rs::build_app` — registers the single Vertex route.
- `proxy.rs::AppState` — new `vertex_token_source: Arc<dyn TokenSource>`
  field. Production constructs `GcpAdcTokenSource` lazily (no GCP
  call until first `bearer()`); tests inject `StaticTokenSource`
  via the new `AppState::with_token_source` helper.
- `config.rs` — adds `--vertex-region` / `HEADROOM_PROXY_VERTEX_REGION`
  (default `us-central1`, observability tag only — the upstream URL
  is `--upstream`) and `--vertex-adc-scope` /
  `HEADROOM_PROXY_VERTEX_ADC_SCOPE` (default `cloud-platform`).
- `Cargo.toml` (workspace + proxy) — adds `gcp_auth = "0.12"` and
  `async-trait = "0.1"`.
- `tests/common/mod.rs` — `start_proxy_with_state` accepts both
  config + state customizers; `install_static_token_source` helper
  for tests.

`crates/headroom-proxy/tests/integration_vertex_raw_predict.rs` —
all five tests pass:

1. `native_envelope_round_trip_byte_equal` — Vertex-shape body
   (with `anthropic_version`, no `model`) round-trips SHA-256
   byte-equal upstream.
2. `adc_bearer_token_signed_correctly` — `Authorization: Bearer
   <static-test-token>` reaches upstream verbatim and OVERWRITES a
   client-supplied Authorization header.
3. `thinking_block_preserved` — request with `thinking` (incl.
   signature) + `redacted_thinking` (incl. opaque `data`) blocks
   round-trips byte-equal even with `LiveZone` compression mode
   enabled. This is the P4-37 / P4-38 teeth.
4. `stream_raw_predict_sse_handled` — `:streamRawPredict` proxies
   an Anthropic SSE response (full `message_start` →
   `content_block_delta` → `message_stop` sequence) back to the
   client without corruption; SSE content-type preserved end-to-end;
   bearer attached.
5. (bonus, no-silent-fallback contract)
   `adc_failure_returns_5xx_no_silent_forward` — when the token
   source returns `Err`, the proxy returns 5xx and never reaches
   upstream. Verifies the `event = "vertex_adc_fetch_failed"`
   error path.

Workspace: `cargo test --workspace` green; `cargo clippy --workspace
-- -D warnings` clean; `make ci-precheck` passes.

- No silent fallbacks: ADC failure → structured 5xx, never an
  unauthenticated forward.
- No hardcodes: every knob (region, ADC scope, upstream URL) is
  CLI-flag + env-var configurable.
- No regexes: axum path parameters + `str::rsplit_once` only.
- Comprehensive structured logs: `event` field on every decision
  point — `vertex_envelope_parsed`, `vertex_envelope_invalid`,
  `vertex_compression_skipped`, `vertex_compression_applied`,
  `vertex_adc_token_refreshed`, `vertex_adc_fetch_failed`,
  `vertex_streaming_pipeline_active`, `vertex_sse_stream_closed`,
  `vertex_forwarded`, `vertex_unknown_verb`, etc.
- Performant: no body clone; ADC token cached + refreshed
  ahead-of-expiry, not fetched per request.
- Comprehensive tests: realistic Anthropic block content
  (signature payload, redacted_thinking opaque blob) in
  `thinking_block_preserved`.

The local `gcloud auth application-default print-access-token`
returns no credentials, so manual validation against a real Vertex
endpoint is not possible in this PR. Follow-up: the user runs
`gcloud auth application-default login` once and exercises a live
Vertex request — should be a no-code-change check.

PR-D1 (Bedrock native) is running concurrently and will land its
own envelope module at `crates/headroom-proxy/src/bedrock/envelope.rs`.
The two envelope modules are intentionally siblings (not a shared
trait) — the shapes differ (Bedrock has a different
`anthropic_version` value, no `model` field, AWS SigV4 instead of
GCP ADC), and a premature shared abstraction would obscure the
provider-specific contracts. Whichever PR merges second rebases
without conflict.

Retires P4-38 (and the Vertex parts of P4-39); marketplace BYOC
pitch (per project memory) gets one more native provider.
2026-05-04 16:24:38 -07:00
chopratejas
ce37940d17 fix: PR-E6 cache-bust drift detector telemetry (Phase E)
Per-session SHA-256 fingerprint of the cache hot zone (system / tools /
first 3 messages) with structured-log emission on drift. Detector is
read-only: never mutates request bytes, preserves the Phase A
passthrough invariant. Surfaces invisible cache busts (system prompt
edited mid-session, tools reshuffled, early message changed) without
rewriting them.

* crates/headroom-proxy/src/cache_stabilization/drift_detector.rs:
  StructuralHash (system, tools, early_messages digests),
  compute_structural_hash, observe_drift, derive_session_key,
  DriftState (LRU bounded to 1000 sessions in production).
* Session keys derive from Authorization / x-api-key / client IP /
  (IP, user-agent). Bearer tokens and API keys are SHA-256 hashed
  before they ever reach the log line; the raw secret is never logged.
* Wired into forward_http after the body is buffered, before the
  compression dispatcher runs. Skips paths whose wire shape is not
  Anthropic / OpenAI Chat / OpenAI Responses.
* AppState gains drift_state: DriftState. Bedrock unit-test
  literal-construction sites updated.
* 14 unit tests + 1 integration test covering first-request,
  no-drift, per-dimension drift, multi-dim drift, LRU eviction,
  non-mutation invariant, and bearer-token-never-logged.

Adds lru = "0.12" and promotes sha2 = "0.10" to a normal dependency
on headroom-proxy.
2026-05-04 14:54:20 -07:00
chopratejas
90ef66213d fix(proxy): PR-D3 Bedrock observability + auth-mode integration
Phase D close. Adds the operator-facing observability surface that
PRs D1 (native invoke) and D2 (streaming EventStream) deferred, and
wires the Phase F PR-F1 auth-mode classifier into the Bedrock route
so downstream cache/compression policy gates have something to read.

Changes
-------

* New `bedrock::auth_mode_layer` middleware. Classifies every
  inbound Bedrock request via F1's `classify`, coerces the result
  to `AuthMode::OAuth` per the Bedrock policy matrix (SigV4 IAM is
  OAuth-equivalent), and stores the resolved value in
  `request.extensions()` so PR-F2/F3 can read it without
  re-classifying. Mismatches are logged at WARN with
  `event=bedrock_auth_mode_unexpected` — no silent coercion.

* New `observability` module with three Prometheus families:
    - `bedrock_invoke_count_total{model, region, auth_mode}` (counter)
    - `bedrock_invoke_latency_seconds{model, region}` (histogram)
    - `bedrock_eventstream_message_count_total{model, region, event_type}`
      (counter)
  Registered lazily via `OnceLock` so per-request work is just
  `inc_with_label_values` / `observe`. Latency observed via an
  RAII `LatencyGuard` so every error path is instrumented; a
  future regression that adds a new return path can't drop the
  observation.

* New `GET /metrics` endpoint serves the registry in Prometheus
  text format. Mounted unconditionally — no feature flag gate — so
  scrape works regardless of which provider routes are mounted.

* Bedrock invoke + invoke-streaming handlers now extract
  `Extension<AuthMode>`, log it in their entry breadcrumbs
  (`event=bedrock_invoke_received`, `event=bedrock_invoke_streaming_received`),
  and pass `model`/`region` into `translate_stream` so per-message
  metrics carry the right labels.

* Operator docs at `docs/bedrock.md`: AWS credential chain,
  region/endpoint config, supported model IDs (`anthropic.*`
  literal-match — no regexes), compression behaviour, sample
  PromQL queries, structured-log correlation, rollback path.

Tests added (6, all green)
--------------------------

Auth-mode (`integration_bedrock_authmode.rs`):
  1. `bedrock_classified_as_oauth` — empty headers → OAuth in
     extensions.
  2. `oauth_policy_passthrough_prefer` — body byte-equal upstream;
     no auto cache_control / prompt_cache_key injected.

Metrics (`integration_bedrock_metrics.rs`):
  3. `metrics_increment_per_invoke` — 3 invokes → counter=3 with
     correct labels.
  4. `metrics_observe_latency` — 1 invoke → histogram count=1,
     sum>0.
  5. `eventstream_metrics_per_message_type` — 5 chunks → counter=5
     with `event_type=chunk`.
  6. `metrics_endpoint_serves_scrape` — `/metrics` returns 200,
     `text/plain`, all three metric families' HELP/TYPE lines
     present.

Each metrics test owns a unique (model, region) tuple so the
global `prometheus` registry — shared across parallel tests in
the same binary — gives each test isolated label rows. Without
isolation, parallel tests cross-contaminate counters.

Constraints honoured
--------------------

* No silent fallbacks — auth-mode coercion is logged at WARN.
* No hardcodes — region from `--bedrock-region`, model from axum
  path parameter.
* No regexes — vendor prefix is literal `anthropic.`.
* Comprehensive structured logs — every metric increment paired
  with `tracing::debug!` carrying the same labels for incident
  correlation.
* Performant — `OnceLock`-cached descriptors, RAII guard, total
  D3 overhead well under 1us per request.
* Cardinality bounded — labels driven by config + bounded enums,
  never by user-controlled bytes.

Live cloud validation deferred
------------------------------

The wiremock-backed integration tests are the canonical correctness
gate for D3. A real Bedrock smoke test requires `bedrock:InvokeModel`
permissions in the developer's AWS account and is documented in
`docs/bedrock.md` — both D1 and D2 hit sandbox permission issues
trying this path; D3 follows the same convention.

Stacked on
----------

PR #364 (D1 native invoke), PR #365 (D2 streaming EventStream),
PR #366 (F1 classifier helper). Merge those first; this PR will be
rebased onto main once they land.
2026-05-04 11:07:47 -07:00
chopratejas
6f2c0a8400 fix(ci): rustls-everywhere — eliminate openssl-sys from build tree
# Root cause of the wheel-build cascade

We have shipped 5 release-pipeline hot-fixes in 12 hours, each
addressing a different symptom of the same architectural problem:

1. PR #363 — npm artifact downloads + tried `yum openssl-devel`
2. PR #367 — vendored OpenSSL in `headroom-proxy` + dropped Intel mac
3. PR #369 — Debian-cross perl install (`perl` not `libipc-cmd-perl`)
4. PR #370 — moved `openssl/vendored` from headroom-proxy to headroom-py
5. (this PR) — ELIMINATE OpenSSL entirely

Each fix exposed a different missing system package or feature flag in
a different build surface (manylinux x86_64 vs aarch64-cross-Debian vs
macOS Intel vs e2e/wrap Dockerfile vs e2e/init Dockerfile vs main
Dockerfile vs devcontainer). We were playing whack-a-mole because every
Cargo dep change to the OpenSSL surface required matching system-package
updates in 6+ different Dockerfiles and workflows, and the PR-level CI
didn't exercise all of them.

# Why this PR is the structural fix

`fastembed` exposes clean rustls feature flags:
- `hf-hub-rustls-tls`               (replaces default `hf-hub-native-tls`)
- `ort-download-binaries-rustls-tls` (replaces default `…native-tls`)

By disabling fastembed's default features and enabling the rustls
variants explicitly, we remove `native-tls` (and therefore `openssl-sys`,
`openssl`, `openssl-src`, perl modules, OpenSSL build-time deps,
vendored OpenSSL ~30s build cost) from the entire workspace dep tree.

Verified locally:

    $ cargo tree -p headroom-py -i openssl-sys
    error: package ID specification `openssl-sys` did not match any packages

    $ cargo tree -p headroom-py -i native-tls
    error: package ID specification `native-tls` did not match any packages

    $ cargo build --release -p headroom-py
    Finished `release` profile [optimized] target(s) in 25.57s

(Down from 1m+ with vendored OpenSSL.)

# Cleanups enabled by this change

- crates/headroom-py/Cargo.toml — dropped the `openssl/vendored`
  workaround from PR #370.
- crates/headroom-proxy/Cargo.toml — same dep removed.
- e2e/wrap/Dockerfile — dropped `yum install openssl-devel pkgconfig
  perl-IPC-Cmd`. Comment retained explaining why.
- e2e/init/Dockerfile — same.
- Dockerfile (main) — dropped `pkg-config libssl-dev` from apt-get.
- .devcontainer/Dockerfile — dropped `pkg-config libssl-dev`.
- .github/workflows/release.yml — removed the entire before-script-linux
  block (perl install probe + multi-package-manager dispatch + fail-loud
  assertion). No longer needed.

# Regression gate

Three new structural tests in tests/test_release_workflows.py:

- test_no_openssl_sys_in_wheel_build_tree — runs `cargo tree -p <crate>
  -i openssl-sys` for headroom-py / headroom-proxy / headroom-core. If
  openssl-sys reappears (a future native-tls enabler creeping in via a
  new dep), this fails AT PR TIME with an actionable message.
- test_no_native_tls_in_wheel_build_tree — same shape, native-tls is
  the proximate cause.
- test_fastembed_uses_rustls_features — checks the Cargo.toml so a
  future "let me bump fastembed and forget the features" doesn't
  silently re-introduce OpenSSL.

Plus two cleanup gates:
- test_dockerfiles_no_longer_install_openssl_devel
- test_release_yml_does_not_install_openssl_or_perl_for_wheels

All 13 release-workflow tests pass. `make ci-precheck` PASSED.

# What this teaches us about rollouts (per user's ultrathink ask)

The 5-fix cascade exposed three meta-problems:

1. PR checks don't block merges. PR #370 had docker-init-e2e,
   docker-wrap-e2e, docker-native-e2e all FAILED yet got merged.
   Branch protection should require these checks. Operator action
   needed (cannot fix in code).

2. Local validation is misleading. `cargo build -p headroom-py` from
   the workspace root used the workspace lockfile and looked green;
   CI did fresh resolution against headroom-py's manifest alone where
   the feature wasn't enabled. Lesson: verify structural invariants
   with `cargo tree -e features` before trusting that a build "works."

3. 6+ build surfaces with independent system-dep state. Every Cargo
   change required matching updates in 6 places. The structural answer
   (this PR) is to NOT depend on system OpenSSL at all. Where structural
   fixes are not possible, the answer is a single shared
   scripts/install-rust-build-deps.sh — but with this PR there's
   nothing left to install.
2026-05-03 23:26:04 -07:00
chopratejas
a5c7f6fed9 fix(ci): vendored OpenSSL must live in headroom-py, not headroom-proxy
PR #367 added `openssl = { features = ["vendored"] }` to
`crates/headroom-proxy/Cargo.toml`, expecting Cargo's feature
unification to propagate the vendored feature throughout the
workspace. PR #369 unblocked aarch64 by fixing the perl install.
The next release run on `1323830f` (the #369 merge) showed aarch64
+ macOS wheels build successfully but the **x86_64 Linux wheel still
fails** with:

    The system library `openssl` required by crate `openssl-sys`
    was not found.

# Why my previous reasoning was wrong

Cargo's feature unification only applies to the resolution graph
that's actually built. `maturin build --manifest-path
crates/headroom-py/Cargo.toml` resolves headroom-py's deps only —
headroom-py does NOT depend on headroom-proxy, so the
`openssl/vendored` enable in headroom-proxy never propagates to the
wheel build. `cargo tree -p headroom-py -e features` confirms:
openssl-sys is built with `default` only, no `vendored`.

(I missed this when I tested locally because `cargo build -p
headroom-py` from the workspace root reads the workspace's Cargo.lock,
which was already populated with `openssl-src` from when I added
the dep to headroom-proxy. The CI job runs `cargo rustc` with a
fresh resolution against headroom-py's manifest, where the vendored
feature isn't enabled.)

# Fix

Move the `openssl = { version = "0.10", features = ["vendored"] }`
dep from `headroom-proxy/Cargo.toml` to `headroom-py/Cargo.toml`.
The wheel-producing crate now declares the feature directly.

`cargo tree -p headroom-py -e features` after this change:

    openssl-sys feature "vendored"
        └── openssl-sys feature "openssl-src"
            └── openssl-src feature "default"
                └── openssl-src v300.6.0+3.6.2

Local `cargo build --release -p headroom-py` confirms openssl-src
is now compiled (35s wheel build).

# Tests

`test_headroom_py_vendors_openssl` (renamed from
`test_headroom_proxy_vendors_openssl`) gates the dep on the right
crate. Docstring explains WHY it must live in headroom-py — so a
future refactor doesn't move it back to headroom-proxy and silently
break the wheel build.

All 11 release-workflow tests pass. `make ci-precheck` PASSED.
2026-05-03 21:53:58 -07:00
Tejas Chopra
fb25a26180
Merge pull request #366 from chopratejas/realign-F1-classify-auth-mode
fix: PR-F1 classify_auth_mode helper (Phase F kickoff)
2026-05-03 17:56:04 -07:00
chopratejas
1314842b19 fix(ci): vendor OpenSSL via cargo + drop x86_64 macOS from wheel matrix
The previous hot-fix (#363) addressed npm artifact downloads and added
openssl-devel installs in the manylinux container, but the wheel build
still fails on three of four matrix entries with three distinct errors:

1. ubuntu-x86_64 with `manylinux: auto` resolved to manylinux2014
   (CentOS 7 / OpenSSL 1.0.2k). `openssl-sys 0.9` requires OpenSSL
   1.1.0+ — "different version of OpenSSL was found".

2. ubuntu-aarch64 cross-compiles via `aarch64-unknown-linux-gnu-gcc`
   from an x86_64 manylinux container. The `yum install openssl-devel`
   we added installs x86_64 headers; `/usr/aarch64-unknown-linux-gnu/
   include/` has no OpenSSL — "openssl/opensslv.h: No such file or
   directory".

3. macos-15-intel fails on `ort-sys` (transitive via the ML compression
   backend), which has no prebuilt ONNX Runtime binaries for
   `x86_64-apple-darwin`. Unrelated to OpenSSL; an upstream limitation.

Why the workspace pulls openssl-sys at all: `hf-hub` (transitive via
`fastembed`) hard-codes `native-tls` as a default feature. Cargo's
feature unification then enables openssl-sys for the whole workspace
despite our `reqwest`/`tokio-tungstenite`/`tokio-rustls` preferences.

# Fix 1: vendored OpenSSL

Add `openssl = { version = "0.10", features = ["vendored"] }` to
`crates/headroom-proxy/Cargo.toml`. The `vendored` feature compiles
OpenSSL from source as part of the cargo build — works on every target
uniformly. Local build verified: cargo now pulls
`openssl-src v300.6.0+3.6.2` and compiles it. ~30s extra one-time
build cost.

The `openssl/vendored` feature DEFEATS `OPENSSL_DIR`. We therefore
remove the previous hot-fix's "Install OpenSSL (macOS)" step that
exported `OPENSSL_DIR` — leaving it would silently regress to the
system-OpenSSL path that broke originally.

# Fix 2: pin manylinux floor to 2_28

Change x86_64-unknown-linux-gnu from `manylinux: auto` to
`manylinux: 2_28` (matching aarch64 + the e2e Dockerfiles). This
isn't strictly required with vendored OpenSSL — the floor is now
glibc 2.28 / AlmaLinux 8 which has modern toolchain — but it removes
the CentOS-7 surface entirely and matches our runtime container
target.

# Fix 3: drop x86_64-apple-darwin from the matrix

`ort-sys 2.0.0-rc.12` has no prebuilt ONNX Runtime binaries for that
target. Building ORT from source would add CMake + ~5 minutes per
build. Apple Silicon macOS (`aarch64-apple-darwin`) is fully covered;
Intel-mac users install from the platform-independent sdist this
matrix also produces.

Tracked as a follow-up: switch the ML backend to `ort-tract` or
upstream a request for x86_64 macOS prebuilts.

# before-script-linux: keep perl-IPC-Cmd, drop openssl-devel

OpenSSL's vendored `Configure` script needs `IPC::Cmd` (without it
the build fails with "Can't locate IPC/Cmd.pm"). System
openssl-devel is no longer needed.

# Tests

4 new regression tests gate this:
- `test_headroom_proxy_vendors_openssl`
- `test_build_wheels_installs_perl_ipc_cmd_for_vendored_openssl`
- `test_build_wheels_does_not_set_openssl_dir`
- `test_build_wheels_matrix_excludes_intel_macos`

Plus the previous 7. All 11 release-workflow tests pass.
`make ci-precheck` PASSED. Local `cargo build --release -p headroom-py`
green.
2026-05-03 17:41:24 -07:00
chopratejas
ca9de93cfc fix: PR-F1 classify_auth_mode helper (Phase F kickoff)
Add the classify_auth_mode helper that maps inbound request headers to
one of three auth modes — Payg / OAuth / Subscription — at request
entry. The mode is the first-class policy axis Phase F's remaining PRs
(F2 cache+lossy gates, F3 TOIN per-tenant aggregation, F4
X-Forwarded-* skip) gate behavior on.

Detection rules (most-specific signal wins):
- Subscription UA prefix in user-agent → Subscription
- Bearer sk-ant-oat-* → OAuth (Claude Pro/Max)
- Bearer sk-ant-api* / Bearer sk-* → Payg
- Bearer <jwt> (3 dot-segments) → OAuth (Codex/Cursor/Copilot)
- Authorization present but not Bearer (AWS SigV4) → OAuth (Bedrock)
- x-api-key / x-goog-api-key → Payg
- Default → Payg

Hard constraints met: pure function, no regex, no silent fallback
(non-UTF-8 headers warn! and fall through), no hardcoded list (UA
prefixes in module-scope const ready to swap for config in a follow-up).

Files:
- crates/headroom-core/src/auth_mode.rs (new) — Rust impl
- crates/headroom-core/tests/auth_mode.rs (new) — 14 unit + 1 perf
- crates/headroom-core/benches/auth_mode.rs (new) — Criterion bench
- crates/headroom-core/Cargo.toml — add http dep + bench entry
- crates/headroom-core/src/lib.rs — pub mod auth_mode
- crates/headroom-proxy/src/proxy.rs — classify at request entry,
  store in extensions, log event=auth_mode_classified
- headroom/proxy/auth_mode.py (new) — Python port (parity)
- headroom/proxy/handlers/anthropic.py — wire into messages handler
- headroom/proxy/handlers/openai.py — wire into chat + responses
- tests/test_auth_mode.py (new) — 23 Python parity tests
- docs/auth-modes.md (new) — detection rules + how-to-extend

Tests: 15 Rust + 23 Python all green. cargo fmt + clippy + workspace
tests + ci-precheck all green.

Performance (criterion, M-series):
- auth_mode/classify/empty: 68 ns
- auth_mode/classify/payg_anthropic_api_key: 75 ns
- auth_mode/classify/oauth_jwt: 182 ns
- auth_mode/classify/subscription_claude_code: 81 ns

All paths well under the <10us budget (~50-150x headroom).

Refs: REALIGNMENT/08-phase-F-auth-mode.md PR-F1.
2026-05-03 17:20:14 -07:00
chopratejas
66426e7b75 fix(proxy): PR-D2 Bedrock streaming via binary EventStream
Add the Phase D PR-D2 streaming counterpart to PR-D1's native
Bedrock InvokeModel route.

Bedrock's `/model/{id}/invoke-with-response-stream` returns
`application/vnd.amazon.eventstream` — a binary, length-prefixed,
CRC32-checksummed framing format. This PR adds an incremental
parser, an SSE translator, and the streaming POST handler.

Components:
- `bedrock/eventstream.rs` — stateful incremental EventStream
  parser. Validates prelude + message CRC32 (configurable via
  `--bedrock-validate-eventstream-crc`, default on). Returns
  structured `ParseError` on every malformed-bytes path; never
  panics. Supports all 10 AWS header value types; bytes-typed
  values surfaced via `HeaderValue::Bytes`, strings via
  `HeaderValue::String`.
- `bedrock/eventstream_to_sse.rs` — translator. Picks output mode
  per `Accept` header: `application/vnd.amazon.eventstream` →
  byte-equal passthrough; everything else (default) → SSE
  translation. Each `chunk` payload becomes a canonical Anthropic
  `event: <type>\ndata: <json>\n\n` SSE frame so existing
  `AnthropicStreamState` telemetry runs unchanged.
- `bedrock/invoke_streaming.rs` — POST handler. Reuses D1's
  `BedrockEnvelope`, live-zone compression, SigV4 signing.
  Tees translated SSE frames into `AnthropicStreamState` via the
  same bounded-mpsc tee pattern as `/v1/messages` — byte path
  never blocks on parser readiness.

Config:
- New `--bedrock-validate-eventstream-crc` / env
  `HEADROOM_PROXY_BEDROCK_VALIDATE_EVENTSTREAM_CRC` flag, default
  on. Disabling logs a warn at app-build time.

Routing:
- `proxy.rs::build_app` mounts
  `POST /model/:model_id/invoke-with-response-stream` only when
  `enable_bedrock_native` is on (matches D1).

Failure modes (all loud; no silent fallbacks):
- CRC mismatch → `event=bedrock_eventstream_crc_mismatch` warn,
  closes the stream with an SSE error frame.
- Parse error → `event=bedrock_eventstream_parse_failed` warn +
  SSE error frame.
- `:message-type == exception` → `event=bedrock_eventstream_upstream_exception`
  warn + SSE error frame.
- Unknown `:event-type` →
  `event=bedrock_eventstream_unknown_event_type` warn, skipped.
- Missing creds / SigV4 fail → 5xx, identical to D1.

Tests added (12 total):
- 4 parser unit-style integration: byte-equal round trip, drip-feed
  one-byte-at-a-time, CRC mismatch surfaces structured error,
  validation-off accepts corrupt.
- 3 end-to-end: `eventstream_translated_to_sse`,
  `usage_extracted_from_translated_stream`,
  `client_can_choose_eventstream_or_sse`.
- 2 property tests via `proptest`: random bytes never panic the
  parser (1024 cases each: bulk + drip-feed).
- 3 trivial smoke tests in unit modules
  (`eventstream::tests::*`, `eventstream_to_sse::tests::*`).

Manual cloud validation:
- Not exercised — running `aws bedrock-runtime invoke-model-with-
  response-stream` against the proxy in the sandbox would require
  AWS API access this environment does not have. The wiremock-
  served binary EventStream + property tests cover the parser
  semantics and CRC validation rigorously.

Stacked on PR-D1 (#364). Will be rebased onto main once D1 lands.
2026-05-03 16:48:28 -07:00
chopratejas
f2d4fe39cb fix(proxy): PR-D1 native Bedrock InvokeModel route + SigV4
Phase D PR-D1 lands the first native Rust path for AWS Bedrock,
replacing the lossy LiteLLM Python converter for Anthropic-on-Bedrock
non-streaming requests. Eliminates part of P4-37 and P4-39.

What landed
-----------

- New crates/headroom-proxy/src/bedrock/ module:
  - envelope.rs: parses the {"anthropic_version": "...", ...}
    Bedrock body shape; re-emits with anthropic_version preserved
    as the first key (relies on serde_json preserve_order).
  - sigv4.rs: AWS SigV4 signer wrapping the aws-sigv4 crate.
    Forces PayloadChecksumKind::XAmzSha256 so x-amz-content-sha256
    is in the canonical request, hashed over the post-compression
    body bytes (the bytes that actually hit Bedrock). No silent
    fallback: signing failures return 5xx with
    event=bedrock_sigv4_failed.
  - invoke.rs: POST handler for /model/{model_id}/invoke
    (and /converse - same wire shape for anthropic.claude-*).
    Detects Anthropic vendor via literal starts_with("anthropic.")
    (no regex per project rule), routes Anthropic-shape bodies
    through the existing compress_anthropic_request live-zone
    dispatcher, then signs and forwards to the configured Bedrock
    endpoint.

- Modified:
  - proxy.rs: routes /model/:model_id/invoke and
    /model/:model_id/converse when enable_bedrock_native is on
    (default). Adds bedrock_credentials: Option<Arc<Credentials>>
    to AppState.
  - config.rs: new flags --bedrock-region (default us-east-1,
    env HEADROOM_PROXY_BEDROCK_REGION), --bedrock-endpoint
    (operator override for FIPS/VPC/test setups),
    --enable-bedrock-native (default true), --aws-profile.
  - main.rs: resolves AWS credentials at startup via
    aws_config::defaults(BehaviorVersion::latest()). Failure logs
    event=bedrock_credentials_unavailable at WARN; the handler
    refuses to forward unsigned (event=bedrock_credentials_missing).
  - Cargo.toml: workspace deps aws-sigv4, aws-config,
    aws-credential-types, aws-smithy-runtime-api.

Tests
-----

8 integration tests under
crates/headroom-proxy/tests/integration_bedrock_invoke.rs:

1. native_envelope_round_trip_byte_equal
2. sigv4_signed_correctly_after_compression - confirms
   authorization is SigV4-shape and x-amz-content-sha256
   matches sha256(body received by upstream).
3. thinking_block_preserved_through_bedrock
4. redacted_thinking_preserved
5. document_block_preserved
6. tool_result_array_with_image_preserved
7. stop_sequence_null_only_when_present - pins that the proxy
   does NOT inject stop_sequence: null (P4-37 hardcode).
8. tool_use_input_byte_equal_preserves_key_order

All eight pass. Full workspace test run is green; clippy + fmt
clean. make ci-precheck (rust + python + commitlint) passes
locally.

Build constraints honoured
--------------------------

- No silent fallbacks: missing creds / signing failures return
  5xx with structured event=... log; no path ever forwards
  unsigned.
- No hardcodes: region, endpoint, profile, enable-flag all
  configurable via CLI + env.
- No regexes: vendor detection is str::starts_with.
- Comprehensive structured logs: event=bedrock_invoke_received,
  bedrock_envelope_parsed, bedrock_compression_skipped,
  bedrock_credentials_missing, sigv4_signed,
  bedrock_invoke_forwarded, etc.
- Performant: body buffered once, passed by &[u8] to signer
  (zero-copy), Bytes::clone only for ownership transfer to
  reqwest. Sign exactly once per request.
- Elegant: 4 small focused modules mirror handlers/ + sse/.
- Tests use realistic Anthropic block content (real thinking,
  redacted_thinking, document, base64 image fixtures).

Streaming (PR-D2) and observability (PR-D3) follow.
2026-05-03 16:22:32 -07:00
chopratejas
ddc6f6ceb0 fix: C1 — byte-level SSE parser + state machines
Foundation of Phase C. Delivers:

* Byte-level SSE framing (bytes::Bytes / BytesMut) with UTF-8
  decoded only at \n\n event boundaries — no per-chunk decode,
  no errors=ignore data loss across TCP reads.
* Three provider state machines:
  - Anthropic: blocks keyed by index, all delta types
    (text/thinking/input_json/citations/signature) preserved
    byte-equal.
  - OpenAI Chat: ToolCallState concatenation, refusal field,
    include_usage final chunk handling.
  - OpenAI Responses: items keyed by id (not position) for
    out-of-order completion; full event coverage.
* State machine runs in parallel with byte-passthrough via a
  tokio::spawn task fed by a bounded mpsc — clients see raw
  bytes immediately; telemetry populates without blocking.

Retires P1-8, P1-9, P1-14, P1-15, P1-17, P4-48 in the Rust path
(Python A8 hotfix preserved as fallback until Phase H).

Per-PR-C1 plan: REALIGNMENT/05-phase-C-rust-proxy.md.
2026-05-02 21:12:41 -07:00
chopratejas
00902b8fea fix: B7 — CCR hardening: persistent backends + always-on tool
P2-25, P2-26: CCR (Compress-Cache-Retrieve) used an in-memory store
that fragmented across uvicorn workers and was wiped on restart, and
the `headroom_retrieve` tool was registered/unregistered per-request
based on whether the latest body happened to contain compression
markers — every flip busted the prompt cache. Both are sticky
side-channels: once a session has done CCR, the tool list bytes and
the retrieval store must stay stable. This PR fixes both.

Rust:
* Split `ccr.rs` into `ccr/` with `backends/` submodule
  (`in_memory.rs`, `sqlite.rs`, `redis.rs` cfg-gated).
* `SqliteCcrStore` (production default): WAL mode, prepared upsert,
  lazy TTL purge on read, persistent across worker restarts and
  shareable across workers on the same host via SQLite file locking.
* `RedisCcrStore` (cfg-gated behind `feature = "redis"`): SETEX with
  startup PING smoke-test, no key-prefix collision risk, no sticky
  session required at the LB.
* `CcrBackendConfig::{InMemory, Sqlite, Redis}` + `from_config(...)`
  factory — every init failure surfaces (no silent fallback per
  `feedback_no_silent_fallbacks.md`).
* `ccr::compute_key` (BLAKE3 → first 24 hex chars) and
  `ccr::marker_for("HASH") -> "<<ccr:HASH>>"` centralize the hash +
  marker format; one definition for the live-zone dispatcher and the
  Python regex (`headroom/ccr/tool_injection.py:211`).
* `compress_anthropic_live_zone_with_ccr` accepts
  `Option<&dyn CcrStore>`. When wired, every accepted compression
  puts the original bytes into the backend and appends `<<ccr:HASH>>`
  to the compressed string. The token-validation gate runs on the
  marker-augmented string so the `compressed_tokens >=
  original_tokens` rejection stays honest.

Python:
* `SessionCcrTracker` + `apply_session_sticky_ccr_tool` mirror the
  PR-A7 `SessionToolTracker` / `apply_session_sticky_memory_tools`
  pattern: once a session has done CCR, every subsequent request
  injects the recorded golden tool-definition bytes. Tool list bytes
  are byte-stable across turns (snapshot test pins them).
* `headroom/ccr/tool_injection.py::inject_tool_definition` accepts a
  new `session_has_done_ccr` kwarg per the PR-B7 spec change at line
  302-328. The legacy per-request path stays intact for callers that
  don't yet thread a session id (e.g. Google handler).
* Anthropic + OpenAI handlers route their CCR tool-list updates
  through `apply_session_sticky_ccr_tool`, keyed off the existing
  `session_tracker_store.compute_session_id(...)` plumbing.

Backend selection model: `CcrBackendConfig::Sqlite { path }` is the
production default — single host, persistent, multi-worker safe with
sticky session. `CcrBackendConfig::Redis { url }` is the multi-host
scale-out option — no stickiness needed. `InMemory` is for tests
and single-worker dev only. RUST_DEV.md "Multi-worker deployment —
CCR fragmentation" rewritten around this matrix.

Tests:
* `crates/headroom-core/tests/ccr_backends.rs` — 7 tests covering
  SQLite round-trip, TTL purge, proxy-restart survival, cross-backend
  byte-equal keys, `from_config` paths, and the no-redis-feature
  loud-failure check (+ 2 redis tests gated behind the feature).
* `crates/headroom-core/tests/live_zone_ccr.rs` — confirms
  `<<ccr:HASH>>` marker injection, store population, and
  no-marker-when-no-store invariants end-to-end.
* `tests/test_ccr_tool_always_on.py` — 12 tests pinning the
  always-on behaviour, session/provider isolation, LRU bound, no-
  session-id fallback, and (per-acceptance-criterion) the byte-stable
  tool-definition snapshot.

Per-PR-B7 plan: REALIGNMENT/04-phase-B-live-zone.md.
2026-05-02 16:52:33 -07:00
chopratejas
a974bb153a fix(rust): PR-A1 — make /v1/messages compression a passthrough
Stop calling IntelligentContextManager from the Rust proxy on
/v1/messages. The proxy is now a byte-faithful passthrough on this
endpoint. Eliminates the C1+C2+C3+C4 cache-killer cluster (P0-3,
P0-4, P0-5, P1-13) by not running ICM with `frozen_message_count: 0`
hardcoded — Phase B PR-B2 brings live-zone-only compression back.

Per REALIGNMENT/03-phase-A-lockdown.md.

Changes:
- Add `--compression-mode {off,live_zone}` flag and
  `HEADROOM_PROXY_COMPRESSION_MODE` env var. Default `off`. Both
  modes passthrough in PR-A1; `live_zone` warns loudly because
  Phase B isn't implemented yet (no silent fallback).
- Replace `compress_anthropic_request` body with a passthrough
  stub that emits a structured `tracing::info!` decision log line
  (request_id, path, method, compression_mode, decision,
  reason="phase_a_lockdown", body_bytes) and returns
  `Outcome::NoCompression`. Function signature preserved so
  Phase B PR-B2 is a pure body swap.
- Delete `compression/icm.rs` (per the realignment plan: ICM
  modules in headroom-core are deleted in PR-B1).
- Drop the `Arc<IntelligentContextManager>` field from `AppState`
  — no longer used.
- Add request-entry `tracing::debug!` with auth_mode_placeholder
  ("unknown" until Phase F PR-F1 wires the auth-mode classifier).
- Add `debug_assert!` on the NoCompression branch that the
  buffered bytes length is stable, locking in Phase A's
  cache-safety invariant at the call site.
- Tighten existing tests from `len()` equality to SHA-256 byte
  equality. Rename `compression_on_oversized_body_trims_messages`
  → `compression_on_long_body_passes_through_in_phase_a` and
  flip the assertion to byte-equal.
- Add new tests: passthrough_mode_off_byte_equal_sha256,
  passthrough_mode_live_zone_currently_passthrough_byte_equal_sha256,
  passthrough_preserves_numeric_precision (literal-byte body so
  serde_json's f64 quantization can't mask a regression),
  passthrough_preserves_cache_control_markers,
  passthrough_preserves_thinking_signature,
  passthrough_preserves_redacted_thinking_data,
  passthrough_recorded_fixture_byte_equal_sha256,
  tracing_capture::compression_decision_logged.
- Add fixture
  `crates/headroom-proxy/tests/fixtures/anthropic_messages_request_real.json`
  with system block list + cache_control markers, tools with
  nested JSON Schema, messages containing text + thinking +
  signature + tool_use + tool_result + image, non-ASCII content,
  large numbers. Used as the canonical SHA-256 round-trip gate.

Constraints honored: configurable (compression_mode is the only
new knob), no hardcoded thresholds, no regex usage, no silent
fallbacks (live_zone-not-implemented warns), structured tracing
on every cache-affecting decision, comprehensive tests.

Acceptance criteria from PR-A1 spec:
- `cargo build --workspace` clean
- `cargo test --workspace` green (886 tests pass)
- `cargo clippy --workspace -- -D warnings` clean
- `cargo fmt --all --check` clean
- `make ci-precheck` green
- New SHA-256 byte-equality tests pass against the recorded fixture
- `tracing::info!` decision-log line is observable
- `--compression-mode` CLI + env var work
- No regex import added
2026-05-01 23:58:20 -07:00
chopratejas
378d8a0f05 fix(rust): audit cleanup — DiffCompressor CCR leak, CCR TOCTOU race, clippy debt, dep dedup
Closes findings from the post-Phase-3g audit. Five surgical fixes
plus telemetry-discoverability docs. PyO3 0.22 → 0.24 security
upgrade is its own PR (issue #335).

1. DiffCompressor cache_key persistence (production bug)
---------------------------------------------------------
Pre-fix: `RustDiffCompressor.compress()` minted a `cache_key`,
embedded `[... hash=abc123]` in the wire marker, and returned
without storing the original anywhere. Python ContentRouter then
returned the compressed text with a dangling marker — every
retrieval tool call from the LLM 404'd.

Sibling compressors (LogCompressor, SearchCompressor) already had
the right pattern: Rust mints the key, Python's
`_persist_to_python_ccr` writes the original to the production
`CompressionStore`. DiffCompressor was the asymmetric one.

Fix:
- Rust: add `DiffCompressor::compress_with_store(content, context,
  Option<&dyn CcrStore>)` mirroring siblings. Calls `store.put`
  when a key is minted; legacy `compress()` and
  `compress_with_stats()` delegate with `None` for parity.
- Python: add `_persist_to_python_ccr` helper to
  `headroom/transforms/diff_compressor.py.compress()` mirroring
  `log_compressor.py` and `search_compressor.py`.
- Pipeline `DiffOffload`: switch to `compress_with_store(Some(store))`
  and drop the post-hoc double-store hack that papered over this
  bug at the orchestrator boundary.

2. CCR store TOCTOU race in `get()`
-----------------------------------
`InMemoryCcrStore::get()` checked TTL under a read lock, dropped
the lock, then called `remove()`. Between drop and remove a
concurrent `put()` of the same hash with fresh data could land —
and our `remove` would then wipe that fresh entry. Under
multi-worker proxy load this manifested as "I just stored it; why
is it gone?"

Fix: use `DashMap::remove_if`. Predicate runs under the shard
write lock so check-and-remove is atomic. New regression test
exercises a tight contention loop between writer and reader on
the same key.

3. Pre-existing clippy debt in smart_crusher
--------------------------------------------
- 3× `field_reassign_with_default` in `crusher.rs` test setup —
  switch to struct-update syntax `Config { field: x, ..Default }`.
- `hash_array_for_ccr` was `#[cfg(test)]` but unused; deleted with
  a comment so a future test can reintroduce it as a one-liner.

`cargo clippy --workspace --all-targets -- -D warnings` is now
clean across the whole workspace; previous CI patches that allowed
these warnings can be removed in a follow-up.

4. Tokenizers dependency dedup
------------------------------
`tokenizers 0.21` (direct dep) + `tokenizers 0.22` (transitive via
fastembed) compiled twice into the binary. Bumped direct dep to
`0.22` to align; API is compatible (verified by full tokenizer
test suite). Saves compile time + binary bloat.

5. Telemetry-discoverability doc (no new code)
----------------------------------------------
The audit recommended a per-transform invocation counter to
inform the next Python → Rust port. Discovered the infrastructure
already exists at `/stats`:
- `compressions_by_strategy` — invocation count per strategy
- `pipeline_timing` — count + avg/max ms per transform name
- `tokens_saved_by_strategy` — savings attribution

Added a section to `RUST_DEV.md` showing the `curl + jq` recipes
to read this data, with example output highlighting how to spot
zero-invocation deferral candidates (e.g. `code_compressor`).

Verification: workspace tests 734 + 14 + 5 + 4 + 6 + 5 + 2 + 2 +
3 + 4 + 2 + 2 + 1 = all green; cargo fmt clean; cargo clippy
--all-targets clean; Python tests 185 pass; commitlint clean.
2026-04-30 20:54:22 -07:00
chopratejas
01a423a316 fix(rust): reformat/offload pipeline + log templates + diff noise (Phase 3g rework)
Replaces PR1's lossless/lossy split with ReformatTransform (pack
denser, no info lost) and OffloadTransform (drop bytes, CCR-stash
original via required cache_key). With CCR every transform is
information-preserving end-to-end, so the lossless/lossy distinction
misnamed the architecture.

OffloadTransform carries a cheap, structural estimate_bloat() method
scoped to its domain — generic byte-redundancy heuristics miss domain
semantics. The orchestrator runs reformat phase + per-offload bloat
estimation in parallel via rayon::join + par_iter, then runs offload
iff bloat clears threshold OR reformat underwhelmed.

Transforms shipped:

REFORMATS (lossless):
- JsonMinifier: serde_json round-trip whitespace stripping.
- LogTemplate: Drain-inspired order-preserving template miner.
  Collapses consecutive runs of same-template lines into
  [Template Tn: ...] (Nx) + variant table. Win comes from emitting
  the constant-token prefix once instead of N times. Lossless: every
  original line reconstructible from template + variants.

OFFLOADS (drop bytes, stash original via CCR):
- LogOffload: wraps existing LogCompressor; bloat = repetition x
  uniqueness_weight + dilution x priority_dilution_weight.
- DiffOffload: wraps existing DiffCompressor; bloat = context-to-
  change ratio. Bug-fix-on-port — persists original under the
  cache_key the parity-bound DiffCompressor mints (closes a leak).
- DiffNoise: drops lockfile hunks (Cargo.lock, package-lock.json,
  yarn.lock, etc., suffix list configurable in TOML) and
  whitespace-only hunks. Stashes original via CCR for retrieval.

Search offload exists but is not in default re-exports — modern
agents (Claude Code, Codex) use scoped rg/grep, the marginal value
didn't justify default registration. Reach via the explicit module
path if opting in.

JSON Offload is intentionally absent from this PR — already lives at
SmartCrusher; Phase 3g PR3 wraps it in the OffloadTransform contract.

Thresholds and weights live in config/pipeline.toml, embedded via
include_str!; PipelineConfig::from_toml_str loads runtime overrides.

98 new pipeline tests; full headroom-core suite (714) and workspace
tests green; cargo fmt clean. No regex, per project convention.
2026-04-30 11:10:24 -07:00
chopratejas
12c2665531 feat(rust): signals trait module + KeywordDetector (Phase 3e.1)
Establish `crates/headroom-core/src/signals/` as a top-level module
holding cross-cutting detection traits. Phase 3e.1 ports
`error_detection.py` to a `LineImportanceDetector` trait + a
`Tiered<T>` combinator + a single concrete `KeywordDetector` impl
backed by aho-corasick. Three traits at three granularities are
sketched (line / blob / item); only line-importance is implemented
today.

Two bug fixes from the Python source bake into both the Rust impl
and the Python regex shim:

1. `ERROR_KEYWORDS` listed `timeout|abort|denied|rejected` but
   `ERROR_PATTERN` regex omitted them. Lines like `"Connection
   timeout"` were silently neutral despite the keyword being canonical.
   Both surfaces now flag them.
2. `SECURITY_KEYWORDS` carried `token`, which false-positived on
   every reference to LLM tokens (`input_tokens`, `tokens_saved`, ...)
   in our own product. Dropped from the security set.

The Python `error_detection.py` shim now reflects keyword data out of
Rust via `keyword_registry_snapshot()` and recompiles the legacy
`re.Pattern` objects on the fly. Existing callers (text_compressor,
search_compressor, intelligent_context) continue to import the same
names with no source changes; caller migration to the trait API
happens in their own port PRs.

The trait architecture is the seam where a future ML detector slots
in without touching `KeywordDetector` or any caller. The canonical
extension is documented in `signals/README.md` as a classifier head
on the existing `bge-small-en-v1.5` embedder loaded by
`relevance::EmbeddingScorer` -- 384-dim -> 4-class softmax,
~1.5 KB head, ~1 ms inference, no extra model file. Two alternatives
(distilled tinyBERT in ONNX, logistic regression on lexical
features) are kept open in case BGE-head underfits.

Per the no-silent-fallbacks rule: only `KeywordDetector` lands as a
concrete impl. No NoOp, no MockDetector, no stub-ML -- those will
arrive with their real implementations.

Phase 3g (Compression Pipeline Formalization, issue #315) is queued
as the cross-cutting follow-up that will make lossless-then-lossy-
then-CCR ordering an explicit, observable architecture rather than
implicit per-compressor logic. Trait shapes there will reuse the
signals primitive landed in this PR.
2026-04-29 15:55:13 -07:00
chopratejas
19fc49ac39 chore(rust): port unidiff Tier 2 diff detector (Stage 3d PR4)
Adds the second tier of the Stage-3d ContentRouter detection arch.
Magika (PR3) is a probabilistic ML classifier — short, prose-prefixed,
or "looks like code because the lines are code" diffs can slip past
it into PlainText. PR4 catches those by running the [`unidiff`]
parser as a deterministic oracle: anything that parses to ≥1
PatchedFile with ≥1 hunk is a diff.

What lands:
- `crates/headroom-core/src/transforms/unidiff_detector.rs`:
  - `is_diff(content) -> bool`: predicate.
  - `detect_diff(content) -> Option<ContentType>`: typed wrapper for
    the router (PR5) to chain after Magika.
  - Empty input shortcuts to false without invoking the parser.
  - "Found zero hunks" is treated as **not** a diff — `unidiff::PatchSet
    ::parse` returns Ok(()) on plain text (just finds zero files);
    we explicitly require non-empty patch + non-empty hunk to avoid
    silently routing prose through the diff compressor.
- 14 unit tests: standard git diff, naked hunk without git header,
  multi-file, added/removed-only files, JSON/HTML/YAML/source/prose
  negatives, "almost looks like a diff" prose with @@/--- in passing,
  truncated-diff canary.

Known gaps (deliberately punted to PR5+):
- Combined-merge headers (`@@@ ... @@@`) — `unidiff`'s hunk regex is
  for plain `@@`. Rare in proxy traffic; PR5 router can fall back
  to the regex content_detector if needed.
- Pathological CRLF-stripped inputs — `input.lines()` strips `\r`
  only when paired with `\n`. Acceptable.

What does NOT land here (per PR scope):
- No PyO3 surface — module-only.
- No router rewiring — the existing regex `content_detector` still
  drives `ContentRouter`. PR5 chains magika → unidiff → PlainText.

The `unidiff` crate brings `regex` (already in tree) and `encoding_rs`
(default features) — small dep impact.

`make ci-precheck` green.
2026-04-28 23:19:09 -07:00
chopratejas
d34658b22e chore(rust): port Magika detection (Stage 3d PR3 — Tier 1)
Adds Google's `magika` ONNX-backed content classifier as the first
tier of the new Stage-3d ContentRouter detection arch (`magika` →
`unidiff-rs` → `PlainText` fall-through; no regex tier on the Rust
side).

What lands:
- New module `crates/headroom-core/src/transforms/magika_detector.rs`:
  - `magika_detect(content: &str) -> Result<ContentType, _>`
  - `OnceLock<Mutex<Result<Session, _>>>` singleton: model loads
    once per process; init failure is recorded once and cheaply
    replayed (no retry — rust-side `feedback_no_silent_fallbacks`).
  - `map_magika_label(&str) -> ContentType`: explicit match arms
    against magika's 200+ labels, mapped onto Headroom's existing
    `ContentType` enum so the dispatch (PR5) stays enum-stable.
    Unmapped labels passthrough to `PlainText` rather than misroute.
- 16 unit tests: empty fast-path, JSON / Python / Rust / JS /
  diff / markdown / plain prose / HTML / YAML / shell / SQL,
  singleton-reuse smoke, default-passthrough for unmapped labels,
  pure-table-lookup sanity.

What does NOT land here (per PR scope):
- No PyO3 surface yet — PR3 is detector-only.
- No router rewiring — the existing regex `content_detector` still
  drives `ContentRouter` until PR5 flips the dispatch.
- No `unidiff-rs` Tier-2 — that's PR4.

The `magika` crate brings `ndarray` + `ort` (already in our dep
tree via `fastembed`); adding it shares the ONNX Runtime singleton
rather than pulling a second ML stack.

`make ci-precheck` green.
2026-04-28 22:36:28 -07:00