Spaces:
Build error
feat(rust): scaffold workspace + parity harness (phase-0)
Browse filesBootstrap the Rust port of Headroom. Additive only — no existing Python
code modified. Ships the workshop, not the widgets.
Layout
Cargo.toml (workspace) + rust-toolchain.toml
crates/headroom-core — transform library, stub only
crates/headroom-proxy — axum binary, /healthz only
crates/headroom-py — PyO3 cdylib, exposes headroom._core.hello()
crates/headroom-parity — Rust-vs-Python oracle harness + parity-run CLI
Tooling
Makefile: test, test-parity, bench, build-proxy, build-wheel, fmt, lint
.github/workflows/rust.yml: test, wheels (linux/mac), audit, parity-nightly
deny.toml for cargo-deny
Parity corpus
tests/parity/recorder.py + scripts/record_fixtures.py
125 recorded fixtures across 5 leaf transforms (ccr, tokenizer,
log_compressor, diff_compressor, cache_aligner)
Docs
RUST_DEV.md — developer setup and workspace reference
docs/spec/022-rust-migration.md — migration plan and stage breakdown
.gitignore: whitelist scripts/record_fixtures.py; ignore target/
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- .github/workflows/rust.yml +123 -0
- .gitignore +6 -0
- Cargo.lock +1797 -0
- Cargo.toml +39 -0
- Makefile +58 -0
- RUST_DEV.md +142 -0
- crates/headroom-core/Cargo.toml +15 -0
- crates/headroom-core/src/lib.rs +21 -0
- crates/headroom-core/src/transforms/mod.rs +2 -0
- crates/headroom-parity/Cargo.toml +26 -0
- crates/headroom-parity/src/bin/parity_run.rs +78 -0
- crates/headroom-parity/src/lib.rs +308 -0
- crates/headroom-proxy/Cargo.toml +25 -0
- crates/headroom-proxy/src/main.rs +57 -0
- crates/headroom-py/Cargo.toml +26 -0
- crates/headroom-py/pyproject.toml +21 -0
- crates/headroom-py/python/headroom/__init__.py +0 -0
- crates/headroom-py/src/lib.rs +15 -0
- deny.toml +32 -0
- docs/spec/022-rust-migration.md +98 -0
- rust-toolchain.toml +4 -0
- scripts/record_fixtures.py +59 -0
- tests/parity/fixtures/cache_aligner/0225460359a992d9.json +64 -0
- tests/parity/fixtures/cache_aligner/231ab237501e106b.json +64 -0
- tests/parity/fixtures/cache_aligner/25683f67cbb74ece.json +64 -0
- tests/parity/fixtures/cache_aligner/31eb80356eeeb30d.json +64 -0
- tests/parity/fixtures/cache_aligner/336311b995b063d5.json +64 -0
- tests/parity/fixtures/cache_aligner/475e76a9f99c29ab.json +64 -0
- tests/parity/fixtures/cache_aligner/4b171a7f9af6e2d5.json +64 -0
- tests/parity/fixtures/cache_aligner/541daf83f5a1fda9.json +64 -0
- tests/parity/fixtures/cache_aligner/6502f683439de052.json +64 -0
- tests/parity/fixtures/cache_aligner/7b556192a56bca94.json +64 -0
- tests/parity/fixtures/cache_aligner/8822af1cf9a14254.json +64 -0
- tests/parity/fixtures/cache_aligner/92b25557cfbfa8db.json +64 -0
- tests/parity/fixtures/cache_aligner/acda633b1733c6e6.json +64 -0
- tests/parity/fixtures/cache_aligner/c2563e51d50a4da6.json +64 -0
- tests/parity/fixtures/cache_aligner/c43df917ec5d7d4c.json +64 -0
- tests/parity/fixtures/cache_aligner/c5ec19381964f8ef.json +64 -0
- tests/parity/fixtures/cache_aligner/e7a901cbf00a645f.json +64 -0
- tests/parity/fixtures/cache_aligner/ed9c7e7ca8f0ada6.json +64 -0
- tests/parity/fixtures/cache_aligner/efe495ffb2ff9922.json +64 -0
- tests/parity/fixtures/cache_aligner/f2b50b3cf76fe6a1.json +64 -0
- tests/parity/fixtures/ccr/15887705e46d70a3.json +41 -0
- tests/parity/fixtures/ccr/1e13216df83b1b24.json +41 -0
- tests/parity/fixtures/ccr/22e61aa4e1839aaf.json +44 -0
- tests/parity/fixtures/ccr/2670d5319d6ff242.json +44 -0
- tests/parity/fixtures/ccr/2c7824a6bc69ae89.json +41 -0
- tests/parity/fixtures/ccr/3d8773cdc4d3493c.json +44 -0
- tests/parity/fixtures/ccr/3de30e123dc02906.json +44 -0
- tests/parity/fixtures/ccr/7d7e15a8b88f7f62.json +44 -0
|
@@ -0,0 +1,123 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: rust
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches: [ main, rust-rewrite ]
|
| 6 |
+
paths:
|
| 7 |
+
- 'crates/**'
|
| 8 |
+
- 'Cargo.toml'
|
| 9 |
+
- 'Cargo.lock'
|
| 10 |
+
- 'rust-toolchain.toml'
|
| 11 |
+
- 'tests/parity/**'
|
| 12 |
+
- 'Makefile'
|
| 13 |
+
- '.github/workflows/rust.yml'
|
| 14 |
+
pull_request:
|
| 15 |
+
paths:
|
| 16 |
+
- 'crates/**'
|
| 17 |
+
- 'Cargo.toml'
|
| 18 |
+
- 'Cargo.lock'
|
| 19 |
+
- 'rust-toolchain.toml'
|
| 20 |
+
- 'tests/parity/**'
|
| 21 |
+
- 'Makefile'
|
| 22 |
+
- '.github/workflows/rust.yml'
|
| 23 |
+
schedule:
|
| 24 |
+
# Nightly parity run at 07:17 UTC (weekdays only). Phase 0 allows failure.
|
| 25 |
+
- cron: '17 7 * * 1-5'
|
| 26 |
+
|
| 27 |
+
concurrency:
|
| 28 |
+
group: rust-${{ github.ref }}
|
| 29 |
+
cancel-in-progress: true
|
| 30 |
+
|
| 31 |
+
jobs:
|
| 32 |
+
test:
|
| 33 |
+
name: test (ubuntu)
|
| 34 |
+
runs-on: ubuntu-latest
|
| 35 |
+
steps:
|
| 36 |
+
- uses: actions/checkout@v4
|
| 37 |
+
- name: Install stable toolchain
|
| 38 |
+
uses: dtolnay/rust-toolchain@stable
|
| 39 |
+
with:
|
| 40 |
+
components: rustfmt, clippy
|
| 41 |
+
- name: Cache cargo registry + build
|
| 42 |
+
uses: Swatinem/rust-cache@v2
|
| 43 |
+
- name: cargo fmt --check
|
| 44 |
+
run: cargo fmt --all -- --check
|
| 45 |
+
- name: cargo clippy
|
| 46 |
+
run: cargo clippy --workspace -- -D warnings
|
| 47 |
+
- name: cargo test
|
| 48 |
+
run: cargo test --workspace
|
| 49 |
+
|
| 50 |
+
wheels:
|
| 51 |
+
name: wheels (${{ matrix.target }})
|
| 52 |
+
runs-on: ${{ matrix.os }}
|
| 53 |
+
strategy:
|
| 54 |
+
fail-fast: false
|
| 55 |
+
matrix:
|
| 56 |
+
include:
|
| 57 |
+
- os: ubuntu-latest
|
| 58 |
+
target: x86_64-unknown-linux-gnu
|
| 59 |
+
maturin-target: x86_64
|
| 60 |
+
- os: macos-14
|
| 61 |
+
target: aarch64-apple-darwin
|
| 62 |
+
maturin-target: aarch64-apple-darwin
|
| 63 |
+
- os: macos-13
|
| 64 |
+
target: x86_64-apple-darwin
|
| 65 |
+
maturin-target: x86_64-apple-darwin
|
| 66 |
+
steps:
|
| 67 |
+
- uses: actions/checkout@v4
|
| 68 |
+
- uses: actions/setup-python@v5
|
| 69 |
+
with:
|
| 70 |
+
python-version: '3.11'
|
| 71 |
+
- name: Build wheel
|
| 72 |
+
uses: PyO3/maturin-action@v1
|
| 73 |
+
with:
|
| 74 |
+
command: build
|
| 75 |
+
args: --release -m crates/headroom-py/pyproject.toml --out dist
|
| 76 |
+
target: ${{ matrix.maturin-target }}
|
| 77 |
+
- name: Upload wheel artifact
|
| 78 |
+
uses: actions/upload-artifact@v4
|
| 79 |
+
with:
|
| 80 |
+
name: wheels-${{ matrix.target }}
|
| 81 |
+
path: dist/*.whl
|
| 82 |
+
|
| 83 |
+
audit:
|
| 84 |
+
name: audit
|
| 85 |
+
runs-on: ubuntu-latest
|
| 86 |
+
steps:
|
| 87 |
+
- uses: actions/checkout@v4
|
| 88 |
+
- uses: dtolnay/rust-toolchain@stable
|
| 89 |
+
- uses: Swatinem/rust-cache@v2
|
| 90 |
+
- name: Install cargo-audit + cargo-deny
|
| 91 |
+
run: |
|
| 92 |
+
cargo install --locked cargo-audit || true
|
| 93 |
+
cargo install --locked cargo-deny || true
|
| 94 |
+
- name: cargo audit (soft-fail)
|
| 95 |
+
continue-on-error: true
|
| 96 |
+
run: cargo audit
|
| 97 |
+
- name: cargo deny check licenses
|
| 98 |
+
continue-on-error: true
|
| 99 |
+
run: cargo deny check licenses
|
| 100 |
+
|
| 101 |
+
parity-nightly:
|
| 102 |
+
name: parity (nightly, allowed to fail during Phase 0)
|
| 103 |
+
if: github.event_name == 'schedule'
|
| 104 |
+
runs-on: ubuntu-latest
|
| 105 |
+
continue-on-error: true
|
| 106 |
+
steps:
|
| 107 |
+
- uses: actions/checkout@v4
|
| 108 |
+
- uses: dtolnay/rust-toolchain@stable
|
| 109 |
+
- uses: actions/setup-python@v5
|
| 110 |
+
with:
|
| 111 |
+
python-version: '3.11'
|
| 112 |
+
- uses: Swatinem/rust-cache@v2
|
| 113 |
+
- name: Install deps
|
| 114 |
+
run: |
|
| 115 |
+
python -m venv .venv
|
| 116 |
+
source .venv/bin/activate
|
| 117 |
+
pip install --upgrade pip
|
| 118 |
+
pip install maturin
|
| 119 |
+
pip install -e .
|
| 120 |
+
- name: Run parity harness
|
| 121 |
+
run: |
|
| 122 |
+
source .venv/bin/activate
|
| 123 |
+
make test-parity
|
|
@@ -13,6 +13,12 @@ scripts/*
|
|
| 13 |
!scripts/repro_codex_replay.py
|
| 14 |
!scripts/fixtures/
|
| 15 |
!scripts/fixtures/*.json
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
# Swift SDK (separate repo)
|
| 18 |
swift/
|
|
|
|
| 13 |
!scripts/repro_codex_replay.py
|
| 14 |
!scripts/fixtures/
|
| 15 |
!scripts/fixtures/*.json
|
| 16 |
+
!scripts/record_fixtures.py
|
| 17 |
+
|
| 18 |
+
# Rust / Cargo build artifacts
|
| 19 |
+
/target/
|
| 20 |
+
**/target/
|
| 21 |
+
Cargo.lock.bak
|
| 22 |
|
| 23 |
# Swift SDK (separate repo)
|
| 24 |
swift/
|
|
@@ -0,0 +1,1797 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file is automatically @generated by Cargo.
|
| 2 |
+
# It is not intended for manual editing.
|
| 3 |
+
version = 3
|
| 4 |
+
|
| 5 |
+
[[package]]
|
| 6 |
+
name = "anstream"
|
| 7 |
+
version = "1.0.0"
|
| 8 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 9 |
+
checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
|
| 10 |
+
dependencies = [
|
| 11 |
+
"anstyle",
|
| 12 |
+
"anstyle-parse",
|
| 13 |
+
"anstyle-query",
|
| 14 |
+
"anstyle-wincon",
|
| 15 |
+
"colorchoice",
|
| 16 |
+
"is_terminal_polyfill",
|
| 17 |
+
"utf8parse",
|
| 18 |
+
]
|
| 19 |
+
|
| 20 |
+
[[package]]
|
| 21 |
+
name = "anstyle"
|
| 22 |
+
version = "1.0.14"
|
| 23 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 24 |
+
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
| 25 |
+
|
| 26 |
+
[[package]]
|
| 27 |
+
name = "anstyle-parse"
|
| 28 |
+
version = "1.0.0"
|
| 29 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 30 |
+
checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
|
| 31 |
+
dependencies = [
|
| 32 |
+
"utf8parse",
|
| 33 |
+
]
|
| 34 |
+
|
| 35 |
+
[[package]]
|
| 36 |
+
name = "anstyle-query"
|
| 37 |
+
version = "1.1.5"
|
| 38 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 39 |
+
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
|
| 40 |
+
dependencies = [
|
| 41 |
+
"windows-sys 0.61.2",
|
| 42 |
+
]
|
| 43 |
+
|
| 44 |
+
[[package]]
|
| 45 |
+
name = "anstyle-wincon"
|
| 46 |
+
version = "3.0.11"
|
| 47 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 48 |
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
|
| 49 |
+
dependencies = [
|
| 50 |
+
"anstyle",
|
| 51 |
+
"once_cell_polyfill",
|
| 52 |
+
"windows-sys 0.61.2",
|
| 53 |
+
]
|
| 54 |
+
|
| 55 |
+
[[package]]
|
| 56 |
+
name = "anyhow"
|
| 57 |
+
version = "1.0.102"
|
| 58 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 59 |
+
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
| 60 |
+
|
| 61 |
+
[[package]]
|
| 62 |
+
name = "async-trait"
|
| 63 |
+
version = "0.1.89"
|
| 64 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 65 |
+
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
|
| 66 |
+
dependencies = [
|
| 67 |
+
"proc-macro2",
|
| 68 |
+
"quote",
|
| 69 |
+
"syn",
|
| 70 |
+
]
|
| 71 |
+
|
| 72 |
+
[[package]]
|
| 73 |
+
name = "atomic-waker"
|
| 74 |
+
version = "1.1.2"
|
| 75 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 76 |
+
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
|
| 77 |
+
|
| 78 |
+
[[package]]
|
| 79 |
+
name = "autocfg"
|
| 80 |
+
version = "1.5.0"
|
| 81 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 82 |
+
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
| 83 |
+
|
| 84 |
+
[[package]]
|
| 85 |
+
name = "axum"
|
| 86 |
+
version = "0.7.9"
|
| 87 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 88 |
+
checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
|
| 89 |
+
dependencies = [
|
| 90 |
+
"async-trait",
|
| 91 |
+
"axum-core",
|
| 92 |
+
"bytes",
|
| 93 |
+
"futures-util",
|
| 94 |
+
"http",
|
| 95 |
+
"http-body",
|
| 96 |
+
"http-body-util",
|
| 97 |
+
"hyper",
|
| 98 |
+
"hyper-util",
|
| 99 |
+
"itoa",
|
| 100 |
+
"matchit",
|
| 101 |
+
"memchr",
|
| 102 |
+
"mime",
|
| 103 |
+
"percent-encoding",
|
| 104 |
+
"pin-project-lite",
|
| 105 |
+
"rustversion",
|
| 106 |
+
"serde",
|
| 107 |
+
"serde_json",
|
| 108 |
+
"serde_path_to_error",
|
| 109 |
+
"serde_urlencoded",
|
| 110 |
+
"sync_wrapper",
|
| 111 |
+
"tokio",
|
| 112 |
+
"tower",
|
| 113 |
+
"tower-layer",
|
| 114 |
+
"tower-service",
|
| 115 |
+
"tracing",
|
| 116 |
+
]
|
| 117 |
+
|
| 118 |
+
[[package]]
|
| 119 |
+
name = "axum-core"
|
| 120 |
+
version = "0.4.5"
|
| 121 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 122 |
+
checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
|
| 123 |
+
dependencies = [
|
| 124 |
+
"async-trait",
|
| 125 |
+
"bytes",
|
| 126 |
+
"futures-util",
|
| 127 |
+
"http",
|
| 128 |
+
"http-body",
|
| 129 |
+
"http-body-util",
|
| 130 |
+
"mime",
|
| 131 |
+
"pin-project-lite",
|
| 132 |
+
"rustversion",
|
| 133 |
+
"sync_wrapper",
|
| 134 |
+
"tower-layer",
|
| 135 |
+
"tower-service",
|
| 136 |
+
"tracing",
|
| 137 |
+
]
|
| 138 |
+
|
| 139 |
+
[[package]]
|
| 140 |
+
name = "base64"
|
| 141 |
+
version = "0.22.1"
|
| 142 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 143 |
+
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
| 144 |
+
|
| 145 |
+
[[package]]
|
| 146 |
+
name = "bitflags"
|
| 147 |
+
version = "2.11.1"
|
| 148 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 149 |
+
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
| 150 |
+
|
| 151 |
+
[[package]]
|
| 152 |
+
name = "bumpalo"
|
| 153 |
+
version = "3.20.2"
|
| 154 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 155 |
+
checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
|
| 156 |
+
|
| 157 |
+
[[package]]
|
| 158 |
+
name = "bytes"
|
| 159 |
+
version = "1.11.1"
|
| 160 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 161 |
+
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
| 162 |
+
|
| 163 |
+
[[package]]
|
| 164 |
+
name = "cc"
|
| 165 |
+
version = "1.2.60"
|
| 166 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 167 |
+
checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20"
|
| 168 |
+
dependencies = [
|
| 169 |
+
"find-msvc-tools",
|
| 170 |
+
"shlex",
|
| 171 |
+
]
|
| 172 |
+
|
| 173 |
+
[[package]]
|
| 174 |
+
name = "cfg-if"
|
| 175 |
+
version = "1.0.4"
|
| 176 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 177 |
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
| 178 |
+
|
| 179 |
+
[[package]]
|
| 180 |
+
name = "cfg_aliases"
|
| 181 |
+
version = "0.2.1"
|
| 182 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 183 |
+
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
| 184 |
+
|
| 185 |
+
[[package]]
|
| 186 |
+
name = "clap"
|
| 187 |
+
version = "4.6.1"
|
| 188 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 189 |
+
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
|
| 190 |
+
dependencies = [
|
| 191 |
+
"clap_builder",
|
| 192 |
+
"clap_derive",
|
| 193 |
+
]
|
| 194 |
+
|
| 195 |
+
[[package]]
|
| 196 |
+
name = "clap_builder"
|
| 197 |
+
version = "4.6.0"
|
| 198 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 199 |
+
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
|
| 200 |
+
dependencies = [
|
| 201 |
+
"anstream",
|
| 202 |
+
"anstyle",
|
| 203 |
+
"clap_lex",
|
| 204 |
+
"strsim",
|
| 205 |
+
]
|
| 206 |
+
|
| 207 |
+
[[package]]
|
| 208 |
+
name = "clap_derive"
|
| 209 |
+
version = "4.6.1"
|
| 210 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 211 |
+
checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
|
| 212 |
+
dependencies = [
|
| 213 |
+
"heck",
|
| 214 |
+
"proc-macro2",
|
| 215 |
+
"quote",
|
| 216 |
+
"syn",
|
| 217 |
+
]
|
| 218 |
+
|
| 219 |
+
[[package]]
|
| 220 |
+
name = "clap_lex"
|
| 221 |
+
version = "1.1.0"
|
| 222 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 223 |
+
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
|
| 224 |
+
|
| 225 |
+
[[package]]
|
| 226 |
+
name = "colorchoice"
|
| 227 |
+
version = "1.0.5"
|
| 228 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 229 |
+
checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
| 230 |
+
|
| 231 |
+
[[package]]
|
| 232 |
+
name = "displaydoc"
|
| 233 |
+
version = "0.2.5"
|
| 234 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 235 |
+
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
|
| 236 |
+
dependencies = [
|
| 237 |
+
"proc-macro2",
|
| 238 |
+
"quote",
|
| 239 |
+
"syn",
|
| 240 |
+
]
|
| 241 |
+
|
| 242 |
+
[[package]]
|
| 243 |
+
name = "errno"
|
| 244 |
+
version = "0.3.14"
|
| 245 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 246 |
+
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
| 247 |
+
dependencies = [
|
| 248 |
+
"libc",
|
| 249 |
+
"windows-sys 0.61.2",
|
| 250 |
+
]
|
| 251 |
+
|
| 252 |
+
[[package]]
|
| 253 |
+
name = "find-msvc-tools"
|
| 254 |
+
version = "0.1.9"
|
| 255 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 256 |
+
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
|
| 257 |
+
|
| 258 |
+
[[package]]
|
| 259 |
+
name = "form_urlencoded"
|
| 260 |
+
version = "1.2.2"
|
| 261 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 262 |
+
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
|
| 263 |
+
dependencies = [
|
| 264 |
+
"percent-encoding",
|
| 265 |
+
]
|
| 266 |
+
|
| 267 |
+
[[package]]
|
| 268 |
+
name = "futures-channel"
|
| 269 |
+
version = "0.3.32"
|
| 270 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 271 |
+
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
|
| 272 |
+
dependencies = [
|
| 273 |
+
"futures-core",
|
| 274 |
+
]
|
| 275 |
+
|
| 276 |
+
[[package]]
|
| 277 |
+
name = "futures-core"
|
| 278 |
+
version = "0.3.32"
|
| 279 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 280 |
+
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
|
| 281 |
+
|
| 282 |
+
[[package]]
|
| 283 |
+
name = "futures-task"
|
| 284 |
+
version = "0.3.32"
|
| 285 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 286 |
+
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
|
| 287 |
+
|
| 288 |
+
[[package]]
|
| 289 |
+
name = "futures-util"
|
| 290 |
+
version = "0.3.32"
|
| 291 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 292 |
+
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
| 293 |
+
dependencies = [
|
| 294 |
+
"futures-core",
|
| 295 |
+
"futures-task",
|
| 296 |
+
"pin-project-lite",
|
| 297 |
+
"slab",
|
| 298 |
+
]
|
| 299 |
+
|
| 300 |
+
[[package]]
|
| 301 |
+
name = "getrandom"
|
| 302 |
+
version = "0.2.17"
|
| 303 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 304 |
+
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
|
| 305 |
+
dependencies = [
|
| 306 |
+
"cfg-if",
|
| 307 |
+
"js-sys",
|
| 308 |
+
"libc",
|
| 309 |
+
"wasi",
|
| 310 |
+
"wasm-bindgen",
|
| 311 |
+
]
|
| 312 |
+
|
| 313 |
+
[[package]]
|
| 314 |
+
name = "getrandom"
|
| 315 |
+
version = "0.3.4"
|
| 316 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 317 |
+
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
|
| 318 |
+
dependencies = [
|
| 319 |
+
"cfg-if",
|
| 320 |
+
"js-sys",
|
| 321 |
+
"libc",
|
| 322 |
+
"r-efi",
|
| 323 |
+
"wasip2",
|
| 324 |
+
"wasm-bindgen",
|
| 325 |
+
]
|
| 326 |
+
|
| 327 |
+
[[package]]
|
| 328 |
+
name = "headroom-core"
|
| 329 |
+
version = "0.1.0"
|
| 330 |
+
dependencies = [
|
| 331 |
+
"bytes",
|
| 332 |
+
"serde",
|
| 333 |
+
"serde_json",
|
| 334 |
+
"thiserror 1.0.69",
|
| 335 |
+
"tracing",
|
| 336 |
+
]
|
| 337 |
+
|
| 338 |
+
[[package]]
|
| 339 |
+
name = "headroom-parity"
|
| 340 |
+
version = "0.1.0"
|
| 341 |
+
dependencies = [
|
| 342 |
+
"anyhow",
|
| 343 |
+
"clap",
|
| 344 |
+
"headroom-core",
|
| 345 |
+
"serde",
|
| 346 |
+
"serde_json",
|
| 347 |
+
"thiserror 1.0.69",
|
| 348 |
+
]
|
| 349 |
+
|
| 350 |
+
[[package]]
|
| 351 |
+
name = "headroom-proxy"
|
| 352 |
+
version = "0.1.0"
|
| 353 |
+
dependencies = [
|
| 354 |
+
"axum",
|
| 355 |
+
"headroom-core",
|
| 356 |
+
"reqwest",
|
| 357 |
+
"serde",
|
| 358 |
+
"serde_json",
|
| 359 |
+
"tokio",
|
| 360 |
+
"tower",
|
| 361 |
+
"tracing",
|
| 362 |
+
]
|
| 363 |
+
|
| 364 |
+
[[package]]
|
| 365 |
+
name = "headroom-py"
|
| 366 |
+
version = "0.1.0"
|
| 367 |
+
dependencies = [
|
| 368 |
+
"headroom-core",
|
| 369 |
+
"pyo3",
|
| 370 |
+
]
|
| 371 |
+
|
| 372 |
+
[[package]]
|
| 373 |
+
name = "heck"
|
| 374 |
+
version = "0.5.0"
|
| 375 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 376 |
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
| 377 |
+
|
| 378 |
+
[[package]]
|
| 379 |
+
name = "http"
|
| 380 |
+
version = "1.4.0"
|
| 381 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 382 |
+
checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
|
| 383 |
+
dependencies = [
|
| 384 |
+
"bytes",
|
| 385 |
+
"itoa",
|
| 386 |
+
]
|
| 387 |
+
|
| 388 |
+
[[package]]
|
| 389 |
+
name = "http-body"
|
| 390 |
+
version = "1.0.1"
|
| 391 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 392 |
+
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
|
| 393 |
+
dependencies = [
|
| 394 |
+
"bytes",
|
| 395 |
+
"http",
|
| 396 |
+
]
|
| 397 |
+
|
| 398 |
+
[[package]]
|
| 399 |
+
name = "http-body-util"
|
| 400 |
+
version = "0.1.3"
|
| 401 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 402 |
+
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
|
| 403 |
+
dependencies = [
|
| 404 |
+
"bytes",
|
| 405 |
+
"futures-core",
|
| 406 |
+
"http",
|
| 407 |
+
"http-body",
|
| 408 |
+
"pin-project-lite",
|
| 409 |
+
]
|
| 410 |
+
|
| 411 |
+
[[package]]
|
| 412 |
+
name = "httparse"
|
| 413 |
+
version = "1.10.1"
|
| 414 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 415 |
+
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
|
| 416 |
+
|
| 417 |
+
[[package]]
|
| 418 |
+
name = "httpdate"
|
| 419 |
+
version = "1.0.3"
|
| 420 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 421 |
+
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
| 422 |
+
|
| 423 |
+
[[package]]
|
| 424 |
+
name = "hyper"
|
| 425 |
+
version = "1.9.0"
|
| 426 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 427 |
+
checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
|
| 428 |
+
dependencies = [
|
| 429 |
+
"atomic-waker",
|
| 430 |
+
"bytes",
|
| 431 |
+
"futures-channel",
|
| 432 |
+
"futures-core",
|
| 433 |
+
"http",
|
| 434 |
+
"http-body",
|
| 435 |
+
"httparse",
|
| 436 |
+
"httpdate",
|
| 437 |
+
"itoa",
|
| 438 |
+
"pin-project-lite",
|
| 439 |
+
"smallvec",
|
| 440 |
+
"tokio",
|
| 441 |
+
"want",
|
| 442 |
+
]
|
| 443 |
+
|
| 444 |
+
[[package]]
|
| 445 |
+
name = "hyper-rustls"
|
| 446 |
+
version = "0.27.9"
|
| 447 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 448 |
+
checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f"
|
| 449 |
+
dependencies = [
|
| 450 |
+
"http",
|
| 451 |
+
"hyper",
|
| 452 |
+
"hyper-util",
|
| 453 |
+
"rustls",
|
| 454 |
+
"tokio",
|
| 455 |
+
"tokio-rustls",
|
| 456 |
+
"tower-service",
|
| 457 |
+
"webpki-roots",
|
| 458 |
+
]
|
| 459 |
+
|
| 460 |
+
[[package]]
|
| 461 |
+
name = "hyper-util"
|
| 462 |
+
version = "0.1.20"
|
| 463 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 464 |
+
checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
|
| 465 |
+
dependencies = [
|
| 466 |
+
"base64",
|
| 467 |
+
"bytes",
|
| 468 |
+
"futures-channel",
|
| 469 |
+
"futures-util",
|
| 470 |
+
"http",
|
| 471 |
+
"http-body",
|
| 472 |
+
"hyper",
|
| 473 |
+
"ipnet",
|
| 474 |
+
"libc",
|
| 475 |
+
"percent-encoding",
|
| 476 |
+
"pin-project-lite",
|
| 477 |
+
"socket2",
|
| 478 |
+
"tokio",
|
| 479 |
+
"tower-service",
|
| 480 |
+
"tracing",
|
| 481 |
+
]
|
| 482 |
+
|
| 483 |
+
[[package]]
|
| 484 |
+
name = "icu_collections"
|
| 485 |
+
version = "2.2.0"
|
| 486 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 487 |
+
checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
|
| 488 |
+
dependencies = [
|
| 489 |
+
"displaydoc",
|
| 490 |
+
"potential_utf",
|
| 491 |
+
"utf8_iter",
|
| 492 |
+
"yoke",
|
| 493 |
+
"zerofrom",
|
| 494 |
+
"zerovec",
|
| 495 |
+
]
|
| 496 |
+
|
| 497 |
+
[[package]]
|
| 498 |
+
name = "icu_locale_core"
|
| 499 |
+
version = "2.2.0"
|
| 500 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 501 |
+
checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
|
| 502 |
+
dependencies = [
|
| 503 |
+
"displaydoc",
|
| 504 |
+
"litemap",
|
| 505 |
+
"tinystr",
|
| 506 |
+
"writeable",
|
| 507 |
+
"zerovec",
|
| 508 |
+
]
|
| 509 |
+
|
| 510 |
+
[[package]]
|
| 511 |
+
name = "icu_normalizer"
|
| 512 |
+
version = "2.2.0"
|
| 513 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 514 |
+
checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
|
| 515 |
+
dependencies = [
|
| 516 |
+
"icu_collections",
|
| 517 |
+
"icu_normalizer_data",
|
| 518 |
+
"icu_properties",
|
| 519 |
+
"icu_provider",
|
| 520 |
+
"smallvec",
|
| 521 |
+
"zerovec",
|
| 522 |
+
]
|
| 523 |
+
|
| 524 |
+
[[package]]
|
| 525 |
+
name = "icu_normalizer_data"
|
| 526 |
+
version = "2.2.0"
|
| 527 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 528 |
+
checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
|
| 529 |
+
|
| 530 |
+
[[package]]
|
| 531 |
+
name = "icu_properties"
|
| 532 |
+
version = "2.2.0"
|
| 533 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 534 |
+
checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
|
| 535 |
+
dependencies = [
|
| 536 |
+
"icu_collections",
|
| 537 |
+
"icu_locale_core",
|
| 538 |
+
"icu_properties_data",
|
| 539 |
+
"icu_provider",
|
| 540 |
+
"zerotrie",
|
| 541 |
+
"zerovec",
|
| 542 |
+
]
|
| 543 |
+
|
| 544 |
+
[[package]]
|
| 545 |
+
name = "icu_properties_data"
|
| 546 |
+
version = "2.2.0"
|
| 547 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 548 |
+
checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
|
| 549 |
+
|
| 550 |
+
[[package]]
|
| 551 |
+
name = "icu_provider"
|
| 552 |
+
version = "2.2.0"
|
| 553 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 554 |
+
checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
|
| 555 |
+
dependencies = [
|
| 556 |
+
"displaydoc",
|
| 557 |
+
"icu_locale_core",
|
| 558 |
+
"writeable",
|
| 559 |
+
"yoke",
|
| 560 |
+
"zerofrom",
|
| 561 |
+
"zerotrie",
|
| 562 |
+
"zerovec",
|
| 563 |
+
]
|
| 564 |
+
|
| 565 |
+
[[package]]
|
| 566 |
+
name = "idna"
|
| 567 |
+
version = "1.1.0"
|
| 568 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 569 |
+
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
|
| 570 |
+
dependencies = [
|
| 571 |
+
"idna_adapter",
|
| 572 |
+
"smallvec",
|
| 573 |
+
"utf8_iter",
|
| 574 |
+
]
|
| 575 |
+
|
| 576 |
+
[[package]]
|
| 577 |
+
name = "idna_adapter"
|
| 578 |
+
version = "1.2.1"
|
| 579 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 580 |
+
checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
|
| 581 |
+
dependencies = [
|
| 582 |
+
"icu_normalizer",
|
| 583 |
+
"icu_properties",
|
| 584 |
+
]
|
| 585 |
+
|
| 586 |
+
[[package]]
|
| 587 |
+
name = "indoc"
|
| 588 |
+
version = "2.0.7"
|
| 589 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 590 |
+
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
|
| 591 |
+
dependencies = [
|
| 592 |
+
"rustversion",
|
| 593 |
+
]
|
| 594 |
+
|
| 595 |
+
[[package]]
|
| 596 |
+
name = "ipnet"
|
| 597 |
+
version = "2.12.0"
|
| 598 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 599 |
+
checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
|
| 600 |
+
|
| 601 |
+
[[package]]
|
| 602 |
+
name = "iri-string"
|
| 603 |
+
version = "0.7.12"
|
| 604 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 605 |
+
checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20"
|
| 606 |
+
dependencies = [
|
| 607 |
+
"memchr",
|
| 608 |
+
"serde",
|
| 609 |
+
]
|
| 610 |
+
|
| 611 |
+
[[package]]
|
| 612 |
+
name = "is_terminal_polyfill"
|
| 613 |
+
version = "1.70.2"
|
| 614 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 615 |
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
|
| 616 |
+
|
| 617 |
+
[[package]]
|
| 618 |
+
name = "itoa"
|
| 619 |
+
version = "1.0.18"
|
| 620 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 621 |
+
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
| 622 |
+
|
| 623 |
+
[[package]]
|
| 624 |
+
name = "js-sys"
|
| 625 |
+
version = "0.3.95"
|
| 626 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 627 |
+
checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
|
| 628 |
+
dependencies = [
|
| 629 |
+
"cfg-if",
|
| 630 |
+
"futures-util",
|
| 631 |
+
"once_cell",
|
| 632 |
+
"wasm-bindgen",
|
| 633 |
+
]
|
| 634 |
+
|
| 635 |
+
[[package]]
|
| 636 |
+
name = "libc"
|
| 637 |
+
version = "0.2.185"
|
| 638 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 639 |
+
checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f"
|
| 640 |
+
|
| 641 |
+
[[package]]
|
| 642 |
+
name = "litemap"
|
| 643 |
+
version = "0.8.2"
|
| 644 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 645 |
+
checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
|
| 646 |
+
|
| 647 |
+
[[package]]
|
| 648 |
+
name = "log"
|
| 649 |
+
version = "0.4.29"
|
| 650 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 651 |
+
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
| 652 |
+
|
| 653 |
+
[[package]]
|
| 654 |
+
name = "lru-slab"
|
| 655 |
+
version = "0.1.2"
|
| 656 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 657 |
+
checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
|
| 658 |
+
|
| 659 |
+
[[package]]
|
| 660 |
+
name = "matchit"
|
| 661 |
+
version = "0.7.3"
|
| 662 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 663 |
+
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
|
| 664 |
+
|
| 665 |
+
[[package]]
|
| 666 |
+
name = "memchr"
|
| 667 |
+
version = "2.8.0"
|
| 668 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 669 |
+
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
|
| 670 |
+
|
| 671 |
+
[[package]]
|
| 672 |
+
name = "memoffset"
|
| 673 |
+
version = "0.9.1"
|
| 674 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 675 |
+
checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
|
| 676 |
+
dependencies = [
|
| 677 |
+
"autocfg",
|
| 678 |
+
]
|
| 679 |
+
|
| 680 |
+
[[package]]
|
| 681 |
+
name = "mime"
|
| 682 |
+
version = "0.3.17"
|
| 683 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 684 |
+
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
| 685 |
+
|
| 686 |
+
[[package]]
|
| 687 |
+
name = "mio"
|
| 688 |
+
version = "1.2.0"
|
| 689 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 690 |
+
checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
|
| 691 |
+
dependencies = [
|
| 692 |
+
"libc",
|
| 693 |
+
"wasi",
|
| 694 |
+
"windows-sys 0.61.2",
|
| 695 |
+
]
|
| 696 |
+
|
| 697 |
+
[[package]]
|
| 698 |
+
name = "once_cell"
|
| 699 |
+
version = "1.21.4"
|
| 700 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 701 |
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
| 702 |
+
|
| 703 |
+
[[package]]
|
| 704 |
+
name = "once_cell_polyfill"
|
| 705 |
+
version = "1.70.2"
|
| 706 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 707 |
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
|
| 708 |
+
|
| 709 |
+
[[package]]
|
| 710 |
+
name = "percent-encoding"
|
| 711 |
+
version = "2.3.2"
|
| 712 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 713 |
+
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
|
| 714 |
+
|
| 715 |
+
[[package]]
|
| 716 |
+
name = "pin-project-lite"
|
| 717 |
+
version = "0.2.17"
|
| 718 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 719 |
+
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
|
| 720 |
+
|
| 721 |
+
[[package]]
|
| 722 |
+
name = "portable-atomic"
|
| 723 |
+
version = "1.13.1"
|
| 724 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 725 |
+
checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
|
| 726 |
+
|
| 727 |
+
[[package]]
|
| 728 |
+
name = "potential_utf"
|
| 729 |
+
version = "0.1.5"
|
| 730 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 731 |
+
checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
|
| 732 |
+
dependencies = [
|
| 733 |
+
"zerovec",
|
| 734 |
+
]
|
| 735 |
+
|
| 736 |
+
[[package]]
|
| 737 |
+
name = "ppv-lite86"
|
| 738 |
+
version = "0.2.21"
|
| 739 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 740 |
+
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
|
| 741 |
+
dependencies = [
|
| 742 |
+
"zerocopy",
|
| 743 |
+
]
|
| 744 |
+
|
| 745 |
+
[[package]]
|
| 746 |
+
name = "proc-macro2"
|
| 747 |
+
version = "1.0.106"
|
| 748 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 749 |
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
| 750 |
+
dependencies = [
|
| 751 |
+
"unicode-ident",
|
| 752 |
+
]
|
| 753 |
+
|
| 754 |
+
[[package]]
|
| 755 |
+
name = "pyo3"
|
| 756 |
+
version = "0.22.6"
|
| 757 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 758 |
+
checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884"
|
| 759 |
+
dependencies = [
|
| 760 |
+
"cfg-if",
|
| 761 |
+
"indoc",
|
| 762 |
+
"libc",
|
| 763 |
+
"memoffset",
|
| 764 |
+
"once_cell",
|
| 765 |
+
"portable-atomic",
|
| 766 |
+
"pyo3-build-config",
|
| 767 |
+
"pyo3-ffi",
|
| 768 |
+
"pyo3-macros",
|
| 769 |
+
"unindent",
|
| 770 |
+
]
|
| 771 |
+
|
| 772 |
+
[[package]]
|
| 773 |
+
name = "pyo3-build-config"
|
| 774 |
+
version = "0.22.6"
|
| 775 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 776 |
+
checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38"
|
| 777 |
+
dependencies = [
|
| 778 |
+
"once_cell",
|
| 779 |
+
"target-lexicon",
|
| 780 |
+
]
|
| 781 |
+
|
| 782 |
+
[[package]]
|
| 783 |
+
name = "pyo3-ffi"
|
| 784 |
+
version = "0.22.6"
|
| 785 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 786 |
+
checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636"
|
| 787 |
+
dependencies = [
|
| 788 |
+
"libc",
|
| 789 |
+
"pyo3-build-config",
|
| 790 |
+
]
|
| 791 |
+
|
| 792 |
+
[[package]]
|
| 793 |
+
name = "pyo3-macros"
|
| 794 |
+
version = "0.22.6"
|
| 795 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 796 |
+
checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453"
|
| 797 |
+
dependencies = [
|
| 798 |
+
"proc-macro2",
|
| 799 |
+
"pyo3-macros-backend",
|
| 800 |
+
"quote",
|
| 801 |
+
"syn",
|
| 802 |
+
]
|
| 803 |
+
|
| 804 |
+
[[package]]
|
| 805 |
+
name = "pyo3-macros-backend"
|
| 806 |
+
version = "0.22.6"
|
| 807 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 808 |
+
checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe"
|
| 809 |
+
dependencies = [
|
| 810 |
+
"heck",
|
| 811 |
+
"proc-macro2",
|
| 812 |
+
"pyo3-build-config",
|
| 813 |
+
"quote",
|
| 814 |
+
"syn",
|
| 815 |
+
]
|
| 816 |
+
|
| 817 |
+
[[package]]
|
| 818 |
+
name = "quinn"
|
| 819 |
+
version = "0.11.9"
|
| 820 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 821 |
+
checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
|
| 822 |
+
dependencies = [
|
| 823 |
+
"bytes",
|
| 824 |
+
"cfg_aliases",
|
| 825 |
+
"pin-project-lite",
|
| 826 |
+
"quinn-proto",
|
| 827 |
+
"quinn-udp",
|
| 828 |
+
"rustc-hash",
|
| 829 |
+
"rustls",
|
| 830 |
+
"socket2",
|
| 831 |
+
"thiserror 2.0.18",
|
| 832 |
+
"tokio",
|
| 833 |
+
"tracing",
|
| 834 |
+
"web-time",
|
| 835 |
+
]
|
| 836 |
+
|
| 837 |
+
[[package]]
|
| 838 |
+
name = "quinn-proto"
|
| 839 |
+
version = "0.11.14"
|
| 840 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 841 |
+
checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098"
|
| 842 |
+
dependencies = [
|
| 843 |
+
"bytes",
|
| 844 |
+
"getrandom 0.3.4",
|
| 845 |
+
"lru-slab",
|
| 846 |
+
"rand",
|
| 847 |
+
"ring",
|
| 848 |
+
"rustc-hash",
|
| 849 |
+
"rustls",
|
| 850 |
+
"rustls-pki-types",
|
| 851 |
+
"slab",
|
| 852 |
+
"thiserror 2.0.18",
|
| 853 |
+
"tinyvec",
|
| 854 |
+
"tracing",
|
| 855 |
+
"web-time",
|
| 856 |
+
]
|
| 857 |
+
|
| 858 |
+
[[package]]
|
| 859 |
+
name = "quinn-udp"
|
| 860 |
+
version = "0.5.14"
|
| 861 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 862 |
+
checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
|
| 863 |
+
dependencies = [
|
| 864 |
+
"cfg_aliases",
|
| 865 |
+
"libc",
|
| 866 |
+
"once_cell",
|
| 867 |
+
"socket2",
|
| 868 |
+
"tracing",
|
| 869 |
+
"windows-sys 0.60.2",
|
| 870 |
+
]
|
| 871 |
+
|
| 872 |
+
[[package]]
|
| 873 |
+
name = "quote"
|
| 874 |
+
version = "1.0.45"
|
| 875 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 876 |
+
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
| 877 |
+
dependencies = [
|
| 878 |
+
"proc-macro2",
|
| 879 |
+
]
|
| 880 |
+
|
| 881 |
+
[[package]]
|
| 882 |
+
name = "r-efi"
|
| 883 |
+
version = "5.3.0"
|
| 884 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 885 |
+
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
| 886 |
+
|
| 887 |
+
[[package]]
|
| 888 |
+
name = "rand"
|
| 889 |
+
version = "0.9.4"
|
| 890 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 891 |
+
checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
|
| 892 |
+
dependencies = [
|
| 893 |
+
"rand_chacha",
|
| 894 |
+
"rand_core",
|
| 895 |
+
]
|
| 896 |
+
|
| 897 |
+
[[package]]
|
| 898 |
+
name = "rand_chacha"
|
| 899 |
+
version = "0.9.0"
|
| 900 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 901 |
+
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
|
| 902 |
+
dependencies = [
|
| 903 |
+
"ppv-lite86",
|
| 904 |
+
"rand_core",
|
| 905 |
+
]
|
| 906 |
+
|
| 907 |
+
[[package]]
|
| 908 |
+
name = "rand_core"
|
| 909 |
+
version = "0.9.5"
|
| 910 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 911 |
+
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
|
| 912 |
+
dependencies = [
|
| 913 |
+
"getrandom 0.3.4",
|
| 914 |
+
]
|
| 915 |
+
|
| 916 |
+
[[package]]
|
| 917 |
+
name = "reqwest"
|
| 918 |
+
version = "0.12.28"
|
| 919 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 920 |
+
checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
|
| 921 |
+
dependencies = [
|
| 922 |
+
"base64",
|
| 923 |
+
"bytes",
|
| 924 |
+
"futures-core",
|
| 925 |
+
"http",
|
| 926 |
+
"http-body",
|
| 927 |
+
"http-body-util",
|
| 928 |
+
"hyper",
|
| 929 |
+
"hyper-rustls",
|
| 930 |
+
"hyper-util",
|
| 931 |
+
"js-sys",
|
| 932 |
+
"log",
|
| 933 |
+
"percent-encoding",
|
| 934 |
+
"pin-project-lite",
|
| 935 |
+
"quinn",
|
| 936 |
+
"rustls",
|
| 937 |
+
"rustls-pki-types",
|
| 938 |
+
"serde",
|
| 939 |
+
"serde_json",
|
| 940 |
+
"serde_urlencoded",
|
| 941 |
+
"sync_wrapper",
|
| 942 |
+
"tokio",
|
| 943 |
+
"tokio-rustls",
|
| 944 |
+
"tower",
|
| 945 |
+
"tower-http",
|
| 946 |
+
"tower-service",
|
| 947 |
+
"url",
|
| 948 |
+
"wasm-bindgen",
|
| 949 |
+
"wasm-bindgen-futures",
|
| 950 |
+
"web-sys",
|
| 951 |
+
"webpki-roots",
|
| 952 |
+
]
|
| 953 |
+
|
| 954 |
+
[[package]]
|
| 955 |
+
name = "ring"
|
| 956 |
+
version = "0.17.14"
|
| 957 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 958 |
+
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
|
| 959 |
+
dependencies = [
|
| 960 |
+
"cc",
|
| 961 |
+
"cfg-if",
|
| 962 |
+
"getrandom 0.2.17",
|
| 963 |
+
"libc",
|
| 964 |
+
"untrusted",
|
| 965 |
+
"windows-sys 0.52.0",
|
| 966 |
+
]
|
| 967 |
+
|
| 968 |
+
[[package]]
|
| 969 |
+
name = "rustc-hash"
|
| 970 |
+
version = "2.1.2"
|
| 971 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 972 |
+
checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
|
| 973 |
+
|
| 974 |
+
[[package]]
|
| 975 |
+
name = "rustls"
|
| 976 |
+
version = "0.23.39"
|
| 977 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 978 |
+
checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e"
|
| 979 |
+
dependencies = [
|
| 980 |
+
"once_cell",
|
| 981 |
+
"ring",
|
| 982 |
+
"rustls-pki-types",
|
| 983 |
+
"rustls-webpki",
|
| 984 |
+
"subtle",
|
| 985 |
+
"zeroize",
|
| 986 |
+
]
|
| 987 |
+
|
| 988 |
+
[[package]]
|
| 989 |
+
name = "rustls-pki-types"
|
| 990 |
+
version = "1.14.0"
|
| 991 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 992 |
+
checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
|
| 993 |
+
dependencies = [
|
| 994 |
+
"web-time",
|
| 995 |
+
"zeroize",
|
| 996 |
+
]
|
| 997 |
+
|
| 998 |
+
[[package]]
|
| 999 |
+
name = "rustls-webpki"
|
| 1000 |
+
version = "0.103.13"
|
| 1001 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1002 |
+
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
|
| 1003 |
+
dependencies = [
|
| 1004 |
+
"ring",
|
| 1005 |
+
"rustls-pki-types",
|
| 1006 |
+
"untrusted",
|
| 1007 |
+
]
|
| 1008 |
+
|
| 1009 |
+
[[package]]
|
| 1010 |
+
name = "rustversion"
|
| 1011 |
+
version = "1.0.22"
|
| 1012 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1013 |
+
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
| 1014 |
+
|
| 1015 |
+
[[package]]
|
| 1016 |
+
name = "ryu"
|
| 1017 |
+
version = "1.0.23"
|
| 1018 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1019 |
+
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
|
| 1020 |
+
|
| 1021 |
+
[[package]]
|
| 1022 |
+
name = "serde"
|
| 1023 |
+
version = "1.0.228"
|
| 1024 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1025 |
+
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
|
| 1026 |
+
dependencies = [
|
| 1027 |
+
"serde_core",
|
| 1028 |
+
"serde_derive",
|
| 1029 |
+
]
|
| 1030 |
+
|
| 1031 |
+
[[package]]
|
| 1032 |
+
name = "serde_core"
|
| 1033 |
+
version = "1.0.228"
|
| 1034 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1035 |
+
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
|
| 1036 |
+
dependencies = [
|
| 1037 |
+
"serde_derive",
|
| 1038 |
+
]
|
| 1039 |
+
|
| 1040 |
+
[[package]]
|
| 1041 |
+
name = "serde_derive"
|
| 1042 |
+
version = "1.0.228"
|
| 1043 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1044 |
+
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
| 1045 |
+
dependencies = [
|
| 1046 |
+
"proc-macro2",
|
| 1047 |
+
"quote",
|
| 1048 |
+
"syn",
|
| 1049 |
+
]
|
| 1050 |
+
|
| 1051 |
+
[[package]]
|
| 1052 |
+
name = "serde_json"
|
| 1053 |
+
version = "1.0.149"
|
| 1054 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1055 |
+
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
|
| 1056 |
+
dependencies = [
|
| 1057 |
+
"itoa",
|
| 1058 |
+
"memchr",
|
| 1059 |
+
"serde",
|
| 1060 |
+
"serde_core",
|
| 1061 |
+
"zmij",
|
| 1062 |
+
]
|
| 1063 |
+
|
| 1064 |
+
[[package]]
|
| 1065 |
+
name = "serde_path_to_error"
|
| 1066 |
+
version = "0.1.20"
|
| 1067 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1068 |
+
checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
|
| 1069 |
+
dependencies = [
|
| 1070 |
+
"itoa",
|
| 1071 |
+
"serde",
|
| 1072 |
+
"serde_core",
|
| 1073 |
+
]
|
| 1074 |
+
|
| 1075 |
+
[[package]]
|
| 1076 |
+
name = "serde_urlencoded"
|
| 1077 |
+
version = "0.7.1"
|
| 1078 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1079 |
+
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
|
| 1080 |
+
dependencies = [
|
| 1081 |
+
"form_urlencoded",
|
| 1082 |
+
"itoa",
|
| 1083 |
+
"ryu",
|
| 1084 |
+
"serde",
|
| 1085 |
+
]
|
| 1086 |
+
|
| 1087 |
+
[[package]]
|
| 1088 |
+
name = "shlex"
|
| 1089 |
+
version = "1.3.0"
|
| 1090 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1091 |
+
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
| 1092 |
+
|
| 1093 |
+
[[package]]
|
| 1094 |
+
name = "signal-hook-registry"
|
| 1095 |
+
version = "1.4.8"
|
| 1096 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1097 |
+
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
|
| 1098 |
+
dependencies = [
|
| 1099 |
+
"errno",
|
| 1100 |
+
"libc",
|
| 1101 |
+
]
|
| 1102 |
+
|
| 1103 |
+
[[package]]
|
| 1104 |
+
name = "slab"
|
| 1105 |
+
version = "0.4.12"
|
| 1106 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1107 |
+
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
| 1108 |
+
|
| 1109 |
+
[[package]]
|
| 1110 |
+
name = "smallvec"
|
| 1111 |
+
version = "1.15.1"
|
| 1112 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1113 |
+
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
| 1114 |
+
|
| 1115 |
+
[[package]]
|
| 1116 |
+
name = "socket2"
|
| 1117 |
+
version = "0.6.3"
|
| 1118 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1119 |
+
checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
|
| 1120 |
+
dependencies = [
|
| 1121 |
+
"libc",
|
| 1122 |
+
"windows-sys 0.61.2",
|
| 1123 |
+
]
|
| 1124 |
+
|
| 1125 |
+
[[package]]
|
| 1126 |
+
name = "stable_deref_trait"
|
| 1127 |
+
version = "1.2.1"
|
| 1128 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1129 |
+
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
| 1130 |
+
|
| 1131 |
+
[[package]]
|
| 1132 |
+
name = "strsim"
|
| 1133 |
+
version = "0.11.1"
|
| 1134 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1135 |
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
| 1136 |
+
|
| 1137 |
+
[[package]]
|
| 1138 |
+
name = "subtle"
|
| 1139 |
+
version = "2.6.1"
|
| 1140 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1141 |
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
| 1142 |
+
|
| 1143 |
+
[[package]]
|
| 1144 |
+
name = "syn"
|
| 1145 |
+
version = "2.0.117"
|
| 1146 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1147 |
+
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
| 1148 |
+
dependencies = [
|
| 1149 |
+
"proc-macro2",
|
| 1150 |
+
"quote",
|
| 1151 |
+
"unicode-ident",
|
| 1152 |
+
]
|
| 1153 |
+
|
| 1154 |
+
[[package]]
|
| 1155 |
+
name = "sync_wrapper"
|
| 1156 |
+
version = "1.0.2"
|
| 1157 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1158 |
+
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
|
| 1159 |
+
dependencies = [
|
| 1160 |
+
"futures-core",
|
| 1161 |
+
]
|
| 1162 |
+
|
| 1163 |
+
[[package]]
|
| 1164 |
+
name = "synstructure"
|
| 1165 |
+
version = "0.13.2"
|
| 1166 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1167 |
+
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
|
| 1168 |
+
dependencies = [
|
| 1169 |
+
"proc-macro2",
|
| 1170 |
+
"quote",
|
| 1171 |
+
"syn",
|
| 1172 |
+
]
|
| 1173 |
+
|
| 1174 |
+
[[package]]
|
| 1175 |
+
name = "target-lexicon"
|
| 1176 |
+
version = "0.12.16"
|
| 1177 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1178 |
+
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
| 1179 |
+
|
| 1180 |
+
[[package]]
|
| 1181 |
+
name = "thiserror"
|
| 1182 |
+
version = "1.0.69"
|
| 1183 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1184 |
+
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
| 1185 |
+
dependencies = [
|
| 1186 |
+
"thiserror-impl 1.0.69",
|
| 1187 |
+
]
|
| 1188 |
+
|
| 1189 |
+
[[package]]
|
| 1190 |
+
name = "thiserror"
|
| 1191 |
+
version = "2.0.18"
|
| 1192 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1193 |
+
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
|
| 1194 |
+
dependencies = [
|
| 1195 |
+
"thiserror-impl 2.0.18",
|
| 1196 |
+
]
|
| 1197 |
+
|
| 1198 |
+
[[package]]
|
| 1199 |
+
name = "thiserror-impl"
|
| 1200 |
+
version = "1.0.69"
|
| 1201 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1202 |
+
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
|
| 1203 |
+
dependencies = [
|
| 1204 |
+
"proc-macro2",
|
| 1205 |
+
"quote",
|
| 1206 |
+
"syn",
|
| 1207 |
+
]
|
| 1208 |
+
|
| 1209 |
+
[[package]]
|
| 1210 |
+
name = "thiserror-impl"
|
| 1211 |
+
version = "2.0.18"
|
| 1212 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1213 |
+
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
| 1214 |
+
dependencies = [
|
| 1215 |
+
"proc-macro2",
|
| 1216 |
+
"quote",
|
| 1217 |
+
"syn",
|
| 1218 |
+
]
|
| 1219 |
+
|
| 1220 |
+
[[package]]
|
| 1221 |
+
name = "tinystr"
|
| 1222 |
+
version = "0.8.3"
|
| 1223 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1224 |
+
checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
|
| 1225 |
+
dependencies = [
|
| 1226 |
+
"displaydoc",
|
| 1227 |
+
"zerovec",
|
| 1228 |
+
]
|
| 1229 |
+
|
| 1230 |
+
[[package]]
|
| 1231 |
+
name = "tinyvec"
|
| 1232 |
+
version = "1.11.0"
|
| 1233 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1234 |
+
checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3"
|
| 1235 |
+
dependencies = [
|
| 1236 |
+
"tinyvec_macros",
|
| 1237 |
+
]
|
| 1238 |
+
|
| 1239 |
+
[[package]]
|
| 1240 |
+
name = "tinyvec_macros"
|
| 1241 |
+
version = "0.1.1"
|
| 1242 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1243 |
+
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
| 1244 |
+
|
| 1245 |
+
[[package]]
|
| 1246 |
+
name = "tokio"
|
| 1247 |
+
version = "1.52.1"
|
| 1248 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1249 |
+
checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6"
|
| 1250 |
+
dependencies = [
|
| 1251 |
+
"bytes",
|
| 1252 |
+
"libc",
|
| 1253 |
+
"mio",
|
| 1254 |
+
"pin-project-lite",
|
| 1255 |
+
"signal-hook-registry",
|
| 1256 |
+
"socket2",
|
| 1257 |
+
"tokio-macros",
|
| 1258 |
+
"windows-sys 0.61.2",
|
| 1259 |
+
]
|
| 1260 |
+
|
| 1261 |
+
[[package]]
|
| 1262 |
+
name = "tokio-macros"
|
| 1263 |
+
version = "2.7.0"
|
| 1264 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1265 |
+
checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
|
| 1266 |
+
dependencies = [
|
| 1267 |
+
"proc-macro2",
|
| 1268 |
+
"quote",
|
| 1269 |
+
"syn",
|
| 1270 |
+
]
|
| 1271 |
+
|
| 1272 |
+
[[package]]
|
| 1273 |
+
name = "tokio-rustls"
|
| 1274 |
+
version = "0.26.4"
|
| 1275 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1276 |
+
checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
|
| 1277 |
+
dependencies = [
|
| 1278 |
+
"rustls",
|
| 1279 |
+
"tokio",
|
| 1280 |
+
]
|
| 1281 |
+
|
| 1282 |
+
[[package]]
|
| 1283 |
+
name = "tower"
|
| 1284 |
+
version = "0.5.3"
|
| 1285 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1286 |
+
checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
|
| 1287 |
+
dependencies = [
|
| 1288 |
+
"futures-core",
|
| 1289 |
+
"futures-util",
|
| 1290 |
+
"pin-project-lite",
|
| 1291 |
+
"sync_wrapper",
|
| 1292 |
+
"tokio",
|
| 1293 |
+
"tower-layer",
|
| 1294 |
+
"tower-service",
|
| 1295 |
+
"tracing",
|
| 1296 |
+
]
|
| 1297 |
+
|
| 1298 |
+
[[package]]
|
| 1299 |
+
name = "tower-http"
|
| 1300 |
+
version = "0.6.8"
|
| 1301 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1302 |
+
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
|
| 1303 |
+
dependencies = [
|
| 1304 |
+
"bitflags",
|
| 1305 |
+
"bytes",
|
| 1306 |
+
"futures-util",
|
| 1307 |
+
"http",
|
| 1308 |
+
"http-body",
|
| 1309 |
+
"iri-string",
|
| 1310 |
+
"pin-project-lite",
|
| 1311 |
+
"tower",
|
| 1312 |
+
"tower-layer",
|
| 1313 |
+
"tower-service",
|
| 1314 |
+
]
|
| 1315 |
+
|
| 1316 |
+
[[package]]
|
| 1317 |
+
name = "tower-layer"
|
| 1318 |
+
version = "0.3.3"
|
| 1319 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1320 |
+
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
|
| 1321 |
+
|
| 1322 |
+
[[package]]
|
| 1323 |
+
name = "tower-service"
|
| 1324 |
+
version = "0.3.3"
|
| 1325 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1326 |
+
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
|
| 1327 |
+
|
| 1328 |
+
[[package]]
|
| 1329 |
+
name = "tracing"
|
| 1330 |
+
version = "0.1.44"
|
| 1331 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1332 |
+
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
|
| 1333 |
+
dependencies = [
|
| 1334 |
+
"log",
|
| 1335 |
+
"pin-project-lite",
|
| 1336 |
+
"tracing-attributes",
|
| 1337 |
+
"tracing-core",
|
| 1338 |
+
]
|
| 1339 |
+
|
| 1340 |
+
[[package]]
|
| 1341 |
+
name = "tracing-attributes"
|
| 1342 |
+
version = "0.1.31"
|
| 1343 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1344 |
+
checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
|
| 1345 |
+
dependencies = [
|
| 1346 |
+
"proc-macro2",
|
| 1347 |
+
"quote",
|
| 1348 |
+
"syn",
|
| 1349 |
+
]
|
| 1350 |
+
|
| 1351 |
+
[[package]]
|
| 1352 |
+
name = "tracing-core"
|
| 1353 |
+
version = "0.1.36"
|
| 1354 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1355 |
+
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
|
| 1356 |
+
dependencies = [
|
| 1357 |
+
"once_cell",
|
| 1358 |
+
]
|
| 1359 |
+
|
| 1360 |
+
[[package]]
|
| 1361 |
+
name = "try-lock"
|
| 1362 |
+
version = "0.2.5"
|
| 1363 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1364 |
+
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
| 1365 |
+
|
| 1366 |
+
[[package]]
|
| 1367 |
+
name = "unicode-ident"
|
| 1368 |
+
version = "1.0.24"
|
| 1369 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1370 |
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
| 1371 |
+
|
| 1372 |
+
[[package]]
|
| 1373 |
+
name = "unindent"
|
| 1374 |
+
version = "0.2.4"
|
| 1375 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1376 |
+
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
| 1377 |
+
|
| 1378 |
+
[[package]]
|
| 1379 |
+
name = "untrusted"
|
| 1380 |
+
version = "0.9.0"
|
| 1381 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1382 |
+
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
| 1383 |
+
|
| 1384 |
+
[[package]]
|
| 1385 |
+
name = "url"
|
| 1386 |
+
version = "2.5.8"
|
| 1387 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1388 |
+
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
|
| 1389 |
+
dependencies = [
|
| 1390 |
+
"form_urlencoded",
|
| 1391 |
+
"idna",
|
| 1392 |
+
"percent-encoding",
|
| 1393 |
+
"serde",
|
| 1394 |
+
]
|
| 1395 |
+
|
| 1396 |
+
[[package]]
|
| 1397 |
+
name = "utf8_iter"
|
| 1398 |
+
version = "1.0.4"
|
| 1399 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1400 |
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
| 1401 |
+
|
| 1402 |
+
[[package]]
|
| 1403 |
+
name = "utf8parse"
|
| 1404 |
+
version = "0.2.2"
|
| 1405 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1406 |
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
| 1407 |
+
|
| 1408 |
+
[[package]]
|
| 1409 |
+
name = "want"
|
| 1410 |
+
version = "0.3.1"
|
| 1411 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1412 |
+
checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
|
| 1413 |
+
dependencies = [
|
| 1414 |
+
"try-lock",
|
| 1415 |
+
]
|
| 1416 |
+
|
| 1417 |
+
[[package]]
|
| 1418 |
+
name = "wasi"
|
| 1419 |
+
version = "0.11.1+wasi-snapshot-preview1"
|
| 1420 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1421 |
+
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
| 1422 |
+
|
| 1423 |
+
[[package]]
|
| 1424 |
+
name = "wasip2"
|
| 1425 |
+
version = "1.0.3+wasi-0.2.9"
|
| 1426 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1427 |
+
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
| 1428 |
+
dependencies = [
|
| 1429 |
+
"wit-bindgen",
|
| 1430 |
+
]
|
| 1431 |
+
|
| 1432 |
+
[[package]]
|
| 1433 |
+
name = "wasm-bindgen"
|
| 1434 |
+
version = "0.2.118"
|
| 1435 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1436 |
+
checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
|
| 1437 |
+
dependencies = [
|
| 1438 |
+
"cfg-if",
|
| 1439 |
+
"once_cell",
|
| 1440 |
+
"rustversion",
|
| 1441 |
+
"wasm-bindgen-macro",
|
| 1442 |
+
"wasm-bindgen-shared",
|
| 1443 |
+
]
|
| 1444 |
+
|
| 1445 |
+
[[package]]
|
| 1446 |
+
name = "wasm-bindgen-futures"
|
| 1447 |
+
version = "0.4.68"
|
| 1448 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1449 |
+
checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8"
|
| 1450 |
+
dependencies = [
|
| 1451 |
+
"js-sys",
|
| 1452 |
+
"wasm-bindgen",
|
| 1453 |
+
]
|
| 1454 |
+
|
| 1455 |
+
[[package]]
|
| 1456 |
+
name = "wasm-bindgen-macro"
|
| 1457 |
+
version = "0.2.118"
|
| 1458 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1459 |
+
checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
|
| 1460 |
+
dependencies = [
|
| 1461 |
+
"quote",
|
| 1462 |
+
"wasm-bindgen-macro-support",
|
| 1463 |
+
]
|
| 1464 |
+
|
| 1465 |
+
[[package]]
|
| 1466 |
+
name = "wasm-bindgen-macro-support"
|
| 1467 |
+
version = "0.2.118"
|
| 1468 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1469 |
+
checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
|
| 1470 |
+
dependencies = [
|
| 1471 |
+
"bumpalo",
|
| 1472 |
+
"proc-macro2",
|
| 1473 |
+
"quote",
|
| 1474 |
+
"syn",
|
| 1475 |
+
"wasm-bindgen-shared",
|
| 1476 |
+
]
|
| 1477 |
+
|
| 1478 |
+
[[package]]
|
| 1479 |
+
name = "wasm-bindgen-shared"
|
| 1480 |
+
version = "0.2.118"
|
| 1481 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1482 |
+
checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
|
| 1483 |
+
dependencies = [
|
| 1484 |
+
"unicode-ident",
|
| 1485 |
+
]
|
| 1486 |
+
|
| 1487 |
+
[[package]]
|
| 1488 |
+
name = "web-sys"
|
| 1489 |
+
version = "0.3.95"
|
| 1490 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1491 |
+
checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d"
|
| 1492 |
+
dependencies = [
|
| 1493 |
+
"js-sys",
|
| 1494 |
+
"wasm-bindgen",
|
| 1495 |
+
]
|
| 1496 |
+
|
| 1497 |
+
[[package]]
|
| 1498 |
+
name = "web-time"
|
| 1499 |
+
version = "1.1.0"
|
| 1500 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1501 |
+
checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
|
| 1502 |
+
dependencies = [
|
| 1503 |
+
"js-sys",
|
| 1504 |
+
"wasm-bindgen",
|
| 1505 |
+
]
|
| 1506 |
+
|
| 1507 |
+
[[package]]
|
| 1508 |
+
name = "webpki-roots"
|
| 1509 |
+
version = "1.0.7"
|
| 1510 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1511 |
+
checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d"
|
| 1512 |
+
dependencies = [
|
| 1513 |
+
"rustls-pki-types",
|
| 1514 |
+
]
|
| 1515 |
+
|
| 1516 |
+
[[package]]
|
| 1517 |
+
name = "windows-link"
|
| 1518 |
+
version = "0.2.1"
|
| 1519 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1520 |
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
|
| 1521 |
+
|
| 1522 |
+
[[package]]
|
| 1523 |
+
name = "windows-sys"
|
| 1524 |
+
version = "0.52.0"
|
| 1525 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1526 |
+
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
| 1527 |
+
dependencies = [
|
| 1528 |
+
"windows-targets 0.52.6",
|
| 1529 |
+
]
|
| 1530 |
+
|
| 1531 |
+
[[package]]
|
| 1532 |
+
name = "windows-sys"
|
| 1533 |
+
version = "0.60.2"
|
| 1534 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1535 |
+
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
|
| 1536 |
+
dependencies = [
|
| 1537 |
+
"windows-targets 0.53.5",
|
| 1538 |
+
]
|
| 1539 |
+
|
| 1540 |
+
[[package]]
|
| 1541 |
+
name = "windows-sys"
|
| 1542 |
+
version = "0.61.2"
|
| 1543 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1544 |
+
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
|
| 1545 |
+
dependencies = [
|
| 1546 |
+
"windows-link",
|
| 1547 |
+
]
|
| 1548 |
+
|
| 1549 |
+
[[package]]
|
| 1550 |
+
name = "windows-targets"
|
| 1551 |
+
version = "0.52.6"
|
| 1552 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1553 |
+
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
| 1554 |
+
dependencies = [
|
| 1555 |
+
"windows_aarch64_gnullvm 0.52.6",
|
| 1556 |
+
"windows_aarch64_msvc 0.52.6",
|
| 1557 |
+
"windows_i686_gnu 0.52.6",
|
| 1558 |
+
"windows_i686_gnullvm 0.52.6",
|
| 1559 |
+
"windows_i686_msvc 0.52.6",
|
| 1560 |
+
"windows_x86_64_gnu 0.52.6",
|
| 1561 |
+
"windows_x86_64_gnullvm 0.52.6",
|
| 1562 |
+
"windows_x86_64_msvc 0.52.6",
|
| 1563 |
+
]
|
| 1564 |
+
|
| 1565 |
+
[[package]]
|
| 1566 |
+
name = "windows-targets"
|
| 1567 |
+
version = "0.53.5"
|
| 1568 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1569 |
+
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
|
| 1570 |
+
dependencies = [
|
| 1571 |
+
"windows-link",
|
| 1572 |
+
"windows_aarch64_gnullvm 0.53.1",
|
| 1573 |
+
"windows_aarch64_msvc 0.53.1",
|
| 1574 |
+
"windows_i686_gnu 0.53.1",
|
| 1575 |
+
"windows_i686_gnullvm 0.53.1",
|
| 1576 |
+
"windows_i686_msvc 0.53.1",
|
| 1577 |
+
"windows_x86_64_gnu 0.53.1",
|
| 1578 |
+
"windows_x86_64_gnullvm 0.53.1",
|
| 1579 |
+
"windows_x86_64_msvc 0.53.1",
|
| 1580 |
+
]
|
| 1581 |
+
|
| 1582 |
+
[[package]]
|
| 1583 |
+
name = "windows_aarch64_gnullvm"
|
| 1584 |
+
version = "0.52.6"
|
| 1585 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1586 |
+
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
| 1587 |
+
|
| 1588 |
+
[[package]]
|
| 1589 |
+
name = "windows_aarch64_gnullvm"
|
| 1590 |
+
version = "0.53.1"
|
| 1591 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1592 |
+
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
|
| 1593 |
+
|
| 1594 |
+
[[package]]
|
| 1595 |
+
name = "windows_aarch64_msvc"
|
| 1596 |
+
version = "0.52.6"
|
| 1597 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1598 |
+
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
| 1599 |
+
|
| 1600 |
+
[[package]]
|
| 1601 |
+
name = "windows_aarch64_msvc"
|
| 1602 |
+
version = "0.53.1"
|
| 1603 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1604 |
+
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
|
| 1605 |
+
|
| 1606 |
+
[[package]]
|
| 1607 |
+
name = "windows_i686_gnu"
|
| 1608 |
+
version = "0.52.6"
|
| 1609 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1610 |
+
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
| 1611 |
+
|
| 1612 |
+
[[package]]
|
| 1613 |
+
name = "windows_i686_gnu"
|
| 1614 |
+
version = "0.53.1"
|
| 1615 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1616 |
+
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
|
| 1617 |
+
|
| 1618 |
+
[[package]]
|
| 1619 |
+
name = "windows_i686_gnullvm"
|
| 1620 |
+
version = "0.52.6"
|
| 1621 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1622 |
+
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
| 1623 |
+
|
| 1624 |
+
[[package]]
|
| 1625 |
+
name = "windows_i686_gnullvm"
|
| 1626 |
+
version = "0.53.1"
|
| 1627 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1628 |
+
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
|
| 1629 |
+
|
| 1630 |
+
[[package]]
|
| 1631 |
+
name = "windows_i686_msvc"
|
| 1632 |
+
version = "0.52.6"
|
| 1633 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1634 |
+
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
| 1635 |
+
|
| 1636 |
+
[[package]]
|
| 1637 |
+
name = "windows_i686_msvc"
|
| 1638 |
+
version = "0.53.1"
|
| 1639 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1640 |
+
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
|
| 1641 |
+
|
| 1642 |
+
[[package]]
|
| 1643 |
+
name = "windows_x86_64_gnu"
|
| 1644 |
+
version = "0.52.6"
|
| 1645 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1646 |
+
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
| 1647 |
+
|
| 1648 |
+
[[package]]
|
| 1649 |
+
name = "windows_x86_64_gnu"
|
| 1650 |
+
version = "0.53.1"
|
| 1651 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1652 |
+
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
|
| 1653 |
+
|
| 1654 |
+
[[package]]
|
| 1655 |
+
name = "windows_x86_64_gnullvm"
|
| 1656 |
+
version = "0.52.6"
|
| 1657 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1658 |
+
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
| 1659 |
+
|
| 1660 |
+
[[package]]
|
| 1661 |
+
name = "windows_x86_64_gnullvm"
|
| 1662 |
+
version = "0.53.1"
|
| 1663 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1664 |
+
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
|
| 1665 |
+
|
| 1666 |
+
[[package]]
|
| 1667 |
+
name = "windows_x86_64_msvc"
|
| 1668 |
+
version = "0.52.6"
|
| 1669 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1670 |
+
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
| 1671 |
+
|
| 1672 |
+
[[package]]
|
| 1673 |
+
name = "windows_x86_64_msvc"
|
| 1674 |
+
version = "0.53.1"
|
| 1675 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1676 |
+
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
| 1677 |
+
|
| 1678 |
+
[[package]]
|
| 1679 |
+
name = "wit-bindgen"
|
| 1680 |
+
version = "0.57.1"
|
| 1681 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1682 |
+
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
| 1683 |
+
|
| 1684 |
+
[[package]]
|
| 1685 |
+
name = "writeable"
|
| 1686 |
+
version = "0.6.3"
|
| 1687 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1688 |
+
checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
| 1689 |
+
|
| 1690 |
+
[[package]]
|
| 1691 |
+
name = "yoke"
|
| 1692 |
+
version = "0.8.2"
|
| 1693 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1694 |
+
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
| 1695 |
+
dependencies = [
|
| 1696 |
+
"stable_deref_trait",
|
| 1697 |
+
"yoke-derive",
|
| 1698 |
+
"zerofrom",
|
| 1699 |
+
]
|
| 1700 |
+
|
| 1701 |
+
[[package]]
|
| 1702 |
+
name = "yoke-derive"
|
| 1703 |
+
version = "0.8.2"
|
| 1704 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1705 |
+
checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
|
| 1706 |
+
dependencies = [
|
| 1707 |
+
"proc-macro2",
|
| 1708 |
+
"quote",
|
| 1709 |
+
"syn",
|
| 1710 |
+
"synstructure",
|
| 1711 |
+
]
|
| 1712 |
+
|
| 1713 |
+
[[package]]
|
| 1714 |
+
name = "zerocopy"
|
| 1715 |
+
version = "0.8.48"
|
| 1716 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1717 |
+
checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
|
| 1718 |
+
dependencies = [
|
| 1719 |
+
"zerocopy-derive",
|
| 1720 |
+
]
|
| 1721 |
+
|
| 1722 |
+
[[package]]
|
| 1723 |
+
name = "zerocopy-derive"
|
| 1724 |
+
version = "0.8.48"
|
| 1725 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1726 |
+
checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
|
| 1727 |
+
dependencies = [
|
| 1728 |
+
"proc-macro2",
|
| 1729 |
+
"quote",
|
| 1730 |
+
"syn",
|
| 1731 |
+
]
|
| 1732 |
+
|
| 1733 |
+
[[package]]
|
| 1734 |
+
name = "zerofrom"
|
| 1735 |
+
version = "0.1.7"
|
| 1736 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1737 |
+
checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
|
| 1738 |
+
dependencies = [
|
| 1739 |
+
"zerofrom-derive",
|
| 1740 |
+
]
|
| 1741 |
+
|
| 1742 |
+
[[package]]
|
| 1743 |
+
name = "zerofrom-derive"
|
| 1744 |
+
version = "0.1.7"
|
| 1745 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1746 |
+
checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
|
| 1747 |
+
dependencies = [
|
| 1748 |
+
"proc-macro2",
|
| 1749 |
+
"quote",
|
| 1750 |
+
"syn",
|
| 1751 |
+
"synstructure",
|
| 1752 |
+
]
|
| 1753 |
+
|
| 1754 |
+
[[package]]
|
| 1755 |
+
name = "zeroize"
|
| 1756 |
+
version = "1.8.2"
|
| 1757 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1758 |
+
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
|
| 1759 |
+
|
| 1760 |
+
[[package]]
|
| 1761 |
+
name = "zerotrie"
|
| 1762 |
+
version = "0.2.4"
|
| 1763 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1764 |
+
checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
|
| 1765 |
+
dependencies = [
|
| 1766 |
+
"displaydoc",
|
| 1767 |
+
"yoke",
|
| 1768 |
+
"zerofrom",
|
| 1769 |
+
]
|
| 1770 |
+
|
| 1771 |
+
[[package]]
|
| 1772 |
+
name = "zerovec"
|
| 1773 |
+
version = "0.11.6"
|
| 1774 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1775 |
+
checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
|
| 1776 |
+
dependencies = [
|
| 1777 |
+
"yoke",
|
| 1778 |
+
"zerofrom",
|
| 1779 |
+
"zerovec-derive",
|
| 1780 |
+
]
|
| 1781 |
+
|
| 1782 |
+
[[package]]
|
| 1783 |
+
name = "zerovec-derive"
|
| 1784 |
+
version = "0.11.3"
|
| 1785 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1786 |
+
checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
|
| 1787 |
+
dependencies = [
|
| 1788 |
+
"proc-macro2",
|
| 1789 |
+
"quote",
|
| 1790 |
+
"syn",
|
| 1791 |
+
]
|
| 1792 |
+
|
| 1793 |
+
[[package]]
|
| 1794 |
+
name = "zmij"
|
| 1795 |
+
version = "1.0.21"
|
| 1796 |
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
| 1797 |
+
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[workspace]
|
| 2 |
+
resolver = "2"
|
| 3 |
+
members = [
|
| 4 |
+
"crates/headroom-core",
|
| 5 |
+
"crates/headroom-proxy",
|
| 6 |
+
"crates/headroom-py",
|
| 7 |
+
"crates/headroom-parity",
|
| 8 |
+
]
|
| 9 |
+
# headroom-py is a Python extension module — it must be built via maturin, not
|
| 10 |
+
# plain cargo (the "extension-module" feature tells pyo3 not to link libpython,
|
| 11 |
+
# which is required for `import` to work). `cargo build --workspace` without
|
| 12 |
+
# explicit members skips it; `cargo test --workspace` still runs its tests
|
| 13 |
+
# because pyo3 can dynamically link here for the cdylib used by tests.
|
| 14 |
+
default-members = [
|
| 15 |
+
"crates/headroom-core",
|
| 16 |
+
"crates/headroom-proxy",
|
| 17 |
+
"crates/headroom-parity",
|
| 18 |
+
]
|
| 19 |
+
|
| 20 |
+
[workspace.package]
|
| 21 |
+
edition = "2021"
|
| 22 |
+
rust-version = "1.78"
|
| 23 |
+
license = "Apache-2.0"
|
| 24 |
+
repository = "https://github.com/chopratejas/headroom"
|
| 25 |
+
authors = ["Headroom Maintainers"]
|
| 26 |
+
|
| 27 |
+
[workspace.dependencies]
|
| 28 |
+
serde = { version = "1", features = ["derive"] }
|
| 29 |
+
serde_json = "1"
|
| 30 |
+
bytes = "1"
|
| 31 |
+
thiserror = "1"
|
| 32 |
+
tracing = "0.1"
|
| 33 |
+
anyhow = "1"
|
| 34 |
+
clap = { version = "4", features = ["derive"] }
|
| 35 |
+
tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal"] }
|
| 36 |
+
axum = "0.7"
|
| 37 |
+
tower = "0.5"
|
| 38 |
+
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] }
|
| 39 |
+
pyo3 = "0.22"
|
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Headroom Rust build targets. `just` is not installed on dev boxes; this
|
| 2 |
+
# Makefile is the source of truth and is mirrored by .github/workflows/rust.yml.
|
| 3 |
+
|
| 4 |
+
SHELL := /bin/bash
|
| 5 |
+
CARGO ?= cargo
|
| 6 |
+
MATURIN ?= maturin
|
| 7 |
+
PYTHON ?= python3
|
| 8 |
+
FIXTURES ?= tests/parity/fixtures
|
| 9 |
+
|
| 10 |
+
.PHONY: help test test-parity bench build-proxy build-wheel fmt fmt-check lint clippy clean
|
| 11 |
+
|
| 12 |
+
help:
|
| 13 |
+
@echo "Headroom Rust targets:"
|
| 14 |
+
@echo " make test - cargo test --workspace"
|
| 15 |
+
@echo " make test-parity - maturin develop + parity-run against fixtures"
|
| 16 |
+
@echo " make bench - cargo bench --workspace"
|
| 17 |
+
@echo " make build-proxy - release build + strip headroom-proxy, print size"
|
| 18 |
+
@echo " make build-wheel - release wheel for headroom-py"
|
| 19 |
+
@echo " make fmt - cargo fmt --all"
|
| 20 |
+
@echo " make fmt-check - cargo fmt --all -- --check"
|
| 21 |
+
@echo " make lint - cargo clippy --workspace -- -D warnings"
|
| 22 |
+
@echo " make clean - cargo clean"
|
| 23 |
+
|
| 24 |
+
test:
|
| 25 |
+
$(CARGO) test --workspace
|
| 26 |
+
|
| 27 |
+
test-parity:
|
| 28 |
+
@if [ -z "$$VIRTUAL_ENV" ]; then \
|
| 29 |
+
echo "error: activate a venv first (e.g. source .venv/bin/activate)"; \
|
| 30 |
+
exit 1; \
|
| 31 |
+
fi
|
| 32 |
+
$(MATURIN) develop -m crates/headroom-py/pyproject.toml
|
| 33 |
+
$(CARGO) run -p headroom-parity -- run --fixtures $(FIXTURES)
|
| 34 |
+
|
| 35 |
+
bench:
|
| 36 |
+
$(CARGO) bench --workspace
|
| 37 |
+
|
| 38 |
+
build-proxy:
|
| 39 |
+
$(CARGO) build --release -p headroom-proxy
|
| 40 |
+
@BIN=target/release/headroom-proxy; \
|
| 41 |
+
if command -v strip >/dev/null 2>&1; then strip "$$BIN" || true; fi; \
|
| 42 |
+
SIZE=$$(wc -c < "$$BIN"); \
|
| 43 |
+
printf 'headroom-proxy: %s bytes (%.1f MiB)\n' "$$SIZE" "$$(echo "$$SIZE / 1048576" | bc -l)"
|
| 44 |
+
|
| 45 |
+
build-wheel:
|
| 46 |
+
$(MATURIN) build --release -m crates/headroom-py/pyproject.toml
|
| 47 |
+
|
| 48 |
+
fmt:
|
| 49 |
+
$(CARGO) fmt --all
|
| 50 |
+
|
| 51 |
+
fmt-check:
|
| 52 |
+
$(CARGO) fmt --all -- --check
|
| 53 |
+
|
| 54 |
+
clippy lint:
|
| 55 |
+
$(CARGO) clippy --workspace -- -D warnings
|
| 56 |
+
|
| 57 |
+
clean:
|
| 58 |
+
$(CARGO) clean
|
|
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Headroom Rust Rewrite — Developer Guide
|
| 2 |
+
|
| 3 |
+
This document covers the Rust port of Headroom. It is the only new top-level
|
| 4 |
+
doc created in Phase 0; longer-form design/plan writeups live elsewhere and
|
| 5 |
+
are not versioned in this repo.
|
| 6 |
+
|
| 7 |
+
## Workspace layout
|
| 8 |
+
|
| 9 |
+
```
|
| 10 |
+
Cargo.toml # workspace root
|
| 11 |
+
rust-toolchain.toml # pins stable rustc with rustfmt+clippy
|
| 12 |
+
crates/
|
| 13 |
+
headroom-core/ # library: shared types + transform trait surface
|
| 14 |
+
headroom-proxy/ # binary: axum /healthz (Phase 2 grows this)
|
| 15 |
+
headroom-py/ # PyO3 cdylib exposing `headroom._core`
|
| 16 |
+
headroom-parity/ # lib + `parity-run` CLI for Python parity tests
|
| 17 |
+
tests/parity/
|
| 18 |
+
fixtures/<transform>/*.json # recorded Python outputs (Phase 1 ports match)
|
| 19 |
+
recorder.py # Python-side fixture recorder
|
| 20 |
+
scripts/record_fixtures.py # entry point for running the recorder
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
`cargo build --workspace` builds every crate. `default-members` drops
|
| 24 |
+
`headroom-py` from `cargo run`/bare-`cargo test` flows so that `cargo test
|
| 25 |
+
--workspace` does not try to execute the PyO3 cdylib standalone (it can't
|
| 26 |
+
find `libpython` without a Python interpreter hosting it).
|
| 27 |
+
|
| 28 |
+
## Common commands
|
| 29 |
+
|
| 30 |
+
`just` is not installed on dev boxes here; a `Makefile` at the repo root
|
| 31 |
+
exposes the same targets:
|
| 32 |
+
|
| 33 |
+
| Target | What it does |
|
| 34 |
+
| --- | --- |
|
| 35 |
+
| `make test` | `cargo test --workspace` |
|
| 36 |
+
| `make test-parity` | Builds `headroom-py` via maturin, runs `parity-run run` |
|
| 37 |
+
| `make bench` | `cargo bench --workspace` |
|
| 38 |
+
| `make build-proxy` | Release-builds `headroom-proxy`, strips, prints size |
|
| 39 |
+
| `make build-wheel` | `maturin build --release -m crates/headroom-py/pyproject.toml` |
|
| 40 |
+
| `make fmt` | `cargo fmt --all` |
|
| 41 |
+
| `make lint` | `cargo fmt --check` + `cargo clippy --workspace -- -D warnings` |
|
| 42 |
+
|
| 43 |
+
## Running the proxy
|
| 44 |
+
|
| 45 |
+
```bash
|
| 46 |
+
cargo run -p headroom-proxy
|
| 47 |
+
# or
|
| 48 |
+
make build-proxy
|
| 49 |
+
./target/release/headroom-proxy
|
| 50 |
+
# then
|
| 51 |
+
curl -s http://127.0.0.1:8787/healthz
|
| 52 |
+
# => {"ok":true}
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
## Maturin + Python wiring
|
| 56 |
+
|
| 57 |
+
`headroom-py` is a PyO3 cdylib that exposes `headroom._core` in Python. The
|
| 58 |
+
`extension-module` feature is opt-in so plain `cargo build --workspace` does
|
| 59 |
+
not try to link against `libpython` on systems that don't have it.
|
| 60 |
+
|
| 61 |
+
### First-time setup (clean venv recommended)
|
| 62 |
+
|
| 63 |
+
```bash
|
| 64 |
+
python3.11 -m venv /tmp/hr-rust-venv
|
| 65 |
+
source /tmp/hr-rust-venv/bin/activate
|
| 66 |
+
pip install maturin
|
| 67 |
+
cd crates/headroom-py
|
| 68 |
+
maturin develop # editable dev build, installs headroom._core
|
| 69 |
+
cd /tmp # IMPORTANT: step out of the repo root first
|
| 70 |
+
python -c "from headroom._core import hello; print(hello())"
|
| 71 |
+
# => headroom-core
|
| 72 |
+
```
|
| 73 |
+
|
| 74 |
+
> Why `cd /tmp`? The repo root also contains the Python `headroom/` package.
|
| 75 |
+
> Running the smoke import from the repo root makes Python resolve `headroom`
|
| 76 |
+
> to `./headroom/__init__.py` (the full SDK, which pulls in heavy deps) instead
|
| 77 |
+
> of the lightweight namespace package installed by maturin. Tests should
|
| 78 |
+
> either run outside the repo root, or ensure `headroom` is installed into
|
| 79 |
+
> the same venv (then the maturin-installed `_core.so` lands alongside it and
|
| 80 |
+
> both imports resolve).
|
| 81 |
+
|
| 82 |
+
### Release wheels
|
| 83 |
+
|
| 84 |
+
```bash
|
| 85 |
+
make build-wheel
|
| 86 |
+
# wheels land under target/wheels/
|
| 87 |
+
```
|
| 88 |
+
|
| 89 |
+
CI (`.github/workflows/rust.yml`) builds linux-x86_64, macos-arm64, and
|
| 90 |
+
macos-x86_64 wheels via `PyO3/maturin-action` and uploads them as artifacts.
|
| 91 |
+
|
| 92 |
+
## Parity harness
|
| 93 |
+
|
| 94 |
+
`crates/headroom-parity` owns the Rust-vs-Python oracle:
|
| 95 |
+
|
| 96 |
+
- JSON fixtures under `tests/parity/fixtures/<transform>/` (schema:
|
| 97 |
+
`{ transform, input, config, output, recorded_at, input_sha256 }`).
|
| 98 |
+
- `TransformComparator` trait — one impl per transform. Phase 0 stubs return
|
| 99 |
+
`Err(...)`; the harness flags those as `Skipped`, not panics.
|
| 100 |
+
- `parity-run` CLI: `cargo run -p headroom-parity -- run [--only TRANSFORM]`.
|
| 101 |
+
- Unit tests in `crates/headroom-parity/src/lib.rs` include a **negative
|
| 102 |
+
test** (`harness_reports_diff_for_divergent_comparator`) proving the
|
| 103 |
+
harness detects mismatched output before any real port lands.
|
| 104 |
+
|
| 105 |
+
### Recording fresh fixtures
|
| 106 |
+
|
| 107 |
+
```bash
|
| 108 |
+
source .venv/bin/activate # the main Python SDK venv
|
| 109 |
+
python scripts/record_fixtures.py # uses tests/parity/recorder.py
|
| 110 |
+
ls tests/parity/fixtures/*/ | sort | uniq -c
|
| 111 |
+
```
|
| 112 |
+
|
| 113 |
+
The recorder monkey-patches the in-process transform classes (see
|
| 114 |
+
`record_all()` in `tests/parity/recorder.py`). It does **not** modify any
|
| 115 |
+
file under `headroom/`.
|
| 116 |
+
|
| 117 |
+
## Phase 0 Blockers
|
| 118 |
+
|
| 119 |
+
These are known limitations for Phase 0. They are tracked here so Phase 1
|
| 120 |
+
doesn't rediscover them.
|
| 121 |
+
|
| 122 |
+
- **`cache_aligner` fixtures**: `CacheAligner.apply()` takes
|
| 123 |
+
`(messages, tokenizer, **kwargs)` — a `Tokenizer` is provider-specific and
|
| 124 |
+
its cheapest `NoopTokenCounter` / `TiktokenTokenCounter` construction still
|
| 125 |
+
requires pulling `headroom.providers.*` which imports the full observability
|
| 126 |
+
stack (opentelemetry, etc). The recorder records `cache_aligner` only if a
|
| 127 |
+
usable tokenizer is cheaply available; otherwise it logs a blocker and
|
| 128 |
+
skips. See `recorder.py::_build_cache_aligner_tokenizer`.
|
| 129 |
+
- **`ccr` is not a single class**: The repo has `CCRToolInjector`,
|
| 130 |
+
`CCRResponseHandler`, `CCRToolCall`, `CCRToolResult` etc. rather than a
|
| 131 |
+
single `CCR` class. The recorder targets the encoder-style entry point
|
| 132 |
+
most analogous to the Rust port (`CCRToolInjector.inject_tool` and
|
| 133 |
+
`CCRResponseHandler.parse_response`). If Phase 1 wants a different split
|
| 134 |
+
it should update `recorder.py::record_all` accordingly.
|
| 135 |
+
- **Pre-commit hook noise**: `scripts/sync-plugin-versions.py` mutates
|
| 136 |
+
`.claude-plugin/marketplace.json`, `.github/plugin/marketplace.json`, and
|
| 137 |
+
`plugins/headroom-agent-hooks/**/plugin.json` on every commit. Those
|
| 138 |
+
changes are harmless but each commit in Phase 0 picks them up. Phase 1
|
| 139 |
+
does not need to do anything special — just let the hook run.
|
| 140 |
+
- **`rust-toolchain.toml`** pins `channel = "stable"` rather than a specific
|
| 141 |
+
version so CI picks up the same toolchain the local box uses. Tighten to a
|
| 142 |
+
pinned version (e.g. `1.78`) once the port stabilizes.
|
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[package]
|
| 2 |
+
name = "headroom-core"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
edition.workspace = true
|
| 5 |
+
rust-version.workspace = true
|
| 6 |
+
license.workspace = true
|
| 7 |
+
repository.workspace = true
|
| 8 |
+
description = "Core Headroom types and compression transform traits (Rust)."
|
| 9 |
+
|
| 10 |
+
[dependencies]
|
| 11 |
+
serde = { workspace = true }
|
| 12 |
+
serde_json = { workspace = true }
|
| 13 |
+
bytes = { workspace = true }
|
| 14 |
+
thiserror = { workspace = true }
|
| 15 |
+
tracing = { workspace = true }
|
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! headroom-core: foundation crate for the Rust port of Headroom.
|
| 2 |
+
//!
|
| 3 |
+
//! Phase 0: only exposes stubs. No algorithm implementations yet.
|
| 4 |
+
|
| 5 |
+
pub mod transforms;
|
| 6 |
+
|
| 7 |
+
/// Identity stub used by downstream crates and the Python binding to verify
|
| 8 |
+
/// linkage end-to-end.
|
| 9 |
+
pub fn hello() -> &'static str {
|
| 10 |
+
"headroom-core"
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
#[cfg(test)]
|
| 14 |
+
mod tests {
|
| 15 |
+
use super::*;
|
| 16 |
+
|
| 17 |
+
#[test]
|
| 18 |
+
fn hello_returns_crate_name() {
|
| 19 |
+
assert_eq!(hello(), "headroom-core");
|
| 20 |
+
}
|
| 21 |
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! Transform trait namespace. Deliberately empty in Phase 0 — ports land in
|
| 2 |
+
//! Phase 1 (log_compressor, diff_compressor, cache_aligner, tokenizer, ccr).
|
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[package]
|
| 2 |
+
name = "headroom-parity"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
edition.workspace = true
|
| 5 |
+
rust-version.workspace = true
|
| 6 |
+
license.workspace = true
|
| 7 |
+
repository.workspace = true
|
| 8 |
+
description = "Rust-vs-Python parity harness for the Headroom port."
|
| 9 |
+
|
| 10 |
+
[lib]
|
| 11 |
+
path = "src/lib.rs"
|
| 12 |
+
|
| 13 |
+
[[bin]]
|
| 14 |
+
name = "parity-run"
|
| 15 |
+
path = "src/bin/parity_run.rs"
|
| 16 |
+
|
| 17 |
+
[dependencies]
|
| 18 |
+
serde = { workspace = true }
|
| 19 |
+
serde_json = { workspace = true }
|
| 20 |
+
anyhow = { workspace = true }
|
| 21 |
+
clap = { workspace = true }
|
| 22 |
+
thiserror = { workspace = true }
|
| 23 |
+
headroom-core = { path = "../headroom-core" }
|
| 24 |
+
# NOTE: Phase 0 does not invoke Python from Rust. Phase 1 adds `pyo3` with
|
| 25 |
+
# `auto-initialize` here so comparators can call into the installed
|
| 26 |
+
# `headroom` package directly.
|
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! `parity-run` CLI: drive the parity harness from the command line.
|
| 2 |
+
|
| 3 |
+
use anyhow::Result;
|
| 4 |
+
use clap::{Parser, Subcommand};
|
| 5 |
+
use headroom_parity::{builtin_comparators, run_comparator};
|
| 6 |
+
use std::path::PathBuf;
|
| 7 |
+
|
| 8 |
+
#[derive(Parser, Debug)]
|
| 9 |
+
#[command(
|
| 10 |
+
name = "parity-run",
|
| 11 |
+
about = "Run Headroom Rust-vs-Python parity checks"
|
| 12 |
+
)]
|
| 13 |
+
struct Cli {
|
| 14 |
+
#[command(subcommand)]
|
| 15 |
+
cmd: Cmd,
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
#[derive(Subcommand, Debug)]
|
| 19 |
+
enum Cmd {
|
| 20 |
+
/// Run all built-in comparators against fixtures under --fixtures.
|
| 21 |
+
Run {
|
| 22 |
+
#[arg(long, default_value = "tests/parity/fixtures")]
|
| 23 |
+
fixtures: PathBuf,
|
| 24 |
+
/// Only run this comparator (by transform name).
|
| 25 |
+
#[arg(long)]
|
| 26 |
+
only: Option<String>,
|
| 27 |
+
},
|
| 28 |
+
/// List the transforms the harness knows about.
|
| 29 |
+
List,
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
fn main() -> Result<()> {
|
| 33 |
+
let cli = Cli::parse();
|
| 34 |
+
match cli.cmd {
|
| 35 |
+
Cmd::List => {
|
| 36 |
+
for c in builtin_comparators() {
|
| 37 |
+
println!("{}", c.name());
|
| 38 |
+
}
|
| 39 |
+
Ok(())
|
| 40 |
+
}
|
| 41 |
+
Cmd::Run { fixtures, only } => {
|
| 42 |
+
let mut any_diffs = false;
|
| 43 |
+
for comparator in builtin_comparators() {
|
| 44 |
+
if let Some(ref filt) = only {
|
| 45 |
+
if filt != comparator.name() {
|
| 46 |
+
continue;
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
let report = run_comparator(&fixtures, comparator.as_ref())?;
|
| 50 |
+
println!(
|
| 51 |
+
"[{:<16}] total={} matched={} skipped={} diffed={}",
|
| 52 |
+
comparator.name(),
|
| 53 |
+
report.total(),
|
| 54 |
+
report.matched,
|
| 55 |
+
report.skipped.len(),
|
| 56 |
+
report.diffed.len()
|
| 57 |
+
);
|
| 58 |
+
for (path, reason) in &report.skipped {
|
| 59 |
+
println!(" skipped {}: {}", path.display(), reason);
|
| 60 |
+
}
|
| 61 |
+
for (path, expected, actual) in &report.diffed {
|
| 62 |
+
any_diffs = true;
|
| 63 |
+
println!(" DIFF {}", path.display());
|
| 64 |
+
println!(" expected: {}", first_line(expected));
|
| 65 |
+
println!(" actual : {}", first_line(actual));
|
| 66 |
+
}
|
| 67 |
+
}
|
| 68 |
+
if any_diffs {
|
| 69 |
+
std::process::exit(1);
|
| 70 |
+
}
|
| 71 |
+
Ok(())
|
| 72 |
+
}
|
| 73 |
+
}
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
fn first_line(s: &str) -> String {
|
| 77 |
+
s.lines().next().unwrap_or("").to_string()
|
| 78 |
+
}
|
|
@@ -0,0 +1,308 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! Parity harness: load JSON fixtures recorded from the Python implementation,
|
| 2 |
+
//! run the Rust port, and compare outputs.
|
| 3 |
+
//!
|
| 4 |
+
//! Phase 0: the per-transform comparators are stubs (`todo!()`), but the
|
| 5 |
+
//! harness wiring (fixture loading, dispatch, diff reporting) is real and
|
| 6 |
+
//! covered by a negative test.
|
| 7 |
+
|
| 8 |
+
use anyhow::{bail, Context, Result};
|
| 9 |
+
use serde::{Deserialize, Serialize};
|
| 10 |
+
use std::fs;
|
| 11 |
+
use std::path::{Path, PathBuf};
|
| 12 |
+
|
| 13 |
+
/// Recorded fixture schema. Matches `tests/parity/recorder.py`.
|
| 14 |
+
#[derive(Debug, Deserialize, Serialize, Clone)]
|
| 15 |
+
pub struct Fixture {
|
| 16 |
+
pub transform: String,
|
| 17 |
+
pub input: serde_json::Value,
|
| 18 |
+
#[serde(default)]
|
| 19 |
+
pub config: serde_json::Value,
|
| 20 |
+
pub output: serde_json::Value,
|
| 21 |
+
#[serde(default)]
|
| 22 |
+
pub recorded_at: String,
|
| 23 |
+
#[serde(default)]
|
| 24 |
+
pub input_sha256: String,
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
/// Outcome of comparing a recorded fixture against the current Rust impl.
|
| 28 |
+
#[derive(Debug, Clone)]
|
| 29 |
+
pub enum ComparisonOutcome {
|
| 30 |
+
Match,
|
| 31 |
+
Diff { expected: String, actual: String },
|
| 32 |
+
Skipped { reason: String },
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
/// Trait implemented by transform-specific comparators. A comparator receives
|
| 36 |
+
/// the fixture's input and config and produces a JSON value to compare against
|
| 37 |
+
/// `fixture.output`.
|
| 38 |
+
pub trait TransformComparator {
|
| 39 |
+
fn name(&self) -> &str;
|
| 40 |
+
fn run(
|
| 41 |
+
&self,
|
| 42 |
+
input: &serde_json::Value,
|
| 43 |
+
config: &serde_json::Value,
|
| 44 |
+
) -> Result<serde_json::Value>;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
/// Compare a single fixture against a comparator and return an outcome.
|
| 48 |
+
pub fn compare_fixture(
|
| 49 |
+
comparator: &dyn TransformComparator,
|
| 50 |
+
fixture: &Fixture,
|
| 51 |
+
) -> Result<ComparisonOutcome> {
|
| 52 |
+
let actual = match comparator.run(&fixture.input, &fixture.config) {
|
| 53 |
+
Ok(v) => v,
|
| 54 |
+
Err(e) => {
|
| 55 |
+
return Ok(ComparisonOutcome::Skipped {
|
| 56 |
+
reason: format!("comparator error: {e}"),
|
| 57 |
+
})
|
| 58 |
+
}
|
| 59 |
+
};
|
| 60 |
+
if actual == fixture.output {
|
| 61 |
+
Ok(ComparisonOutcome::Match)
|
| 62 |
+
} else {
|
| 63 |
+
Ok(ComparisonOutcome::Diff {
|
| 64 |
+
expected: serde_json::to_string_pretty(&fixture.output)?,
|
| 65 |
+
actual: serde_json::to_string_pretty(&actual)?,
|
| 66 |
+
})
|
| 67 |
+
}
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
/// Load every `*.json` fixture under `dir/<transform>/`.
|
| 71 |
+
pub fn load_fixtures_for(dir: &Path, transform: &str) -> Result<Vec<(PathBuf, Fixture)>> {
|
| 72 |
+
let root = dir.join(transform);
|
| 73 |
+
if !root.exists() {
|
| 74 |
+
return Ok(Vec::new());
|
| 75 |
+
}
|
| 76 |
+
let mut out = Vec::new();
|
| 77 |
+
for entry in fs::read_dir(&root).with_context(|| format!("reading {}", root.display()))? {
|
| 78 |
+
let entry = entry?;
|
| 79 |
+
let path = entry.path();
|
| 80 |
+
if path.extension().and_then(|s| s.to_str()) != Some("json") {
|
| 81 |
+
continue;
|
| 82 |
+
}
|
| 83 |
+
let bytes = fs::read(&path).with_context(|| format!("reading {}", path.display()))?;
|
| 84 |
+
let fixture: Fixture = serde_json::from_slice(&bytes)
|
| 85 |
+
.with_context(|| format!("parsing fixture {}", path.display()))?;
|
| 86 |
+
if fixture.transform != transform {
|
| 87 |
+
bail!(
|
| 88 |
+
"fixture {} declares transform={} but lives under {}",
|
| 89 |
+
path.display(),
|
| 90 |
+
fixture.transform,
|
| 91 |
+
transform
|
| 92 |
+
);
|
| 93 |
+
}
|
| 94 |
+
out.push((path, fixture));
|
| 95 |
+
}
|
| 96 |
+
Ok(out)
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
/// Aggregate report of one comparator run.
|
| 100 |
+
#[derive(Debug, Default)]
|
| 101 |
+
pub struct Report {
|
| 102 |
+
pub matched: usize,
|
| 103 |
+
pub diffed: Vec<(PathBuf, String, String)>,
|
| 104 |
+
pub skipped: Vec<(PathBuf, String)>,
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
impl Report {
|
| 108 |
+
pub fn total(&self) -> usize {
|
| 109 |
+
self.matched + self.diffed.len() + self.skipped.len()
|
| 110 |
+
}
|
| 111 |
+
pub fn is_clean(&self) -> bool {
|
| 112 |
+
self.diffed.is_empty()
|
| 113 |
+
}
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
/// Run a comparator over every fixture under `dir/<transform>/` and return a
|
| 117 |
+
/// report. Propagates IO/parse errors but never panics on comparator errors —
|
| 118 |
+
/// those become `Skipped` entries.
|
| 119 |
+
pub fn run_comparator(dir: &Path, comparator: &dyn TransformComparator) -> Result<Report> {
|
| 120 |
+
let mut report = Report::default();
|
| 121 |
+
let fixtures = load_fixtures_for(dir, comparator.name())?;
|
| 122 |
+
for (path, fixture) in fixtures {
|
| 123 |
+
match compare_fixture(comparator, &fixture)? {
|
| 124 |
+
ComparisonOutcome::Match => report.matched += 1,
|
| 125 |
+
ComparisonOutcome::Diff { expected, actual } => {
|
| 126 |
+
report.diffed.push((path, expected, actual));
|
| 127 |
+
}
|
| 128 |
+
ComparisonOutcome::Skipped { reason } => {
|
| 129 |
+
report.skipped.push((path, reason));
|
| 130 |
+
}
|
| 131 |
+
}
|
| 132 |
+
}
|
| 133 |
+
Ok(report)
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
// --- Built-in comparator stubs ---------------------------------------------
|
| 137 |
+
//
|
| 138 |
+
// Phase 1 will replace `todo!()` bodies with real Rust ports. Until then they
|
| 139 |
+
// return `Err`, causing the harness to mark fixtures as `Skipped` instead of
|
| 140 |
+
// panicking. The parity-run binary wires them up so the CLI works today.
|
| 141 |
+
|
| 142 |
+
macro_rules! stub_comparator {
|
| 143 |
+
($ty:ident, $name:literal) => {
|
| 144 |
+
pub struct $ty;
|
| 145 |
+
impl TransformComparator for $ty {
|
| 146 |
+
fn name(&self) -> &str {
|
| 147 |
+
$name
|
| 148 |
+
}
|
| 149 |
+
fn run(
|
| 150 |
+
&self,
|
| 151 |
+
_input: &serde_json::Value,
|
| 152 |
+
_config: &serde_json::Value,
|
| 153 |
+
) -> Result<serde_json::Value> {
|
| 154 |
+
anyhow::bail!(concat!("comparator ", $name, " not implemented (Phase 0)"))
|
| 155 |
+
}
|
| 156 |
+
}
|
| 157 |
+
};
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
stub_comparator!(LogCompressorComparator, "log_compressor");
|
| 161 |
+
stub_comparator!(DiffCompressorComparator, "diff_compressor");
|
| 162 |
+
stub_comparator!(CacheAlignerComparator, "cache_aligner");
|
| 163 |
+
stub_comparator!(TokenizerComparator, "tokenizer");
|
| 164 |
+
stub_comparator!(CcrComparator, "ccr");
|
| 165 |
+
|
| 166 |
+
/// Every built-in comparator, in a stable order.
|
| 167 |
+
pub fn builtin_comparators() -> Vec<Box<dyn TransformComparator>> {
|
| 168 |
+
vec![
|
| 169 |
+
Box::new(LogCompressorComparator),
|
| 170 |
+
Box::new(DiffCompressorComparator),
|
| 171 |
+
Box::new(CacheAlignerComparator),
|
| 172 |
+
Box::new(TokenizerComparator),
|
| 173 |
+
Box::new(CcrComparator),
|
| 174 |
+
]
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
#[cfg(test)]
|
| 178 |
+
mod tests {
|
| 179 |
+
use super::*;
|
| 180 |
+
use std::io::Write;
|
| 181 |
+
|
| 182 |
+
/// A fake comparator that always returns "rust-output" regardless of
|
| 183 |
+
/// input. Paired with a fixture whose `output` is "python-output", this
|
| 184 |
+
/// proves the harness reports diffs correctly.
|
| 185 |
+
struct FakeDivergent;
|
| 186 |
+
impl TransformComparator for FakeDivergent {
|
| 187 |
+
fn name(&self) -> &str {
|
| 188 |
+
"fake_divergent"
|
| 189 |
+
}
|
| 190 |
+
fn run(
|
| 191 |
+
&self,
|
| 192 |
+
_input: &serde_json::Value,
|
| 193 |
+
_config: &serde_json::Value,
|
| 194 |
+
) -> Result<serde_json::Value> {
|
| 195 |
+
Ok(serde_json::json!("rust-output"))
|
| 196 |
+
}
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
struct FakeAgreeing;
|
| 200 |
+
impl TransformComparator for FakeAgreeing {
|
| 201 |
+
fn name(&self) -> &str {
|
| 202 |
+
"fake_agreeing"
|
| 203 |
+
}
|
| 204 |
+
fn run(
|
| 205 |
+
&self,
|
| 206 |
+
_input: &serde_json::Value,
|
| 207 |
+
_config: &serde_json::Value,
|
| 208 |
+
) -> Result<serde_json::Value> {
|
| 209 |
+
Ok(serde_json::json!("python-output"))
|
| 210 |
+
}
|
| 211 |
+
}
|
| 212 |
+
|
| 213 |
+
fn write_fixture(dir: &Path, transform: &str, name: &str, output: serde_json::Value) {
|
| 214 |
+
let sub = dir.join(transform);
|
| 215 |
+
fs::create_dir_all(&sub).unwrap();
|
| 216 |
+
let fixture = Fixture {
|
| 217 |
+
transform: transform.to_string(),
|
| 218 |
+
input: serde_json::json!("hello"),
|
| 219 |
+
config: serde_json::json!({}),
|
| 220 |
+
output,
|
| 221 |
+
recorded_at: "2026-04-23T00:00:00Z".to_string(),
|
| 222 |
+
input_sha256: "deadbeef".to_string(),
|
| 223 |
+
};
|
| 224 |
+
let mut f = fs::File::create(sub.join(format!("{name}.json"))).unwrap();
|
| 225 |
+
f.write_all(&serde_json::to_vec_pretty(&fixture).unwrap())
|
| 226 |
+
.unwrap();
|
| 227 |
+
}
|
| 228 |
+
|
| 229 |
+
#[test]
|
| 230 |
+
fn harness_reports_diff_for_divergent_comparator() {
|
| 231 |
+
let tmp = tempdir();
|
| 232 |
+
write_fixture(
|
| 233 |
+
tmp.path(),
|
| 234 |
+
"fake_divergent",
|
| 235 |
+
"case1",
|
| 236 |
+
serde_json::json!("python-output"),
|
| 237 |
+
);
|
| 238 |
+
let report = run_comparator(tmp.path(), &FakeDivergent).unwrap();
|
| 239 |
+
assert_eq!(report.total(), 1);
|
| 240 |
+
assert_eq!(report.matched, 0);
|
| 241 |
+
assert_eq!(report.diffed.len(), 1);
|
| 242 |
+
assert!(!report.is_clean());
|
| 243 |
+
let (_, expected, actual) = &report.diffed[0];
|
| 244 |
+
assert!(expected.contains("python-output"));
|
| 245 |
+
assert!(actual.contains("rust-output"));
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
#[test]
|
| 249 |
+
fn harness_reports_match_for_agreeing_comparator() {
|
| 250 |
+
let tmp = tempdir();
|
| 251 |
+
write_fixture(
|
| 252 |
+
tmp.path(),
|
| 253 |
+
"fake_agreeing",
|
| 254 |
+
"case1",
|
| 255 |
+
serde_json::json!("python-output"),
|
| 256 |
+
);
|
| 257 |
+
let report = run_comparator(tmp.path(), &FakeAgreeing).unwrap();
|
| 258 |
+
assert_eq!(report.matched, 1);
|
| 259 |
+
assert!(report.is_clean());
|
| 260 |
+
}
|
| 261 |
+
|
| 262 |
+
#[test]
|
| 263 |
+
fn missing_transform_dir_yields_empty_report() {
|
| 264 |
+
let tmp = tempdir();
|
| 265 |
+
let report = run_comparator(tmp.path(), &FakeAgreeing).unwrap();
|
| 266 |
+
assert_eq!(report.total(), 0);
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
#[test]
|
| 270 |
+
fn stub_comparators_skip_rather_than_panic() {
|
| 271 |
+
let tmp = tempdir();
|
| 272 |
+
write_fixture(
|
| 273 |
+
tmp.path(),
|
| 274 |
+
"log_compressor",
|
| 275 |
+
"case1",
|
| 276 |
+
serde_json::json!({"compressed": "x"}),
|
| 277 |
+
);
|
| 278 |
+
let report = run_comparator(tmp.path(), &LogCompressorComparator).unwrap();
|
| 279 |
+
assert_eq!(report.skipped.len(), 1);
|
| 280 |
+
assert_eq!(report.matched, 0);
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
/// Minimal tempdir helper to avoid a dev-dependency on `tempfile`.
|
| 284 |
+
struct TempDir(PathBuf);
|
| 285 |
+
impl TempDir {
|
| 286 |
+
fn path(&self) -> &Path {
|
| 287 |
+
&self.0
|
| 288 |
+
}
|
| 289 |
+
}
|
| 290 |
+
impl Drop for TempDir {
|
| 291 |
+
fn drop(&mut self) {
|
| 292 |
+
let _ = fs::remove_dir_all(&self.0);
|
| 293 |
+
}
|
| 294 |
+
}
|
| 295 |
+
fn tempdir() -> TempDir {
|
| 296 |
+
use std::time::{SystemTime, UNIX_EPOCH};
|
| 297 |
+
let nanos = SystemTime::now()
|
| 298 |
+
.duration_since(UNIX_EPOCH)
|
| 299 |
+
.unwrap()
|
| 300 |
+
.as_nanos();
|
| 301 |
+
let p = std::env::temp_dir().join(format!(
|
| 302 |
+
"headroom-parity-{nanos}-{:?}",
|
| 303 |
+
std::thread::current().id()
|
| 304 |
+
));
|
| 305 |
+
fs::create_dir_all(&p).unwrap();
|
| 306 |
+
TempDir(p)
|
| 307 |
+
}
|
| 308 |
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[package]
|
| 2 |
+
name = "headroom-proxy"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
edition.workspace = true
|
| 5 |
+
rust-version.workspace = true
|
| 6 |
+
license.workspace = true
|
| 7 |
+
repository.workspace = true
|
| 8 |
+
description = "Headroom compression proxy (Rust, axum)."
|
| 9 |
+
|
| 10 |
+
[[bin]]
|
| 11 |
+
name = "headroom-proxy"
|
| 12 |
+
path = "src/main.rs"
|
| 13 |
+
|
| 14 |
+
[dependencies]
|
| 15 |
+
axum = { workspace = true }
|
| 16 |
+
tokio = { workspace = true }
|
| 17 |
+
tower = { workspace = true }
|
| 18 |
+
tracing = { workspace = true }
|
| 19 |
+
reqwest = { workspace = true }
|
| 20 |
+
serde = { workspace = true }
|
| 21 |
+
serde_json = { workspace = true }
|
| 22 |
+
headroom-core = { path = "../headroom-core" }
|
| 23 |
+
|
| 24 |
+
[dev-dependencies]
|
| 25 |
+
tower = { workspace = true, features = ["util"] }
|
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! headroom-proxy: Rust proxy binary (Phase 0 scaffolding).
|
| 2 |
+
//!
|
| 3 |
+
//! Currently exposes only `/healthz`. Provider routes land in Phase 2.
|
| 4 |
+
|
| 5 |
+
use axum::{routing::get, Json, Router};
|
| 6 |
+
use serde_json::{json, Value};
|
| 7 |
+
use std::net::SocketAddr;
|
| 8 |
+
|
| 9 |
+
async fn healthz() -> Json<Value> {
|
| 10 |
+
Json(json!({ "ok": true }))
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
fn app() -> Router {
|
| 14 |
+
Router::new().route("/healthz", get(healthz))
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
#[tokio::main]
|
| 18 |
+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
| 19 |
+
tracing_subscriber_init();
|
| 20 |
+
let addr: SocketAddr = "127.0.0.1:8787".parse()?;
|
| 21 |
+
tracing::info!(%addr, crate_hello = headroom_core::hello(), "starting headroom-proxy");
|
| 22 |
+
let listener = tokio::net::TcpListener::bind(addr).await?;
|
| 23 |
+
axum::serve(listener, app()).await?;
|
| 24 |
+
Ok(())
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
fn tracing_subscriber_init() {
|
| 28 |
+
// Minimal no-op initializer so we don't pull tracing-subscriber in Phase 0.
|
| 29 |
+
// Replace with tracing-subscriber in Phase 2 when richer logging is needed.
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
#[cfg(test)]
|
| 33 |
+
mod tests {
|
| 34 |
+
use super::app;
|
| 35 |
+
use axum::body::Body;
|
| 36 |
+
use axum::http::{Request, StatusCode};
|
| 37 |
+
use tower::ServiceExt;
|
| 38 |
+
|
| 39 |
+
#[tokio::test]
|
| 40 |
+
async fn healthz_returns_ok() {
|
| 41 |
+
let response = app()
|
| 42 |
+
.oneshot(
|
| 43 |
+
Request::builder()
|
| 44 |
+
.uri("/healthz")
|
| 45 |
+
.body(Body::empty())
|
| 46 |
+
.unwrap(),
|
| 47 |
+
)
|
| 48 |
+
.await
|
| 49 |
+
.unwrap();
|
| 50 |
+
assert_eq!(response.status(), StatusCode::OK);
|
| 51 |
+
let bytes = axum::body::to_bytes(response.into_body(), 1024)
|
| 52 |
+
.await
|
| 53 |
+
.unwrap();
|
| 54 |
+
let value: serde_json::Value = serde_json::from_slice(&bytes).unwrap();
|
| 55 |
+
assert_eq!(value, serde_json::json!({"ok": true}));
|
| 56 |
+
}
|
| 57 |
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[package]
|
| 2 |
+
name = "headroom-py"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
edition.workspace = true
|
| 5 |
+
rust-version.workspace = true
|
| 6 |
+
license.workspace = true
|
| 7 |
+
repository.workspace = true
|
| 8 |
+
description = "PyO3 bindings exposing headroom-core to Python as headroom._core."
|
| 9 |
+
|
| 10 |
+
[lib]
|
| 11 |
+
name = "_core"
|
| 12 |
+
crate-type = ["cdylib"]
|
| 13 |
+
# Disable the default test harness — Rust `cargo test` can't run a cdylib that
|
| 14 |
+
# links against libpython without LD/DYLD setup. Tests for this crate happen
|
| 15 |
+
# on the Python side (via `maturin develop` + pytest/smoke).
|
| 16 |
+
test = false
|
| 17 |
+
doctest = false
|
| 18 |
+
bench = false
|
| 19 |
+
|
| 20 |
+
[features]
|
| 21 |
+
default = []
|
| 22 |
+
extension-module = ["pyo3/extension-module"]
|
| 23 |
+
|
| 24 |
+
[dependencies]
|
| 25 |
+
headroom-core = { path = "../headroom-core" }
|
| 26 |
+
pyo3 = { workspace = true }
|
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[build-system]
|
| 2 |
+
requires = ["maturin>=1.5,<2.0"]
|
| 3 |
+
build-backend = "maturin"
|
| 4 |
+
|
| 5 |
+
[project]
|
| 6 |
+
name = "headroom-core-py"
|
| 7 |
+
version = "0.1.0"
|
| 8 |
+
description = "Python bindings to the Rust headroom-core crate."
|
| 9 |
+
requires-python = ">=3.10"
|
| 10 |
+
license = { text = "Apache-2.0" }
|
| 11 |
+
authors = [{ name = "Headroom Maintainers" }]
|
| 12 |
+
|
| 13 |
+
[tool.maturin]
|
| 14 |
+
# Build as a submodule of the `headroom` namespace so it becomes
|
| 15 |
+
# `from headroom._core import hello`.
|
| 16 |
+
module-name = "headroom._core"
|
| 17 |
+
# Keep python source layout out of this directory; maturin will install the
|
| 18 |
+
# compiled module into an existing `headroom` package in site-packages (or
|
| 19 |
+
# the active venv's overlay created by `maturin develop`).
|
| 20 |
+
python-source = "python"
|
| 21 |
+
features = ["extension-module"]
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! PyO3 bindings for headroom-core. Exposed to Python as `headroom._core`.
|
| 2 |
+
|
| 3 |
+
use pyo3::prelude::*;
|
| 4 |
+
|
| 5 |
+
/// Return the identity string from headroom-core.
|
| 6 |
+
#[pyfunction]
|
| 7 |
+
fn hello() -> &'static str {
|
| 8 |
+
headroom_core::hello()
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
#[pymodule]
|
| 12 |
+
fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
| 13 |
+
m.add_function(wrap_pyfunction!(hello, m)?)?;
|
| 14 |
+
Ok(())
|
| 15 |
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# cargo-deny configuration for the Rust workspace. Intentionally permissive
|
| 2 |
+
# during Phase 0 — tighten before Phase 2 goes to production.
|
| 3 |
+
|
| 4 |
+
[graph]
|
| 5 |
+
all-features = false
|
| 6 |
+
|
| 7 |
+
[licenses]
|
| 8 |
+
version = 2
|
| 9 |
+
allow = [
|
| 10 |
+
"MIT",
|
| 11 |
+
"Apache-2.0",
|
| 12 |
+
"Apache-2.0 WITH LLVM-exception",
|
| 13 |
+
"BSD-2-Clause",
|
| 14 |
+
"BSD-3-Clause",
|
| 15 |
+
"ISC",
|
| 16 |
+
"Unicode-3.0",
|
| 17 |
+
"Unicode-DFS-2016",
|
| 18 |
+
"CC0-1.0",
|
| 19 |
+
"Zlib",
|
| 20 |
+
"0BSD",
|
| 21 |
+
"MPL-2.0",
|
| 22 |
+
]
|
| 23 |
+
confidence-threshold = 0.8
|
| 24 |
+
exceptions = []
|
| 25 |
+
|
| 26 |
+
[bans]
|
| 27 |
+
multiple-versions = "allow"
|
| 28 |
+
wildcards = "allow"
|
| 29 |
+
|
| 30 |
+
[sources]
|
| 31 |
+
unknown-registry = "warn"
|
| 32 |
+
unknown-git = "warn"
|
|
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 022. Rust Migration
|
| 2 |
+
|
| 3 |
+
**Status:** in-progress (Stage 0 complete)
|
| 4 |
+
|
| 5 |
+
Headroom is evolving from a pure-Python proxy into a Rust engine with a Python SDK layer. This document describes the motivation, target architecture, and phased execution plan. It is the source of truth for the migration; the Discord announcement and contributor docs are derived from it.
|
| 6 |
+
|
| 7 |
+
## Why Rust
|
| 8 |
+
|
| 9 |
+
Three forces push us toward Rust:
|
| 10 |
+
|
| 11 |
+
1. **Latency.** Every LLM request flows through compression transforms on the hot path. Rust runs that math 2–10× faster than Python, with negligible interpreter overhead and near-instant cold starts.
|
| 12 |
+
2. **Deployment.** A Rust proxy is a single static binary (~10 MB). No Python interpreter, no pip, no wheel matrix, no model downloads at startup. It drops cleanly into containers, serverless runtimes, or bare hosts.
|
| 13 |
+
3. **Non-Python consumers.** Integrations like the TypeScript OpenClaw plugin talk to Headroom over HTTP. A faster proxy makes every downstream client faster without changing any client code.
|
| 14 |
+
|
| 15 |
+
The Python code is not being thrown away. Rust lives alongside Python in the same repository, the HTTP contract stays stable, and existing users see no breaking changes.
|
| 16 |
+
|
| 17 |
+
## Target architecture
|
| 18 |
+
|
| 19 |
+
Two new artifacts, built over time:
|
| 20 |
+
|
| 21 |
+
- **`headroom-proxy`** — a standalone Rust binary that speaks the existing Headroom HTTP API and contains native implementations of the proxy's hot-path logic (routing, streaming, compression, telemetry). This is the deployable artifact.
|
| 22 |
+
- **`headroom-core`** — a Rust library with the compression transforms (CCR, log compressor, diff compressor, tokenizer, code compressor, content router, etc.). Consumed by `headroom-proxy` directly; optionally exposed to Python via a PyO3 binding if/when embedded SDK use warrants it.
|
| 23 |
+
|
| 24 |
+
Both live in a Cargo workspace under `crates/` at the repo root. They are built, tested, and released together with the Python package.
|
| 25 |
+
|
| 26 |
+
## Migration strategy
|
| 27 |
+
|
| 28 |
+
**Trunk-based, no long-lived branch.** Every Rust change ships as a small PR to `main`. Rust and Python live side by side. CI enforces parity on every PR — if the Rust port diverges from the Python reference, the build fails.
|
| 29 |
+
|
| 30 |
+
**Proxy-first, not transforms-first.** We build the Rust proxy binary as the primary deliverable, starting from a pure HTTP passthrough that forwards upstream to the existing Python proxy. Native Rust implementations of individual routes then replace passthroughs one at a time, gated by feature flags. This lets us ship a deployable Rust binary on day one and iterate without modifying Python internals.
|
| 31 |
+
|
| 32 |
+
**Feature-flagged cutover.** Each native Rust route is toggled by config. Default is passthrough-to-Python until a route has been shadow-tested and validated. Rollback is a flag flip, not a redeploy.
|
| 33 |
+
|
| 34 |
+
**Parity by shadow traffic.** Recorded input/output fixtures give us a unit-test-level parity check. Shadow mode — running both proxies on live traffic and diffing outputs — gives us the real validation gate before any cutover.
|
| 35 |
+
|
| 36 |
+
## Stages
|
| 37 |
+
|
| 38 |
+
### Stage 0 — Foundation ✅
|
| 39 |
+
|
| 40 |
+
Cargo workspace with four crates (`headroom-core`, `headroom-proxy`, `headroom-py`, `headroom-parity`), CI, build tooling (Makefile, GitHub Actions), and a parity test harness seeded with 125 recorded fixtures across 5 leaf transforms. No production behavior changed.
|
| 41 |
+
|
| 42 |
+
### Stage 1 — Rust proxy as passthrough
|
| 43 |
+
|
| 44 |
+
`headroom-proxy` accepts requests on the same HTTP contract as the Python proxy and forwards everything upstream to Python. No transforms yet, no intelligence. The point is a deployable binary that can run in front of the existing stack with zero risk.
|
| 45 |
+
|
| 46 |
+
### Stage 2 — First native route
|
| 47 |
+
|
| 48 |
+
Replace the passthrough for `/v1/chat/completions` (OpenAI) with a native Rust implementation: Rust transforms, direct provider call, streamed response. Feature-flagged. Python proxy handles everything else unchanged.
|
| 49 |
+
|
| 50 |
+
### Stage 3 — Shadow mode validation
|
| 51 |
+
|
| 52 |
+
Run both proxies on real traffic. Diff outputs with tolerance for chunk timing (SSE). Gate: one week of ≤ 0.1% content divergence before flipping the flag for real.
|
| 53 |
+
|
| 54 |
+
### Stage 4 — Provider expansion
|
| 55 |
+
|
| 56 |
+
Anthropic, Google, Cohere, Mistral, Bedrock, others. Each provider goes through its own shadow period before cutover.
|
| 57 |
+
|
| 58 |
+
### Stage 5 — Code-aware transforms
|
| 59 |
+
|
| 60 |
+
Port `code_compressor` (tree-sitter, already Rust-native upstream), `content_router`, `content_detector`. These are larger transforms but have no ML dependencies.
|
| 61 |
+
|
| 62 |
+
### Stage 6 — Storage layer
|
| 63 |
+
|
| 64 |
+
SQLite (`rusqlite` + `sqlite-vec`), HNSW vector index (`instant-distance`), graph store (`neo4rs`). Feature-flagged backend for the memory subsystem.
|
| 65 |
+
|
| 66 |
+
### Stage 7 — ONNX migration
|
| 67 |
+
|
| 68 |
+
Remove the torch-dependent LLMLingua compressor. Convert remaining ML models (SmartCrusher, IntelligentContext, memory embedders) to ONNX with fixed opset. Run via the `ort` crate. Remove `torch`, `transformers`, `sentence-transformers`, `llmlingua` from runtime dependencies.
|
| 69 |
+
|
| 70 |
+
### Stage 8 — Retire the Python proxy
|
| 71 |
+
|
| 72 |
+
Delete `headroom/proxy/server.py` and the Python HTTP routes. The Python package (`import headroom`) continues to exist for SDK users and integration adapters (LangChain, Agno, MCP, Strands), which talk HTTP and don't care which proxy implementation is behind the endpoint.
|
| 73 |
+
|
| 74 |
+
## What does not change
|
| 75 |
+
|
| 76 |
+
- `pip install headroom` continues to work.
|
| 77 |
+
- The HTTP API contract is preserved.
|
| 78 |
+
- LangChain, Agno, MCP, Strands integrations keep working unchanged.
|
| 79 |
+
- The CLI, dashboard, eval framework, examples, and documentation site are all unaffected.
|
| 80 |
+
- Python contributions remain welcome for integrations, tooling, examples, and any code paths not yet ported.
|
| 81 |
+
|
| 82 |
+
## Contributing
|
| 83 |
+
|
| 84 |
+
- **Python contributors** do not need to learn Rust. CI will flag a PR if a Python change diverges from a Rust-ported counterpart; in that case either update both implementations or disable the feature flag for the affected route.
|
| 85 |
+
- **Rust contributors** should read `RUST_DEV.md` for workspace setup, then pick a transform or proxy route from the open issues.
|
| 86 |
+
|
| 87 |
+
## Risks and open questions
|
| 88 |
+
|
| 89 |
+
- **ONNX export parity** for embedding models: numerical reproducibility must be validated per model before cutover. Some models may resist clean export and require keeping a Python inference path behind PyO3 as a fallback.
|
| 90 |
+
- **LLMLingua removal** is a feature removal visible to users relying on it; deprecation timing will be announced on Discord before Stage 7 begins.
|
| 91 |
+
- **PyO3 binding scope**: we may ultimately not need a PyO3-exposed `headroom._core` at all, if existing Python SDK users are happy with the HTTP contract. Decision deferred to Stage 8.
|
| 92 |
+
|
| 93 |
+
## References
|
| 94 |
+
|
| 95 |
+
- `RUST_DEV.md` — developer setup and workspace reference
|
| 96 |
+
- `crates/` — Rust sources
|
| 97 |
+
- `tests/parity/` — fixtures and parity harness
|
| 98 |
+
- `Makefile` — `make test`, `make test-parity`, `make build-proxy`, `make build-wheel`, `make fmt`, `make lint`
|
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[toolchain]
|
| 2 |
+
channel = "stable"
|
| 3 |
+
components = ["rustfmt", "clippy"]
|
| 4 |
+
profile = "minimal"
|
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Entry point for recording Rust-vs-Python parity fixtures.
|
| 3 |
+
|
| 4 |
+
Usage:
|
| 5 |
+
python scripts/record_fixtures.py
|
| 6 |
+
|
| 7 |
+
This driver:
|
| 8 |
+
1. Monkey-patches the Phase-1 transform classes via
|
| 9 |
+
`tests.parity.recorder.record_all()`.
|
| 10 |
+
2. Runs a small deterministic synthetic workload (no network, no real LLM
|
| 11 |
+
calls) that hits each transform at least 20 times with varied inputs.
|
| 12 |
+
3. Prints a summary and exits non-zero if any transform was blocked.
|
| 13 |
+
"""
|
| 14 |
+
|
| 15 |
+
from __future__ import annotations
|
| 16 |
+
|
| 17 |
+
import logging
|
| 18 |
+
import sys
|
| 19 |
+
from pathlib import Path
|
| 20 |
+
|
| 21 |
+
# Make `tests/parity/recorder.py` importable without installing it.
|
| 22 |
+
_REPO_ROOT = Path(__file__).resolve().parent.parent
|
| 23 |
+
sys.path.insert(0, str(_REPO_ROOT))
|
| 24 |
+
|
| 25 |
+
from tests.parity.recorder import record_all, run_default_workload # noqa: E402
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def main() -> int:
|
| 29 |
+
logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(message)s")
|
| 30 |
+
log = logging.getLogger("record_fixtures")
|
| 31 |
+
|
| 32 |
+
statuses = record_all()
|
| 33 |
+
log.info("patch status:")
|
| 34 |
+
blocked = []
|
| 35 |
+
for name, status in statuses.items():
|
| 36 |
+
log.info(" %-16s %s", name, status)
|
| 37 |
+
if status.startswith("blocked:"):
|
| 38 |
+
blocked.append((name, status))
|
| 39 |
+
|
| 40 |
+
counts = run_default_workload()
|
| 41 |
+
log.info("fixture counts:")
|
| 42 |
+
shortfall = []
|
| 43 |
+
for name, n in counts.items():
|
| 44 |
+
log.info(" %-16s %d", name, n)
|
| 45 |
+
if n < 20:
|
| 46 |
+
shortfall.append((name, n))
|
| 47 |
+
|
| 48 |
+
if blocked:
|
| 49 |
+
log.error("blocked transforms: %s", blocked)
|
| 50 |
+
if shortfall:
|
| 51 |
+
log.error("transforms with <20 fixtures: %s", shortfall)
|
| 52 |
+
|
| 53 |
+
# Exit non-zero if anything was wholly blocked; short recordings are
|
| 54 |
+
# a soft warning.
|
| 55 |
+
return 1 if blocked else 0
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
if __name__ == "__main__":
|
| 59 |
+
raise SystemExit(main())
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 12.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 12: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "0225460359a992d95ef38cd7cec1d3e564d3271d289620aec5c55ed795659827",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "7f4a75c96f08adfe",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "d6c0c0f0a1603e63",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:d6c0c0f0a1603e63"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 12.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 12: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.783792+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 8.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 8: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "231ab237501e106b7c4ef2b8aa3842c31abf201f4f2b8c36166d2ae786f24f83",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "ae6baf456ddfbff6",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "f2be38f2730cd5ec",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:f2be38f2730cd5ec"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 8.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 8: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.781924+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 2.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 2: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "25683f67cbb74ecea3018e0cbf0855b05b32c41db0ad584e38af49227d9626ef",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "62429dcfa8ef6f9a",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "b903dee7e3bdfda5",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:b903dee7e3bdfda5"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 2.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 2: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.777851+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 0.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 0: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "31eb80356eeeb30df589cbd6000601f1815e5c5731c98009c6e6488d60847aa8",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": false,
|
| 34 |
+
"previous_hash": null,
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "a6f9a6e9b16b87f8",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:a6f9a6e9b16b87f8"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 0.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 0: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.772878+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 18.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 18: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "336311b995b063d547dd0bc4b1505a6d92b546810989c807a45a9b9adbd8726b",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "3448a68808670799",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "5d2cc8038b3e2eff",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:5d2cc8038b3e2eff"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 18.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 18: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.797368+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 5.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 5: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "475e76a9f99c29abbaae11133063a5c9d56e923ba7641576fc8af781f8c90231",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "a81110326e885546",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "d28bc9575c97a6b5",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:d28bc9575c97a6b5"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 5.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 5: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.780357+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 13.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 13: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "4b171a7f9af6e2d55e4d1ac374e9b87e2842455a358aa3628ae533ebb401e5c8",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "d6c0c0f0a1603e63",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "36ca37871b1a19b3",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:36ca37871b1a19b3"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 13.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 13: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.784256+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 4.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 4: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "541daf83f5a1fda96f7548a5ccd77471ed9f65f18c96b0d0e739672249b50558",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "387e30c8b8e09c1b",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "a81110326e885546",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:a81110326e885546"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 4.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 4: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.779840+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 7.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 7: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "6502f683439de0524e87b14e56fe9ac81dadfec1136fc1b7029511272648d34e",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "370f22d8bec65ce9",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "ae6baf456ddfbff6",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:ae6baf456ddfbff6"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 7.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 7: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.781367+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 17.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 17: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "7b556192a56bca9484db5a8aa7198e1fb9484d134385950a5186780e6e2dd5f4",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "a63698f1393aaf8d",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "3448a68808670799",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:3448a68808670799"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 17.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 17: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.795172+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 9.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 9: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "8822af1cf9a14254ca88e13a955b89703e56b89f4889b62c0c74f69b753fae55",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "f2be38f2730cd5ec",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "f0eb6d1b95c08f62",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:f0eb6d1b95c08f62"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 9.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 9: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.782389+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 14.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 14: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "92b25557cfbfa8dba4b21abe9c4de4e6fde501cdf4a6b37556e45fcd32a852eb",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "36ca37871b1a19b3",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "2847e8fa28fb37d6",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:2847e8fa28fb37d6"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 14.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 14: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.784722+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 1.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 1: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "acda633b1733c6e6e9b99cac3085118df5907266d9175c2ccb69ccadbe200d5a",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "a6f9a6e9b16b87f8",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "62429dcfa8ef6f9a",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:62429dcfa8ef6f9a"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 1.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 1: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.776323+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 19.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 19: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "c2563e51d50a4da6d315ced09771ec955cc0dd833897cc1a4f924703a154cafb",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "5d2cc8038b3e2eff",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "d37929b1256f7860",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:d37929b1256f7860"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 19.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 19: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.799586+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 11.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 11: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "c43df917ec5d7d4c5d95dcddee64ef6260c9b98b00c967330e8fe62b20b4b0a1",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "c8cd901c29a6e141",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "7f4a75c96f08adfe",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:7f4a75c96f08adfe"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 11.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 11: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.783317+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 15.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 15: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "c5ec19381964f8ef5a08d27435e71db7160c00a8980a78a97843832af3cf1190",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "2847e8fa28fb37d6",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "8a75d8139c10abcf",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:8a75d8139c10abcf"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 15.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 15: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.787416+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 3.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 3: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "e7a901cbf00a645fb14d9c0d0fec1cff05a1e54ce124f51497461605a5d5e5ba",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "b903dee7e3bdfda5",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "387e30c8b8e09c1b",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:387e30c8b8e09c1b"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 3.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 3: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.779295+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 10.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 10: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "ed9c7e7ca8f0ada6b54b1b96ae23e960e89fa6a897a5b48b3be1493ccb84afff",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "f0eb6d1b95c08f62",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "c8cd901c29a6e141",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:c8cd901c29a6e141"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 10.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 10: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.782857+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 6.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 6: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "efe495ffb2ff99227362d743a53d36d48d178f9e704443aad491795a8ff9ae39",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "d28bc9575c97a6b5",
|
| 35 |
+
"stable_prefix_bytes": 56,
|
| 36 |
+
"stable_prefix_hash": "370f22d8bec65ce9",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:370f22d8bec65ce9"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 6.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 6: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.780871+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {
|
| 3 |
+
"collapse_blank_lines": true,
|
| 4 |
+
"date_patterns": [
|
| 5 |
+
"Current [Dd]ate:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 6 |
+
"Today is \\w+,?\\s+\\w+ \\d+",
|
| 7 |
+
"Today's date:?\\s*\\d{4}-\\d{2}-\\d{2}",
|
| 8 |
+
"\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
| 9 |
+
],
|
| 10 |
+
"detection_tiers": [
|
| 11 |
+
"regex"
|
| 12 |
+
],
|
| 13 |
+
"dynamic_tail_separator": "\n\n---\n[Dynamic Context]\n",
|
| 14 |
+
"enabled": false,
|
| 15 |
+
"entropy_threshold": 0.7,
|
| 16 |
+
"extra_dynamic_labels": [],
|
| 17 |
+
"normalize_whitespace": true,
|
| 18 |
+
"use_dynamic_detector": true
|
| 19 |
+
},
|
| 20 |
+
"input": [
|
| 21 |
+
{
|
| 22 |
+
"content": "You are a helpful assistant. The date is 2026-04-23. Request id 16.",
|
| 23 |
+
"role": "system"
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"content": "Question number 16: what is 2+2?",
|
| 27 |
+
"role": "user"
|
| 28 |
+
}
|
| 29 |
+
],
|
| 30 |
+
"input_sha256": "f2b50b3cf76fe6a197f251c3745e78a172846277ca7665b97cd913d6ee243f79",
|
| 31 |
+
"output": {
|
| 32 |
+
"cache_metrics": {
|
| 33 |
+
"prefix_changed": true,
|
| 34 |
+
"previous_hash": "8a75d8139c10abcf",
|
| 35 |
+
"stable_prefix_bytes": 57,
|
| 36 |
+
"stable_prefix_hash": "a63698f1393aaf8d",
|
| 37 |
+
"stable_prefix_tokens_est": 15
|
| 38 |
+
},
|
| 39 |
+
"diff_artifact": null,
|
| 40 |
+
"markers_inserted": [
|
| 41 |
+
"stable_prefix_hash:a63698f1393aaf8d"
|
| 42 |
+
],
|
| 43 |
+
"messages": [
|
| 44 |
+
{
|
| 45 |
+
"content": "You are a helpful assistant. The date is . Request id 16.\n\n---\n[Dynamic Context]\n2026-04-23",
|
| 46 |
+
"role": "system"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"content": "Question number 16: what is 2+2?",
|
| 50 |
+
"role": "user"
|
| 51 |
+
}
|
| 52 |
+
],
|
| 53 |
+
"timing": {},
|
| 54 |
+
"tokens_after": 51,
|
| 55 |
+
"tokens_before": 47,
|
| 56 |
+
"transforms_applied": [
|
| 57 |
+
"cache_align"
|
| 58 |
+
],
|
| 59 |
+
"warnings": [],
|
| 60 |
+
"waste_signals": null
|
| 61 |
+
},
|
| 62 |
+
"recorded_at": "2026-04-23T23:51:37.792923+00:00",
|
| 63 |
+
"transform": "cache_aligner"
|
| 64 |
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 16",
|
| 6 |
+
"name": "other_tool_16"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "15887705e46d70a33029342fc15f4a3259031c01e2317008f4683833798d78d9",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 16",
|
| 14 |
+
"name": "other_tool_16"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 18 |
+
"input_schema": {
|
| 19 |
+
"properties": {
|
| 20 |
+
"hash": {
|
| 21 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 22 |
+
"type": "string"
|
| 23 |
+
},
|
| 24 |
+
"query": {
|
| 25 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 26 |
+
"type": "string"
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"required": [
|
| 30 |
+
"hash"
|
| 31 |
+
],
|
| 32 |
+
"type": "object"
|
| 33 |
+
},
|
| 34 |
+
"name": "headroom_retrieve"
|
| 35 |
+
}
|
| 36 |
+
],
|
| 37 |
+
true
|
| 38 |
+
],
|
| 39 |
+
"recorded_at": "2026-04-23T23:51:37.805953+00:00",
|
| 40 |
+
"transform": "ccr"
|
| 41 |
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 22",
|
| 6 |
+
"name": "other_tool_22"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "1e13216df83b1b242e602e061752778811c4303a567abe718681754dc0e7ff1e",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 22",
|
| 14 |
+
"name": "other_tool_22"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 18 |
+
"input_schema": {
|
| 19 |
+
"properties": {
|
| 20 |
+
"hash": {
|
| 21 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 22 |
+
"type": "string"
|
| 23 |
+
},
|
| 24 |
+
"query": {
|
| 25 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 26 |
+
"type": "string"
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"required": [
|
| 30 |
+
"hash"
|
| 31 |
+
],
|
| 32 |
+
"type": "object"
|
| 33 |
+
},
|
| 34 |
+
"name": "headroom_retrieve"
|
| 35 |
+
}
|
| 36 |
+
],
|
| 37 |
+
true
|
| 38 |
+
],
|
| 39 |
+
"recorded_at": "2026-04-23T23:51:37.806891+00:00",
|
| 40 |
+
"transform": "ccr"
|
| 41 |
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 17",
|
| 6 |
+
"name": "other_tool_17"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "22e61aa4e1839aaf69514cbdbdc4ac615fe1e436fe87c5de75d860a94762ff3a",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 17",
|
| 14 |
+
"name": "other_tool_17"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"function": {
|
| 18 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 19 |
+
"name": "headroom_retrieve",
|
| 20 |
+
"parameters": {
|
| 21 |
+
"properties": {
|
| 22 |
+
"hash": {
|
| 23 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 24 |
+
"type": "string"
|
| 25 |
+
},
|
| 26 |
+
"query": {
|
| 27 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 28 |
+
"type": "string"
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"required": [
|
| 32 |
+
"hash"
|
| 33 |
+
],
|
| 34 |
+
"type": "object"
|
| 35 |
+
}
|
| 36 |
+
},
|
| 37 |
+
"type": "function"
|
| 38 |
+
}
|
| 39 |
+
],
|
| 40 |
+
true
|
| 41 |
+
],
|
| 42 |
+
"recorded_at": "2026-04-23T23:51:37.806121+00:00",
|
| 43 |
+
"transform": "ccr"
|
| 44 |
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 19",
|
| 6 |
+
"name": "other_tool_19"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "2670d5319d6ff242031fc022d473f8b670ff943b47b70440f84e15655ca7dcd0",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 19",
|
| 14 |
+
"name": "other_tool_19"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"function": {
|
| 18 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 19 |
+
"name": "headroom_retrieve",
|
| 20 |
+
"parameters": {
|
| 21 |
+
"properties": {
|
| 22 |
+
"hash": {
|
| 23 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 24 |
+
"type": "string"
|
| 25 |
+
},
|
| 26 |
+
"query": {
|
| 27 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 28 |
+
"type": "string"
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"required": [
|
| 32 |
+
"hash"
|
| 33 |
+
],
|
| 34 |
+
"type": "object"
|
| 35 |
+
}
|
| 36 |
+
},
|
| 37 |
+
"type": "function"
|
| 38 |
+
}
|
| 39 |
+
],
|
| 40 |
+
true
|
| 41 |
+
],
|
| 42 |
+
"recorded_at": "2026-04-23T23:51:37.806448+00:00",
|
| 43 |
+
"transform": "ccr"
|
| 44 |
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 20",
|
| 6 |
+
"name": "other_tool_20"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "2c7824a6bc69ae8935944b28a879d0adf7f10d7d9fdd7cf0e74775389cc48944",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 20",
|
| 14 |
+
"name": "other_tool_20"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 18 |
+
"input_schema": {
|
| 19 |
+
"properties": {
|
| 20 |
+
"hash": {
|
| 21 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 22 |
+
"type": "string"
|
| 23 |
+
},
|
| 24 |
+
"query": {
|
| 25 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 26 |
+
"type": "string"
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"required": [
|
| 30 |
+
"hash"
|
| 31 |
+
],
|
| 32 |
+
"type": "object"
|
| 33 |
+
},
|
| 34 |
+
"name": "headroom_retrieve"
|
| 35 |
+
}
|
| 36 |
+
],
|
| 37 |
+
true
|
| 38 |
+
],
|
| 39 |
+
"recorded_at": "2026-04-23T23:51:37.806597+00:00",
|
| 40 |
+
"transform": "ccr"
|
| 41 |
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 23",
|
| 6 |
+
"name": "other_tool_23"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "3d8773cdc4d3493c7df439805446ac7a09f75942495ccc985e6959c67521917f",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 23",
|
| 14 |
+
"name": "other_tool_23"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"function": {
|
| 18 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 19 |
+
"name": "headroom_retrieve",
|
| 20 |
+
"parameters": {
|
| 21 |
+
"properties": {
|
| 22 |
+
"hash": {
|
| 23 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 24 |
+
"type": "string"
|
| 25 |
+
},
|
| 26 |
+
"query": {
|
| 27 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 28 |
+
"type": "string"
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"required": [
|
| 32 |
+
"hash"
|
| 33 |
+
],
|
| 34 |
+
"type": "object"
|
| 35 |
+
}
|
| 36 |
+
},
|
| 37 |
+
"type": "function"
|
| 38 |
+
}
|
| 39 |
+
],
|
| 40 |
+
true
|
| 41 |
+
],
|
| 42 |
+
"recorded_at": "2026-04-23T23:51:37.807121+00:00",
|
| 43 |
+
"transform": "ccr"
|
| 44 |
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 11",
|
| 6 |
+
"name": "other_tool_11"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "3de30e123dc02906deb06ba4ff4146bf31802302ed4ea40e636b45041ba1b661",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 11",
|
| 14 |
+
"name": "other_tool_11"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"function": {
|
| 18 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 19 |
+
"name": "headroom_retrieve",
|
| 20 |
+
"parameters": {
|
| 21 |
+
"properties": {
|
| 22 |
+
"hash": {
|
| 23 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 24 |
+
"type": "string"
|
| 25 |
+
},
|
| 26 |
+
"query": {
|
| 27 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 28 |
+
"type": "string"
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"required": [
|
| 32 |
+
"hash"
|
| 33 |
+
],
|
| 34 |
+
"type": "object"
|
| 35 |
+
}
|
| 36 |
+
},
|
| 37 |
+
"type": "function"
|
| 38 |
+
}
|
| 39 |
+
],
|
| 40 |
+
true
|
| 41 |
+
],
|
| 42 |
+
"recorded_at": "2026-04-23T23:51:37.803681+00:00",
|
| 43 |
+
"transform": "ccr"
|
| 44 |
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"config": {},
|
| 3 |
+
"input": [
|
| 4 |
+
{
|
| 5 |
+
"description": "desc 3",
|
| 6 |
+
"name": "other_tool_3"
|
| 7 |
+
}
|
| 8 |
+
],
|
| 9 |
+
"input_sha256": "7d7e15a8b88f7f62634f22e3040c14dff81ed35cee498af81f150b6cbc1a55bd",
|
| 10 |
+
"output": [
|
| 11 |
+
[
|
| 12 |
+
{
|
| 13 |
+
"description": "desc 3",
|
| 14 |
+
"name": "other_tool_3"
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"function": {
|
| 18 |
+
"description": "Retrieve original uncompressed content that was compressed to save tokens. Use this when you need more data than what's shown in compressed tool results. The hash is provided in compression markers like [N items compressed... hash=abc123].",
|
| 19 |
+
"name": "headroom_retrieve",
|
| 20 |
+
"parameters": {
|
| 21 |
+
"properties": {
|
| 22 |
+
"hash": {
|
| 23 |
+
"description": "Hash key from the compression marker (e.g., 'abc123' from hash=abc123)",
|
| 24 |
+
"type": "string"
|
| 25 |
+
},
|
| 26 |
+
"query": {
|
| 27 |
+
"description": "Optional search query to filter results. If provided, only returns items matching the query. If omitted, returns all original items.",
|
| 28 |
+
"type": "string"
|
| 29 |
+
}
|
| 30 |
+
},
|
| 31 |
+
"required": [
|
| 32 |
+
"hash"
|
| 33 |
+
],
|
| 34 |
+
"type": "object"
|
| 35 |
+
}
|
| 36 |
+
},
|
| 37 |
+
"type": "function"
|
| 38 |
+
}
|
| 39 |
+
],
|
| 40 |
+
true
|
| 41 |
+
],
|
| 42 |
+
"recorded_at": "2026-04-23T23:51:37.802244+00:00",
|
| 43 |
+
"transform": "ccr"
|
| 44 |
+
}
|