From 3c92b8123afe20f699e24cb4164cf874a233fc66 Mon Sep 17 00:00:00 2001 From: HeapSmasher <98077186+las7@users.noreply.github.com> Date: Fri, 14 Aug 2026 22:17:21 +0000 Subject: [PATCH 1/5] Ship the CLI on npm, and prune the lock so --locked passes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @reachpad/cli plus four platform packages, published from the same cli-v* tag as the GitHub release and carrying the same binaries. The launcher resolves the one platform package npm installed and execs it — no second implementation of any verb, so there is nothing to keep in parity. npm is here because our binaries are ad-hoc signed, not notarized: any download that stamps com.apple.quarantine (a browser download from the releases page; the Homebrew cask we shipped until 2026-08-13) meets Gatekeeper, and npm never sets that attribute. release.yml now also builds x86_64-apple-darwin — Intel Macs previously had no binary at all — and carries a Developer ID sign + notarize step that warns loudly and skips while the six secrets are absent. The lock is the other half. assemble-cli-repo.sh copied the private monorepo's Cargo.lock verbatim onto a generated three-member manifest, so cargo had to rewrite it: 'cargo test --workspace --locked' failed on pristine main, which is this repo's own greentree gate, and the committed lock was never the one a release built from. Pruned to 265 packages from 532, with no version changed and nothing added. Greentree-Change-Id: b5b7dc593c8a5054d9076f415fd90957 --- .github/workflows/ci.yml | 13 + .github/workflows/release.yml | 126 + .gitignore | 2 + Cargo.lock | 4255 ++++----------------------------- README.md | 20 +- greentree.yaml | 9 + npm/README.md | 85 + npm/cli/README.md | 93 + npm/cli/bin/reachpad.js | 56 + npm/cli/lib/binary.js | 91 + npm/cli/package.json | 47 + npm/darwin-arm64/README.md | 11 + npm/darwin-arm64/package.json | 32 + npm/darwin-x64/README.md | 11 + npm/darwin-x64/package.json | 32 + npm/linux-arm64/README.md | 11 + npm/linux-arm64/package.json | 32 + npm/linux-x64/README.md | 11 + npm/linux-x64/package.json | 32 + npm/prepare.mjs | 164 ++ npm/test/packages.test.mjs | 259 ++ 21 files changed, 1622 insertions(+), 3770 deletions(-) create mode 100644 npm/README.md create mode 100644 npm/cli/README.md create mode 100644 npm/cli/bin/reachpad.js create mode 100644 npm/cli/lib/binary.js create mode 100644 npm/cli/package.json create mode 100644 npm/darwin-arm64/README.md create mode 100644 npm/darwin-arm64/package.json create mode 100644 npm/darwin-x64/README.md create mode 100644 npm/darwin-x64/package.json create mode 100644 npm/linux-arm64/README.md create mode 100644 npm/linux-arm64/package.json create mode 100644 npm/linux-x64/README.md create mode 100644 npm/linux-x64/package.json create mode 100644 npm/prepare.mjs create mode 100644 npm/test/packages.test.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d3c2167..bc84d05 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,3 +19,16 @@ jobs: - run: cargo fmt --all --check - run: cargo build --workspace - run: cargo test --workspace + + # The npm distribution. No build, no network, no credentials — it is four + # descriptions of the same platform list, checked against each other, plus + # the launcher run as a real child process. The one that matters most is the + # cross-check against release.yml's build matrix: a target added there and + # not here publishes tarballs that `npm install` can never reach. + npm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: { node-version: "22" } + - run: node --test npm/test/*.test.mjs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 287cf97..0cf70ad 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,12 @@ # # Tags arrive from the source-of-truth sync (the private reachpad-infra repo # pushes a snapshot and its cli-v* tag together). +# +# Three things leave this workflow: a GitHub release, five npm packages, and +# nothing else. The npm packages carry these same binaries — see npm/README.md +# for why that install path exists at all (short version: npm never stamps +# com.apple.quarantine, so an ad-hoc signed binary installed that way does not +# meet Gatekeeper). name: release on: push: @@ -22,6 +28,10 @@ jobs: runner: ubuntu-24.04-arm - target: aarch64-apple-darwin runner: macos-14 + # Cross-compiled from the same arm64 runner: the macOS SDK carries + # both slices, so this needs a target, not a second machine. + - target: x86_64-apple-darwin + runner: macos-14 runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v4 @@ -40,6 +50,75 @@ jobs: fi - name: build run: cargo build --release -p reach --target ${{ matrix.target }} + + # --- macOS: Developer ID signature + notarization --------------------- + # + # Without this the binary is only ad-hoc signed (the linker's own + # signature). Ad-hoc is enough to EXECUTE on Apple silicon, which is why + # `brew install` and the curl installer work today — neither stamps + # com.apple.quarantine. It is NOT enough for anything that does stamp it: + # a browser download from the releases page hits "Apple could not verify + # reachpad is free of malware", and no amount of packaging fixes that. + # Only a Developer ID signature that Apple has notarized clears it. + # + # The step is skipped, loudly, when the secrets are absent, because the + # alternative is a release that silently ships unsigned binaries under a + # workflow that claims to sign them. Set up (once): + # + # MACOS_CERTIFICATE base64 of the Developer ID Application .p12 + # MACOS_CERTIFICATE_PWD its export password + # MACOS_SIGN_IDENTITY e.g. "Developer ID Application: … (TEAMID)" + # MACOS_NOTARY_KEY base64 of the App Store Connect .p8 key + # MACOS_NOTARY_KEY_ID the key id + # MACOS_NOTARY_ISSUER the issuer uuid + - name: sign and notarize (macOS, when the signing secrets exist) + if: runner.os == 'macOS' + env: + CERT: ${{ secrets.MACOS_CERTIFICATE }} + CERT_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }} + IDENTITY: ${{ secrets.MACOS_SIGN_IDENTITY }} + NOTARY_KEY: ${{ secrets.MACOS_NOTARY_KEY }} + NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }} + NOTARY_ISSUER: ${{ secrets.MACOS_NOTARY_ISSUER }} + BINARY: target/${{ matrix.target }}/release/reachpad + run: | + if [ -z "$CERT" ]; then + echo "::warning title=Unsigned macOS binary::MACOS_CERTIFICATE is not set. This release ships an ad-hoc signed binary: it runs from brew, npm and the curl installer, but a browser download will be blocked by Gatekeeper. See the comment in .github/workflows/release.yml." + exit 0 + fi + keychain="$RUNNER_TEMP/build.keychain" + password="$(uuidgen)" + security create-keychain -p "$password" "$keychain" + security set-keychain-settings -lut 21600 "$keychain" + security unlock-keychain -p "$password" "$keychain" + security list-keychains -d user -s "$keychain" $(security list-keychains -d user | tr -d '"') + echo "$CERT" | base64 --decode > "$RUNNER_TEMP/cert.p12" + security import "$RUNNER_TEMP/cert.p12" -k "$keychain" -P "$CERT_PWD" \ + -T /usr/bin/codesign -T /usr/bin/security + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$password" "$keychain" + rm -f "$RUNNER_TEMP/cert.p12" + + # --options runtime is what notarization requires; --timestamp is + # what keeps the signature valid after the certificate expires. + codesign --force --timestamp --options runtime \ + --sign "$IDENTITY" "$BINARY" + codesign --verify --strict --verbose=2 "$BINARY" + + # notarytool takes an archive, not a bare executable. + echo "$NOTARY_KEY" | base64 --decode > "$RUNNER_TEMP/notary.p8" + ditto -c -k "$BINARY" "$RUNNER_TEMP/notarize.zip" + xcrun notarytool submit "$RUNNER_TEMP/notarize.zip" \ + --key "$RUNNER_TEMP/notary.p8" \ + --key-id "$NOTARY_KEY_ID" \ + --issuer "$NOTARY_ISSUER" \ + --wait --timeout 30m + rm -f "$RUNNER_TEMP/notary.p8" + + # A bare Mach-O cannot be stapled — the ticket has nowhere to live. + # Gatekeeper falls back to an online notarization check instead, + # which is why this workflow does not attempt `stapler staple`. + echo "signed and notarized: $(codesign -dv --verbose=4 "$BINARY" 2>&1 | grep -i '^Authority' | head -1)" + - name: package run: | cd target/${{ matrix.target }}/release @@ -67,3 +146,50 @@ jobs: *.tar.gz SHA256SUMS fail_on_unmatched_files: true + + # The same binaries, on npm. Separate job so a registry outage cannot lose + # the GitHub release, and `needs: publish` so npm never advertises a version + # whose release page does not exist yet. + npm: + needs: publish + runs-on: ubuntu-latest + permissions: + id-token: write # Trusted Publishing: the whole mechanism + contents: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: { node-version: "22", registry-url: "https://registry.npmjs.org" } + # Node 22 ships npm 10, which predates OIDC publishing entirely. A floor + # rather than @latest, so a future npm cannot change a release out from + # under us on an unrelated day. + - name: npm new enough to speak OIDC + run: npm install -g npm@^11.5.1 + - uses: actions/download-artifact@v4 + with: + path: artifacts + merge-multiple: true + - name: the release's own checksums, not the artifacts' word for it + run: | + cd artifacts && cat *.sha256 > SHA256SUMS && ls -l + - name: stamp the tag's version and stage the binaries + run: | + version="${GITHUB_REF_NAME#cli-v}" + node npm/prepare.mjs --version "$version" --artifacts artifacts + - run: node --test npm/test/*.test.mjs + # Idempotent on purpose: five publishes in a row, and the fourth failing + # must leave a re-runnable tag rather than a half-published version that + # npm then refuses to accept again. The platform packages go FIRST — + # @reachpad/cli names them as optional dependencies, and a main package + # published before them is one npm resolves to nothing for a while. + - name: publish + run: | + version=$(node -p "require('./npm/cli/package.json').version") + for dir in darwin-arm64 darwin-x64 linux-x64 linux-arm64 cli; do + name=$(node -p "require('./npm/$dir/package.json').name") + if npm view "$name@$version" version >/dev/null 2>&1; then + echo "$name@$version is already on npm; leaving it alone" + else + npm publish "npm/$dir" + fi + done diff --git a/.gitignore b/.gitignore index 6b3e392..f531679 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ /target *.profraw +npm/*/bin/reachpad +npm/node_modules diff --git a/Cargo.lock b/Cargo.lock index ef78b1f..4c7df99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,29 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common 0.1.7", - "generic-array", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.4", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.4" @@ -34,21 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anstream" version = "1.0.0" @@ -105,15 +67,6 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" -[[package]] -name = "arc-swap" -version = "1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" -dependencies = [ - "rustversion", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -126,12 +79,6 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - [[package]] name = "asn1-rs" version = "0.7.2" @@ -172,2304 +119,703 @@ dependencies = [ ] [[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +name = "authz" +version = "0.3.0" dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", + "biscuit-auth", + "blake3", + "hex", + "thiserror 2.0.19", ] [[package]] -name = "async-fs" -version = "2.2.0" +name = "autocfg" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] -name = "async-io" -version = "2.6.0" +name = "base64" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 1.1.4", - "slab", - "windows-sys 0.61.2", -] +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] -name = "async-lock" -version = "3.4.2" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "async-net" -version = "2.0.0" +name = "base64ct" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] -name = "async-process" -version = "2.5.0" +name = "biscuit-auth" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +checksum = "95490f2c91dc452247d00a2fb4779bcedb7693e669354fa1fe2a96679f4950cc" dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix 1.1.4", + "base64 0.13.1", + "biscuit-parser", + "biscuit-quote", + "ed25519-dalek", + "getrandom 0.1.16", + "hex", + "nom", + "prost 0.10.4", + "prost-types 0.10.1", + "rand 0.8.7", + "rand_core 0.6.4", + "regex", + "sha2 0.9.9", + "thiserror 1.0.69", + "time", + "zeroize", ] [[package]] -name = "async-signal" -version = "0.2.14" +name = "biscuit-parser" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +checksum = "1b9fd6da963e73f7e6db729c3bd76784863ba405b15acbbb5cb08ebc2adbd3bf" dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.1.4", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", + "hex", + "nom", + "proc-macro2", + "quote", + "thiserror 1.0.69", + "time", ] [[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.91" +name = "biscuit-quote" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +checksum = "0071fe3634b644a8df1434e3e14841e480c4238059c66a94e479b7eff98c2bd3" dependencies = [ + "biscuit-parser", + "proc-macro-error", "proc-macro2", "quote", - "syn 3.0.3", + "syn 1.0.109", ] [[package]] -name = "atoi" -version = "2.0.0" +name = "bit-set" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "num-traits", + "bit-vec 0.8.0", ] [[package]] -name = "atomic-waker" -version = "1.1.2" +name = "bit-vec" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] -name = "authz" -version = "0.3.0" +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" dependencies = [ - "biscuit-auth", - "blake3", - "hex", - "thiserror 2.0.19", + "serde", ] [[package]] -name = "autocfg" -version = "1.5.1" +name = "bitflags" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] -name = "aws-credential-types" -version = "1.3.0" +name = "blake3" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93964ffdaf57857f544be3666a5f57570bb699e934700f11b49708f61bb556e" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "zeroize", + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", ] [[package]] -name = "aws-lc-rs" -version = "1.17.3" +name = "block-buffer" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "aws-lc-sys", - "untrusted 0.7.1", - "zeroize", + "generic-array", ] [[package]] -name = "aws-lc-sys" -version = "0.43.0" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", - "pkg-config", + "generic-array", ] [[package]] -name = "aws-runtime" -version = "1.9.1" +name = "bumpalo" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9007227e10b5fed2f3e0a2beff489211e2b5604c400b7a9d5d81ca9d64c24bb" -dependencies = [ - "aws-credential-types", - "aws-sigv4", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "bytes-utils", - "fastrand", - "http 1.5.0", - "http-body 1.1.0", - "percent-encoding", - "pin-project-lite", - "tracing", - "uuid", -] +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] -name = "aws-sdk-ec2" -version = "1.245.0" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea0c210d0644edd89684295ea7b1f17a5c34c11c1ddc0febb9f809af4876ba4" -dependencies = [ - "arc-swap", - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", - "aws-smithy-observability", - "aws-smithy-query", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", - "aws-smithy-xml", - "aws-types", - "fastrand", - "http 0.2.12", - "http 1.5.0", - "regex-lite", - "tracing", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "aws-sdk-kms" -version = "1.114.0" +name = "bytes" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b7d906608ee41e7ddea9983577ba82200435644d567d63dc34e822e088b453" -dependencies = [ - "arc-swap", - "aws-credential-types", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", - "aws-smithy-observability", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "http 0.2.12", - "http 1.5.0", - "regex-lite", - "tracing", -] +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] -name = "aws-sigv4" -version = "1.5.1" +name = "cc" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723c2234ad7511ceef63eab016b7ba6ff7c55590fefb96fa8467af014a07309f" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ - "aws-credential-types", - "aws-smithy-http", - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "form_urlencoded", - "hex", - "hmac 0.13.0", - "http 0.2.12", - "http 1.5.0", - "percent-encoding", - "sha2 0.11.0", - "time", - "tracing", + "find-msvc-tools", + "shlex", ] [[package]] -name = "aws-smithy-async" -version = "1.3.0" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02e407fb3b54891734224b9ffac8a71fdd35f542500fa1af95754a6b2beb316" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", -] +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "aws-smithy-http" -version = "0.64.0" +name = "cfg_aliases" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37843d9add67c3aff5856f409c6dc315d3cdff60f9c0cb5b670dab1e9920306d" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", - "futures-util", - "http 1.5.0", - "http-body 1.1.0", - "http-body-util", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] -name = "aws-smithy-http-client" -version = "1.2.0" +name = "chacha20" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635d23afda0a6ab48d666c4d447c4873e8d1e83518a2be2093122397e50b838e" -dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "h2 0.3.27", - "h2 0.4.15", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "pin-project-lite", - "rustls 0.21.12", - "rustls-native-certs", - "tokio", - "tracing", +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", ] [[package]] -name = "aws-smithy-json" -version = "0.63.0" +name = "clap" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc65a121adb4b33729919fcfa14fa36fb33c1555a8f06bb0e2188dbfdc1d9ef" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", + "clap_builder", + "clap_derive", ] [[package]] -name = "aws-smithy-observability" -version = "0.3.0" +name = "clap_builder" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e86338c869539a581bf161247762a6e87f92c5c075060057b5ed6d06632ed0c" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" dependencies = [ - "aws-smithy-runtime-api", + "anstream", + "anstyle", + "clap_lex", + "strsim", ] [[package]] -name = "aws-smithy-query" -version = "0.62.0" +name = "clap_complete" +version = "4.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512346c7212ab7436df2d77a16d976a468ae44a418835511d2a69269810aaf62" +checksum = "3be2ad0423bdbbb0e25bc89add796f3559706d4a95e1bc98e4d9662a957b6a19" dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", - "aws-smithy-xml", - "urlencoding", + "clap", ] [[package]] -name = "aws-smithy-runtime" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07505b34e8f4b3591a4fa69e9792b52289b95488dbbc68c3c0075b7bedb245e1" -dependencies = [ - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-http-client", - "aws-smithy-observability", - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", - "bytes", - "fastrand", - "http 0.2.12", - "http 1.5.0", - "http-body 0.4.6", - "http-body 1.1.0", - "http-body-util", - "pin-project-lite", - "pin-utils", - "tokio", - "tracing", -] - -[[package]] -name = "aws-smithy-runtime-api" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b98f2e1fd67ec06618f9c291e5e495a468e60519e44c9c1979cd0521f3affdb" -dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api-macros", - "aws-smithy-types", - "bytes", - "http 0.2.12", - "http 1.5.0", - "pin-project-lite", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-smithy-runtime-api-macros" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221eaa237ddf1ca79b60d1372aad77e47f9c0ea5b3ce5099da8c61d027dc77b3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "aws-smithy-schema" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56e0a4e53127a632224e43633b0fe045fa9e1e3cfc68b9830f1115e103f910" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types", - "http 1.5.0", -] - -[[package]] -name = "aws-smithy-types" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6dc683efb34b9e755675b37fedbe0103141e5b6df7bdc9eb6967756a8c167d8" -dependencies = [ - "base64-simd", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http 1.5.0", - "http-body 0.4.6", - "http-body 1.1.0", - "http-body-util", - "itoa", - "num-integer", - "pin-project-lite", - "pin-utils", - "ryu", - "serde", - "time", - "tokio", - "tokio-util", -] - -[[package]] -name = "aws-smithy-xml" -version = "0.62.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce84f71c72fee2cbbadde6e7d082f5fb466e3a84733855295fa7aafd1b31b7d8" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", - "xmlparser", -] - -[[package]] -name = "aws-types" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec1cd5469f328c782dc3e33d4153cf118a54e33cbb3356d60d16f89883e1f94" -dependencies = [ - "aws-credential-types", - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-schema", - "aws-smithy-types", - "rustc_version", - "tracing", -] - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core", - "base64 0.22.1", - "bytes", - "futures-util", - "http 1.5.0", - "http-body 1.1.0", - "http-body-util", - "hyper 1.11.0", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.5.0", - "http-body 1.1.0", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] - -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools 0.10.5", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex 1.3.0", - "syn 2.0.119", - "which", -] - -[[package]] -name = "biscuit-auth" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95490f2c91dc452247d00a2fb4779bcedb7693e669354fa1fe2a96679f4950cc" -dependencies = [ - "base64 0.13.1", - "biscuit-parser", - "biscuit-quote", - "ed25519-dalek", - "getrandom 0.1.16", - "hex", - "nom", - "prost 0.10.4", - "prost-types 0.10.1", - "rand 0.8.7", - "rand_core 0.6.4", - "regex", - "sha2 0.9.9", - "thiserror 1.0.69", - "time", - "zeroize", -] - -[[package]] -name = "biscuit-parser" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9fd6da963e73f7e6db729c3bd76784863ba405b15acbbb5cb08ebc2adbd3bf" -dependencies = [ - "hex", - "nom", - "proc-macro2", - "quote", - "thiserror 1.0.69", - "time", -] - -[[package]] -name = "biscuit-quote" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0071fe3634b644a8df1434e3e14841e480c4238059c66a94e479b7eff98c2bd3" -dependencies = [ - "biscuit-parser", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec 0.8.0", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bit-vec" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "2.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" -dependencies = [ - "serde_core", -] - -[[package]] -name = "bitmaps" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" - -[[package]] -name = "blake3" -version = "1.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "cpufeatures 0.3.0", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "blockd" -version = "0.3.0" -dependencies = [ - "anyhow", - "async-trait", - "blake3", - "cas", - "clap", - "futures", - "hex", - "libublk", - "nix 0.31.3", - "object_store", - "proptest", - "prost 0.13.5", - "proto", - "runtime", - "serde", - "serde_json", - "statemachines", - "store", - "tempfile", - "thiserror 2.0.19", - "tokio", - "tracing", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[package]] -name = "cas" -version = "0.3.0" -dependencies = [ - "async-trait", - "blake3", - "futures", - "hex", - "object_store", - "proptest", - "prost 0.13.5", - "proto", - "statemachines", - "store", - "tempfile", - "thiserror 2.0.19", - "tokio", - "tracing", - "zstd", -] - -[[package]] -name = "cc" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex 2.0.1", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", -] - -[[package]] -name = "chacha20" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20 0.9.1", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "choice" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b71fc821deaf602a933ada5c845d088156d0cdf2ebf43ede390afe93466553" - -[[package]] -name = "chrono" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link", -] - -[[package]] -name = "chunked_transfer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common 0.1.7", - "inout", - "zeroize", -] - -[[package]] -name = "clang-sys" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_complete" -version = "4.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be2ad0423bdbbb0e25bc89add796f3559706d4a95e1bc98e4d9662a957b6a19" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_derive" -version = "4.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "clap_lex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" - -[[package]] -name = "cmake" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" -dependencies = [ - "cc", -] - -[[package]] -name = "cmov" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" - -[[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-oid" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" - -[[package]] -name = "constant_time_eq" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" - -[[package]] -name = "controld" -version = "0.3.0" -dependencies = [ - "anyhow", - "authz", - "aws-credential-types", - "aws-sdk-ec2", - "aws-types", - "axum", - "base64 0.22.1", - "blake3", - "blockd", - "chacha20poly1305", - "futures", - "hex", - "http-body-util", - "hyper 1.11.0", - "hyper-util", - "object_store", - "pgtest", - "proto", - "rand 0.8.7", - "rcgen", - "runtime", - "rustls 0.23.43", - "rustls-pemfile", - "serde", - "serde_json", - "sqlx", - "statemachines", - "store", - "thiserror 2.0.19", - "time", - "tokio", - "tokio-rustls 0.26.4", - "tracing", - "tracing-subscriber", - "x509-parser", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" - -[[package]] -name = "crossbeam-queue" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-common" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "ctutils" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" -dependencies = [ - "cmov", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.119", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "dashmap" -version = "6.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid 0.9.6", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derive_setters" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e6f6fa1f03c14ae082120b84b3c7fbd7b8588d924cf2d7c3daf9afd49df8b9" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid 0.9.6", - "crypto-common 0.1.7", - "subtle", -] - -[[package]] -name = "digest" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" -dependencies = [ - "block-buffer 0.12.1", - "const-oid 0.10.2", - "crypto-common 0.2.2", - "ctutils", -] - -[[package]] -name = "displaydoc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" -dependencies = [ - "serde", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "5.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" -dependencies = [ - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "eventlog" -version = "0.3.0" -dependencies = [ - "base64 0.22.1", - "hex", - "percent-encoding", - "proptest", - "prost 0.13.5", - "proto", - "store", - "thiserror 2.0.19", - "tokio", - "zstd", -] - -[[package]] -name = "fastbloom" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" -dependencies = [ - "foldhash 0.2.0", - "libm", - "portable-atomic", - "siphasher", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" - -[[package]] -name = "futures-executor" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.33" +name = "clap_derive" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ + "heck", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] -name = "futures-sink" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" - -[[package]] -name = "futures-task" -version = "0.3.33" +name = "clap_lex" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] -name = "futures-timer" -version = "3.0.4" +name = "colorchoice" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] -name = "futures-util" -version = "0.3.33" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "gatewayd" -version = "0.3.0" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "anyhow", - "authz", - "axum", - "base64 0.22.1", - "blake3", "bytes", - "clap", - "eventlog", - "hex", - "proto", - "runtime", - "serde_json", - "thiserror 2.0.19", - "tokio", - "tracing", - "tracing-subscriber", + "memchr", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "getrandom" -version = "0.1.16" +name = "constant_time_eq" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] -name = "getrandom" -version = "0.2.17" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "cfg-if", - "js-sys", + "core-foundation-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] -name = "getrandom" -version = "0.3.4" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "getrandom" -version = "0.4.3" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "cfg-if", - "js-sys", "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", - "wasm-bindgen", -] - -[[package]] -name = "glob" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" - -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.5.0", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", ] [[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" +name = "cpufeatures" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + "libc", +] [[package]] -name = "hashlink" -version = "0.10.0" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "hashbrown 0.15.5", + "generic-array", + "typenum", ] [[package]] -name = "heck" -version = "0.5.0" +name = "curve25519-dalek" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] [[package]] -name = "hermit-abi" -version = "0.5.2" +name = "curve25519-dalek-derive" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] -name = "hex" -version = "0.4.3" +name = "data-encoding" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] -name = "hkdf" -version = "0.12.4" +name = "der" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "hmac 0.12.1", + "const-oid", + "zeroize", ] [[package]] -name = "hmac" -version = "0.12.1" +name = "der-parser" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" dependencies = [ - "digest 0.10.7", + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", ] [[package]] -name = "hmac" -version = "0.13.0" +name = "deranged" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" -dependencies = [ - "digest 0.11.3", -] +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] -name = "home" -version = "0.5.12" +name = "digest" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "windows-sys 0.61.2", + "generic-array", ] [[package]] -name = "http" -version = "0.2.12" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "bytes", - "fnv", - "itoa", + "block-buffer 0.10.4", + "crypto-common", ] [[package]] -name = "http" -version = "1.5.0" +name = "displaydoc" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ - "bytes", - "itoa", + "proc-macro2", + "quote", + "syn 3.0.3", ] [[package]] -name = "http-body" -version = "0.4.6" +name = "ed25519" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", + "pkcs8", + "signature", ] [[package]] -name = "http-body" -version = "1.1.0" +name = "ed25519-dalek" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ - "bytes", - "http 1.5.0", + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", ] [[package]] -name = "http-body-util" -version = "0.1.4" +name = "either" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" -dependencies = [ - "bytes", - "futures-core", - "http 1.5.0", - "http-body 1.1.0", - "pin-project-lite", -] +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] -name = "httparse" -version = "1.10.1" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "httpdate" -version = "1.0.3" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] [[package]] -name = "hub" -version = "0.3.0" +name = "fastbloom" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" dependencies = [ - "anyhow", - "authz", - "axum", - "base64 0.22.1", - "blake3", - "bytes", - "clap", - "eventlog", - "futures", - "hex", - "hyper 1.11.0", - "hyper-util", - "instant-acme", - "object_store", - "pgtest", - "prost 0.13.5", - "proto", - "quinn", - "rcgen", - "runtime", - "rustls 0.23.43", - "rustls-pemfile", - "serde", - "serde_json", - "sqlx", - "statemachines", - "store", - "thiserror 2.0.19", - "tokio", - "tokio-rustls 0.26.4", - "tokio-tungstenite", - "tracing", - "x509-parser", + "foldhash", + "libm", + "portable-atomic", + "siphasher", ] [[package]] -name = "humantime" -version = "2.4.0" +name = "fastrand" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] -name = "hybrid-array" -version = "0.4.14" +name = "fiat-crypto" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" -dependencies = [ - "typenum", -] +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] -name = "hyper" -version = "0.14.32" +name = "find-msvc-tools" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] -name = "hyper" -version = "1.11.0" +name = "fixedbitset" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2 0.4.15", - "http 1.5.0", - "http-body 1.1.0", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "hyper-rustls" -version = "0.27.9" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http 1.5.0", - "hyper 1.11.0", - "hyper-util", - "rustls 0.23.43", - "rustls-native-certs", - "rustls-platform-verifier", - "tokio", - "tokio-rustls 0.26.4", - "tower-service", -] +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "hyper-util" -version = "0.1.20" +name = "futures" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ - "base64 0.22.1", - "bytes", "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", "futures-util", - "http 1.5.0", - "http-body 1.1.0", - "hyper 1.11.0", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.6.5", - "tokio", - "tower-service", - "tracing", ] [[package]] -name = "iana-time-zone" -version = "0.1.65" +name = "futures-channel" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", + "futures-core", + "futures-sink", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "futures-core" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] -name = "icu_collections" -version = "2.2.0" +name = "futures-executor" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", + "futures-core", + "futures-task", + "futures-util", ] [[package]] -name = "icu_locale_core" -version = "2.2.0" +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "icu_normalizer" -version = "2.2.0" +name = "futures-sink" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] -name = "icu_normalizer_data" -version = "2.2.0" +name = "futures-task" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] -name = "icu_properties" -version = "2.2.0" +name = "futures-util" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", ] [[package]] -name = "icu_properties_data" -version = "2.2.0" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] [[package]] -name = "icu_provider" -version = "2.2.0" +name = "getrandom" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] -name = "id-set" -version = "0.2.2" +name = "getrandom" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9633fadf6346456cf8531119ba4838bc6d82ac4ce84d9852126dd2aa34d49264" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] [[package]] -name = "ident_case" -version = "1.0.1" +name = "getrandom" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] [[package]] -name = "idna" -version = "1.1.0" +name = "getrandom" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] -name = "idna_adapter" -version = "1.2.2" +name = "hashbrown" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] -name = "indexmap" -version = "2.14.0" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "inout" -version = "0.1.4" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "instant-acme" -version = "0.8.5" +name = "http" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f05ad37c421b962354c358d347d4a6130151df9407978372d3ad7f0c8f71a64" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ - "async-trait", - "aws-lc-rs", - "base64 0.22.1", "bytes", - "http 1.5.0", - "http-body 1.1.0", - "http-body-util", - "httpdate", - "hyper 1.11.0", - "hyper-rustls 0.27.9", - "hyper-util", - "rcgen", - "rustls 0.23.43", - "rustls-pki-types", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", + "itoa", ] [[package]] -name = "io-uring" -version = "0.7.13" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9080b15e63775b9a2ac7dca720f7050a8b955e092ea0f6020a4a80f69998cdc0" -dependencies = [ - "bindgen", - "bitflags", - "cfg-if", - "libc", -] +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "ipnet" -version = "2.12.0" +name = "indexmap" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] [[package]] name = "is_terminal_polyfill" @@ -2486,15 +832,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -2559,16 +896,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "jobserver" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" -dependencies = [ - "getrandom 0.4.3", - "libc", -] - [[package]] name = "js-sys" version = "0.3.103" @@ -2585,15 +912,6 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" @@ -2601,97 +919,18 @@ version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - [[package]] name = "libm" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" -[[package]] -name = "libredox" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" -dependencies = [ - "bitflags", - "libc", - "plain", - "redox_syscall 0.9.1", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libublk" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cc4f0d9771dc50a2807a495e80287911d1bf4871fad45663753692db7c432" -dependencies = [ - "async-lock", - "bitflags", - "bitmaps", - "derive_setters", - "futures-timer", - "io-uring", - "libc", - "libublk-rs-sys", - "log", - "serde", - "serde_json", - "slab", - "smol", - "thiserror 1.0.69", -] - -[[package]] -name = "libublk-rs-sys" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab204ac509937ddb9ca815e642e204f8944bb98c8f0dd613a7c2567c774e593" -dependencies = [ - "anyhow", - "bindgen", - "libc", - "regex", - "serde", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - [[package]] name = "lock_api" version = "0.4.14" @@ -2713,52 +952,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - [[package]] name = "memchr" version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2766,111 +965,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "mio" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "mirrord" -version = "0.3.0" -dependencies = [ - "anyhow", - "authz", - "axum", - "base64 0.22.1", - "biscuit-auth", - "blake3", - "clap", - "eventlog", - "prost 0.13.5", - "proto", - "runtime", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - -[[package]] -name = "nix" -version = "0.31.3" +name = "mio" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", "libc", - "memoffset", -] - -[[package]] -name = "noded" -version = "0.3.0" -dependencies = [ - "anyhow", - "authz", - "axum", - "base64 0.22.1", - "bytes", - "clap", - "controld", - "eventlog", - "hex", - "hub", - "nix 0.31.3", - "prost 0.13.5", - "proto", - "quinn", - "rand 0.8.7", - "rcgen", - "runtime", - "rustls 0.23.43", - "rustls-pemfile", - "rustls-platform-verifier", - "serde", - "serde_json", - "statemachines", - "store", - "tempfile", - "thiserror 2.0.19", - "tokio", - "tokio-rustls 0.26.4", - "tracing", - "userfaultfd", - "x509-parser", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] -name = "nohash-hasher" -version = "0.2.0" +name = "multimap" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "nom" @@ -2882,15 +991,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "num-bigint" version = "0.4.8" @@ -2901,22 +1001,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.7", - "smallvec", - "zeroize", -] - [[package]] name = "num-conv" version = "0.2.2" @@ -2932,16 +1016,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" -dependencies = [ - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -2949,37 +1023,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", -] - -[[package]] -name = "object_store" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cfccb68961a56facde1163f9319e0d15743352344e7808a11795fb99698dcaf" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bytes", - "chrono", - "futures", - "humantime", - "hyper 1.11.0", - "itertools 0.13.0", - "md-5", - "parking_lot", - "percent-encoding", - "quick-xml", - "rand 0.8.7", - "reqwest", - "ring", - "serde", - "serde_json", - "snafu", - "tokio", - "tracing", - "url", - "walkdir", ] [[package]] @@ -3015,18 +1058,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" -[[package]] -name = "outref" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.5" @@ -3045,7 +1076,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", "windows-link", ] @@ -3060,21 +1091,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - [[package]] name = "petgraph" version = "0.7.1" @@ -3085,44 +1101,12 @@ dependencies = [ "indexmap", ] -[[package]] -name = "pgtest" -version = "0.3.0" - [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - [[package]] name = "pkcs8" version = "0.10.2" @@ -3133,58 +1117,12 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", -] - [[package]] name = "portable-atomic" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -3364,16 +1302,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quinn" version = "0.11.11" @@ -3385,9 +1313,9 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.3", - "rustls 0.23.43", - "socket2 0.6.5", + "rustc-hash", + "rustls", + "socket2", "thiserror 2.0.19", "tokio", "tracing", @@ -3407,8 +1335,8 @@ dependencies = [ "rand 0.10.2", "rand_pcg", "ring", - "rustc-hash 2.1.3", - "rustls 0.23.43", + "rustc-hash", + "rustls", "rustls-pki-types", "rustls-platform-verifier", "slab", @@ -3427,7 +1355,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.5", + "socket2", "tracing", "windows-sys 0.61.2", ] @@ -3480,7 +1408,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "chacha20 0.10.1", + "chacha20", "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -3529,16 +1457,6 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand 0.8.7", -] - [[package]] name = "rand_pcg" version = "0.10.2" @@ -3563,7 +1481,6 @@ version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57f6d249aad744e274e682777a50283a225a32705394ee6d5fcc01efa25e4055" dependencies = [ - "aws-lc-rs", "pem", "ring", "rustls-pki-types", @@ -3584,24 +1501,19 @@ dependencies = [ "bytes", "clap", "clap_complete", - "controld", - "eventlog", "futures", - "hub", "prost 0.13.5", "proto", "quinn", "rcgen", - "runtime", - "rustls 0.23.43", + "rustls", "rustls-pemfile", "rustls-platform-verifier", "serde", "serde_json", - "store", "thiserror 2.0.19", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tokio-tungstenite", "tracing", ] @@ -3615,15 +1527,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "redox_syscall" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07507be7b4a5f9f26eeb41eeaebb1f5a7ff29dfb29739facc21d35bf8b11c21e" -dependencies = [ - "bitflags", -] - [[package]] name = "regex" version = "1.13.1" @@ -3647,60 +1550,12 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "regex-lite" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" - [[package]] name = "regex-syntax" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "h2 0.4.15", - "http 1.5.0", - "http-body 1.1.0", - "http-body-util", - "hyper 1.11.0", - "hyper-rustls 0.27.9", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.43", - "rustls-native-certs", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.26.4", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - [[package]] name = "ring" version = "0.17.14" @@ -3711,45 +1566,10 @@ dependencies = [ "cfg-if", "getrandom 0.2.17", "libc", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid 0.9.6", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "runtime" -version = "0.3.0" -dependencies = [ - "thiserror 2.0.19", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.3" @@ -3774,19 +1594,6 @@ dependencies = [ "nom", ] -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", -] - [[package]] name = "rustix" version = "1.1.4" @@ -3796,33 +1603,20 @@ dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.12.1", + "linux-raw-sys", "windows-sys 0.61.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ - "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.13", + "rustls-webpki", "subtle", "zeroize", ] @@ -3869,10 +1663,10 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.43", + "rustls", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.13", + "rustls-webpki", "security-framework", "security-framework-sys", "webpki-root-certs", @@ -3885,26 +1679,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - [[package]] name = "rustls-webpki" version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -3925,12 +1708,6 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - [[package]] name = "same-file" version = "1.0.6" @@ -3949,27 +1726,11 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted 0.9.0", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" @@ -4043,29 +1804,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "sha1" version = "0.10.7" @@ -4101,32 +1839,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "shlex" version = "2.0.1" @@ -4147,414 +1859,63 @@ dependencies = [ name = "signature" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "sim" -version = "0.3.0" -dependencies = [ - "anyhow", - "authz", - "base64 0.22.1", - "bytes", - "cas", - "eventlog", - "futures", - "hex", - "percent-encoding", - "proptest", - "prost 0.13.5", - "proto", - "rand 0.8.7", - "rand_chacha 0.3.1", - "statemachines", - "stateright", - "store", - "tokio", - "tracing", - "turmoil", -] - -[[package]] -name = "simd_cesu8" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" -dependencies = [ - "rustc_version", - "simdutf8", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" -dependencies = [ - "serde", -] - -[[package]] -name = "smol" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" -dependencies = [ - "async-channel", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite", -] - -[[package]] -name = "snafu" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e84b3f4eacbf3a1ce05eac6763b4d629d60cbc94d632e4092c54ade71f1e1a2" -dependencies = [ - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "spin" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "sqlx" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" -dependencies = [ - "base64 0.22.1", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashbrown 0.15.5", - "hashlink", - "indexmap", - "log", - "memchr", - "once_cell", - "percent-encoding", - "rustls 0.23.43", - "serde", - "serde_json", - "sha2 0.10.9", - "smallvec", - "thiserror 2.0.19", - "tokio", - "tokio-stream", - "tracing", - "url", - "webpki-roots 0.26.11", -] - -[[package]] -name = "sqlx-macros" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 2.0.119", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2 0.10.9", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 2.0.119", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" -dependencies = [ - "atoi", - "base64 0.22.1", - "bitflags", - "byteorder", - "bytes", - "chrono", - "crc", - "digest 0.10.7", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac 0.12.1", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand 0.8.7", - "rsa", - "serde", - "sha1", - "sha2 0.10.9", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.19", - "tracing", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" -dependencies = [ - "atoi", - "base64 0.22.1", - "bitflags", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-util", - "hex", - "hkdf", - "hmac 0.12.1", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand 0.8.7", - "serde", - "serde_json", - "sha2 0.10.9", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror 2.0.19", - "tracing", - "whoami", +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", ] [[package]] -name = "sqlx-sqlite" -version = "0.8.6" +name = "simd_cesu8" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "serde_urlencoded", - "sqlx-core", - "thiserror 2.0.19", - "tracing", - "url", + "rustc_version", + "simdutf8", ] [[package]] -name = "stable_deref_trait" -version = "1.2.1" +name = "simdutf8" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] -name = "statemachines" -version = "0.3.0" -dependencies = [ - "proptest", - "serde", - "serde_json", - "thiserror 2.0.19", -] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] -name = "stateright" -version = "0.31.0" +name = "smallvec" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1157f21b11916f90fe1f2ac9a8d0e09a8813b28701584141060f414eedf6ba" -dependencies = [ - "ahash", - "choice", - "crossbeam-utils", - "dashmap", - "id-set", - "log", - "nohash-hasher", - "parking_lot", - "rand 0.9.5", - "serde", - "serde_json", - "tiny_http", -] +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] -name = "store" -version = "0.3.0" +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ - "aws-credential-types", - "aws-sdk-kms", - "aws-types", - "base64 0.22.1", - "blake3", - "bytes", - "cas", - "chacha20poly1305", - "eventlog", - "futures", - "hex", - "object_store", - "proto", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "stringprep" -version = "0.1.5" +name = "spki" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", + "base64ct", + "der", ] [[package]] @@ -4602,15 +1963,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - [[package]] name = "synstructure" version = "0.13.2" @@ -4631,7 +1983,7 @@ dependencies = [ "fastrand", "getrandom 0.4.3", "once_cell", - "rustix 1.1.4", + "rustix", "windows-sys 0.61.2", ] @@ -4675,15 +2027,6 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "thread_local" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" -dependencies = [ - "cfg-if", -] - [[package]] name = "time" version = "0.3.54" @@ -4714,28 +2057,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny_http" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" -dependencies = [ - "ascii", - "chunked_transfer", - "httpdate", - "log", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tinyvec" version = "1.12.0" @@ -4763,7 +2084,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.5", + "socket2", "tokio-macros", "windows-sys 0.61.2", ] @@ -4779,34 +2100,13 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.43", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" -dependencies = [ - "futures-core", - "pin-project-lite", + "rustls", "tokio", ] @@ -4818,87 +2118,14 @@ checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" dependencies = [ "futures-util", "log", - "rustls 0.23.43", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tungstenite", "webpki-roots 0.26.11", ] -[[package]] -name = "tokio-util" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-vsock" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b319ef9394889dab2e1b4f0085b45ba11d0c79dc9d1a9d1afc057d009d0f1c7" -dependencies = [ - "bytes", - "futures", - "libc", - "tokio", - "vsock", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http 1.5.0", - "http-body 1.1.0", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" version = "0.1.44" @@ -4929,44 +2156,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "tungstenite" version = "0.24.0" @@ -4976,175 +2167,52 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.5.0", + "http", "httparse", "log", "rand 0.8.7", - "rustls 0.23.43", + "rustls", "rustls-pki-types", "sha1", "thiserror 1.0.69", - "utf-8", -] - -[[package]] -name = "turmoil" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f0d6c134ef37268c94d50fb74252af1c34c5c88389e2c1af85654da944ceb52" -dependencies = [ - "bytes", - "indexmap", - "rand 0.8.7", - "rand_distr", - "scoped-tls", - "tokio", - "tracing", -] - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-normalization" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common 0.1.7", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "userfaultfd" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3a8a0cb358f7d1b7ee9b6784be122b6f51248a6d9e214d555beb9b44c72aea" -dependencies = [ - "bitflags", - "cfg-if", - "libc", - "nix 0.27.1", - "thiserror 1.0.69", - "userfaultfd-sys", -] - -[[package]] -name = "userfaultfd-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc91d95a797a81604af22946d0e86656f27feb0b9665c60665cf3554df12d1a8" -dependencies = [ - "bindgen", - "cc", - "cfg-if", + "utf-8", ] [[package]] -name = "utf-8" -version = "0.7.6" +name = "typenum" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] -name = "utf8_iter" -version = "1.0.4" +name = "unarray" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] -name = "utf8parse" -version = "0.2.2" +name = "unicode-ident" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] -name = "uuid" -version = "1.24.0" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" -dependencies = [ - "js-sys", - "wasm-bindgen", -] +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "valuable" -version = "0.1.1" +name = "utf-8" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "vcpkg" -version = "0.2.15" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "version_check" @@ -5152,22 +2220,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - -[[package]] -name = "vsock" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba782755fc073877e567c2253c0be48e4aa9a254c232d36d3985dfae0bd5205" -dependencies = [ - "libc", - "nix 0.31.3", -] - [[package]] name = "wait-timeout" version = "0.2.1" @@ -5187,15 +2239,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -5217,12 +2260,6 @@ dependencies = [ "wit-bindgen", ] -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - [[package]] name = "wasm-bindgen" version = "0.2.126" @@ -5236,16 +2273,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.126" @@ -5278,29 +2305,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "web-time" version = "1.1.0" @@ -5338,28 +2342,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - -[[package]] -name = "whoami" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" -dependencies = [ - "libredox", - "wasite", -] - [[package]] name = "winapi-util" version = "0.1.11" @@ -5369,81 +2351,19 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5455,67 +2375,34 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5528,48 +2415,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -5582,34 +2445,6 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "workspaced" -version = "0.3.0" -dependencies = [ - "anyhow", - "base64 0.22.1", - "blake3", - "clap", - "eventlog", - "hex", - "nix 0.31.3", - "prost 0.13.5", - "proto", - "runtime", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", - "tokio-vsock", - "tracing", -] - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - [[package]] name = "x509-parser" version = "0.18.1" @@ -5617,7 +2452,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" dependencies = [ "asn1-rs", - "aws-lc-rs", "data-encoding", "der-parser", "lazy_static", @@ -5629,12 +2463,6 @@ dependencies = [ "time", ] -[[package]] -name = "xmlparser" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" - [[package]] name = "yasna" version = "0.6.0" @@ -5645,29 +2473,6 @@ dependencies = [ "time", ] -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.8.55" @@ -5688,96 +2493,14 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - [[package]] name = "zeroize" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "zmij" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/README.md b/README.md index 9965bb4..f3c8dcc 100644 --- a/README.md +++ b/README.md @@ -11,17 +11,27 @@ With Homebrew on Apple silicon macOS or x86_64/arm64 Linux: brew install reachpad/tap/reachpad ``` +With npm, anywhere Node 18+ runs: + +```sh +npm install -g @reachpad/cli +``` + Or with the checksum-verifying installer: ```sh curl -fsSL https://reachpad.dev/install | sh ``` -Linux x86_64/arm64 (musl, static) and macOS arm64. The script fetches the -latest release from this repository, verifies its checksum against +Linux x86_64/arm64 (musl, static) and macOS arm64/x86_64. The script fetches +the latest release from this repository, verifies its checksum against SHA256SUMS, and installs to `~/.local/bin/reachpad` (override with `REACHPAD_INSTALL_DIR`). +All three deliver the same binary. `@reachpad/cli` is a launcher around it, not +a second implementation — see [`npm/README.md`](npm/README.md), which also +explains the macOS quarantine problem npm sidesteps. + ## Get started Run Reachpad: @@ -60,8 +70,10 @@ reachpad completions fish ``` `reachpad update` respects how Reachpad was installed: Homebrew installs are -directed to `brew upgrade reachpad`, while installer-managed binaries -are updated in place after the release checksum is verified. +directed to `brew upgrade reachpad` and npm installs to `npm install -g +@reachpad/cli@latest`, while installer-managed binaries are updated in place +after the release checksum is verified. Whoever installed the binary owns it — +a second writer is how a working install becomes a broken one. Docs: [reachpad.dev/docs/cli](https://reachpad.dev/docs/cli) diff --git a/greentree.yaml b/greentree.yaml index 0ea417f..7ff281a 100644 --- a/greentree.yaml +++ b/greentree.yaml @@ -12,3 +12,12 @@ checks: run: shellcheck install.sh && sh -n install.sh required_for_publish: true watch: false + # The npm distribution. No build and no network: it checks that the four + # descriptions of the same platform list still agree (release.yml's matrix, + # npm/prepare.mjs, the launcher's lookup table, and @reachpad/cli's optional + # dependencies), and runs the launcher as a real child process for the three + # things a wrapper can silently break — exit codes, signals, and the tty. + npm: + run: node --test npm/test/*.test.mjs + required_for_publish: true + watch: false diff --git a/npm/README.md b/npm/README.md new file mode 100644 index 0000000..2e057a6 --- /dev/null +++ b/npm/README.md @@ -0,0 +1,85 @@ +# The npm distribution + +Five packages, published by `.github/workflows/release.yml` on every `cli-v*` +tag, carrying the same binaries as the GitHub release: + +| Directory | Package | Contents | +| --- | --- | --- | +| `cli/` | `@reachpad/cli` | the `reachpad` launcher, and the only one anybody installs | +| `darwin-arm64/` | `@reachpad/cli-darwin-arm64` | `bin/reachpad` for `aarch64-apple-darwin` | +| `darwin-x64/` | `@reachpad/cli-darwin-x64` | `bin/reachpad` for `x86_64-apple-darwin` | +| `linux-x64/` | `@reachpad/cli-linux-x64` | `bin/reachpad` for `x86_64-unknown-linux-musl` | +| `linux-arm64/` | `@reachpad/cli-linux-arm64` | `bin/reachpad` for `aarch64-unknown-linux-musl` | + +## Why this exists + +**Gatekeeper.** Release binaries are ad-hoc signed by the linker, not +Developer ID signed and notarized. Ad-hoc is enough to *execute* on Apple +silicon, so the curl installer and the Homebrew formula both work. It is not +enough for anything that stamps `com.apple.quarantine` — a browser download +from the releases page hits "Apple could not verify reachpad is free of +malware", and so did the Homebrew *cask* we shipped until 2026-08-13, because +casks quarantine everything they stage. npm never sets that attribute. + +The durable fix is notarization, and `release.yml` has the step waiting behind +six repository secrets. This directory is the fix that needed no Apple account. + +**Node is already installed** on machines that run coding agents, and +`npx @reachpad/cli` needs no install at all. + +## Parity + +There is nothing to keep in parity. `@reachpad/cli` contains no +reimplementation of any verb: `bin/reachpad.js` resolves the platform package +and execs the same Rust binary every other install path delivers. Verbs, flags, +exit codes and output are identical because they are the same program. + +The launcher is only allowed to get three things wrong, and each has a test in +`test/packages.test.mjs` that runs a real child process: + +- **exit codes** — `reachpad run` exits with the *guest's* status, so a wrapper + that returns its own breaks every `&&` in every script. +- **signals** — a guest killed by `SIGTERM` must make the launcher die of + `SIGTERM`, not `exit 1`. +- **the terminal** — stdio is inherited, never piped, or `reachpad attach` + gets a non-tty and raw mode has nothing to put in raw mode. + +## Versions + +Every `package.json` here carries `0.0.0-dev`. The real version comes from the +tag: `npm/prepare.mjs --version ` stamps all five manifests and the +exact pins in `optionalDependencies`, then unpacks each release tarball into +its platform package after checking the release's own SHA256 and reading the +object header back to confirm it is the architecture it claims. + +A version committed here instead would drift the first time somebody bumped +the Rust workspace and not this directory — and the drift is invisible until a +user installs a CLI whose `--version` disagrees with the package they asked +for. + +```sh +node --test npm/test/*.test.mjs # the whole suite, no network, no build +``` + +## First publish (one-time, manual) + +npm Trusted Publishing (OIDC) is how these packages are published — there is no +npm token in this repository, exactly as in `Reachpad/reachpad-mcp`. But a +trusted publisher can only be configured on a package that already exists, so +the very first version of each of the five has to be pushed by hand: + +```sh +git checkout cli-v +gh release download cli-v --dir /tmp/rp-assets +node npm/prepare.mjs --version --artifacts /tmp/rp-assets +for d in darwin-arm64 darwin-x64 linux-x64 linux-arm64 cli; do npm publish "npm/$d"; done +``` + +Then, at npmjs.com, for **each** of the five packages: + +> Settings → Trusted Publisher → GitHub Actions +> org `Reachpad` · repo `reachpad-cli` · workflow `release.yml` · environment blank + +After that every `cli-v*` tag publishes on its own, and the publish step is +idempotent: a version already on npm is skipped, so a tag whose fourth publish +failed can simply be re-run. diff --git a/npm/cli/README.md b/npm/cli/README.md new file mode 100644 index 0000000..987dd27 --- /dev/null +++ b/npm/cli/README.md @@ -0,0 +1,93 @@ +# @reachpad/cli + +Durable cloud workspaces for coding agents. Create one, run commands in it, +pause it, fork it from its last save. + +```sh +npm install -g @reachpad/cli +reachpad +``` + +The guided first run signs you in through WorkOS and lists your workspaces. + +## Why npm + +This package contains no JavaScript implementation of anything. It is a +launcher for the same Rust binary that `brew install reachpad/tap/reachpad` +and `curl -fsSL https://reachpad.dev/install | sh` put on your PATH — same +verbs, same flags, same exit codes, because it is the same executable. + +npm is here for two reasons: + +- **No Gatekeeper dialog on macOS.** Our release binaries are ad-hoc signed, + not notarized, so macOS blocks them whenever a download stamps them with + `com.apple.quarantine` — which a browser download from the releases page + does. npm never sets that attribute, so an `npm install` binary just runs. +- **Node is already there.** On a machine that runs coding agents, it is one + command with no new toolchain. + +The binary arrives as a platform-specific optional dependency +(`@reachpad/cli-darwin-arm64` and friends), so it survives `--ignore-scripts`, +it is pinned by integrity hash in your lockfile, and it installs offline from a +warm cache. + +## Use it without installing + +```sh +npx @reachpad/cli create --name scratch +npx @reachpad/cli run scratch -- cargo test +``` + +## The surface + +``` +reachpad create [name] make a workspace, print its id +reachpad list your workspaces and what each is doing +reachpad status state, save, lease, limits (--wait to block) +reachpad run -- run one command, waking a paused workspace +reachpad pause save disk and memory, stop the meter +reachpad fork branch new workspaces from the last save +reachpad archive free the slot; deletes nothing +reachpad events live event stream + +reachpad auth login|whoami|logout +reachpad keys mint|list|revoke rpak1 keys for agents and CI +reachpad doctor check this installation +reachpad update update the way you installed +reachpad completions bash|zsh|fish +``` + +`--json` on any command prints one JSON object instead of prose, and +`REACHPAD_JSON=1` sets it for a whole session. `reachpad run` without `--json` +is byte-exact: guest stdout to stdout, guest stderr to stderr, and this process +exits with the guest's own exit code. + +## Updating + +```sh +npm install -g @reachpad/cli@latest +``` + +`reachpad update` knows it was installed by npm and prints that command rather +than writing into `node_modules` behind npm's back. + +## Platforms + +| Platform | Arch | Package | +| --- | --- | --- | +| macOS | Apple silicon | `@reachpad/cli-darwin-arm64` | +| macOS | Intel | `@reachpad/cli-darwin-x64` | +| Linux | x86-64 | `@reachpad/cli-linux-x64` | +| Linux | arm64 | `@reachpad/cli-linux-arm64` | + +Linux builds are static musl binaries, so they run on glibc and musl distros +alike. Windows is not a target yet; use WSL, or open an issue. + +## Source + +The full CLI source is public at +[Reachpad/reachpad-cli](https://github.com/Reachpad/reachpad-cli), and the +binaries in these packages are built from that source by its release workflow +on GitHub's runners — tag to readable source to workflow run to `SHA256SUMS`. + +Docs: diff --git a/npm/cli/bin/reachpad.js b/npm/cli/bin/reachpad.js new file mode 100644 index 0000000..cfe295a --- /dev/null +++ b/npm/cli/bin/reachpad.js @@ -0,0 +1,56 @@ +#!/usr/bin/env node +// The `reachpad` command, when reachpad was installed from npm. +// +// This is a launcher and nothing else. Every verb, flag and exit code belongs +// to the Rust binary in the platform package — there is no second +// implementation to drift, which is the entire reason this package exists in +// this shape. +// +// Three properties the CLI depends on, and how each is kept: +// +// exit codes `reachpad run` exits with the GUEST's exit code, so a wrapper +// that returns its own status silently breaks every `&&` in +// every script. The child's status is propagated verbatim, and +// a child killed by a signal re-raises that signal here so the +// calling shell sees `Terminated`, not `exit 1`. +// the terminal `reachpad attach` puts the tty in raw mode. stdio is +// inherited, never piped: a pipe would hand the guest a +// non-tty and turn an interactive session into a dead prompt. +// signals Ctrl-C must reach the guest, not kill the launcher out from +// under it. The no-op handlers below stop Node's default +// terminate-on-SIGINT; the child shares this process group, so +// the terminal delivers the signal to it directly and we still +// get to report how it died. + +"use strict"; + +const { spawnSync } = require("child_process"); +const { resolveBinary } = require("../lib/binary.js"); + +let binary; +try { + binary = resolveBinary(); +} catch (error) { + process.stderr.write(error.message + "\n"); + process.exit(1); +} + +for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) { + process.on(signal, () => {}); +} + +const result = spawnSync(binary, process.argv.slice(2), { stdio: "inherit" }); + +if (result.error) { + process.stderr.write(`reachpad: cannot run ${binary}: ${result.error.message}\n`); + process.exit(1); +} + +if (result.signal) { + // Die the way the child died. Restoring the default disposition first is + // what makes this a death rather than a no-op against our own handler. + process.removeAllListeners(result.signal); + process.kill(process.pid, result.signal); +} + +process.exit(result.status === null ? 1 : result.status); diff --git a/npm/cli/lib/binary.js b/npm/cli/lib/binary.js new file mode 100644 index 0000000..2f1e5e0 --- /dev/null +++ b/npm/cli/lib/binary.js @@ -0,0 +1,91 @@ +// Where the real CLI is. `@reachpad/cli` ships no code of its own: it resolves +// the one platform package npm installed for this machine and hands over. +// +// The binary rides in optionalDependencies rather than a postinstall download, +// and that choice is the whole design: +// +// - `npm ci --ignore-scripts` is the default posture of every hardened CI +// runner and of most agent sandboxes. A postinstall downloader is simply +// absent there; an optional dependency is already unpacked. +// - The lockfile pins the binary's integrity hash, so the bytes are the same +// on every machine and every replay of a build. +// - It works offline from a warm cache. +// +// The cost is that npm resolves optional deps by `os`/`cpu` and says nothing +// when it skips them all, so an unsupported platform surfaces here — which is +// why the failure below is a paragraph and not a MODULE_NOT_FOUND stack. + +"use strict"; + +// One row per release target. This table and the `release.yml` build matrix +// are the same list said twice; `npm/test/packages.test.mjs` fails when they +// stop agreeing, because the way this breaks in production is a new target +// that ships tarballs nobody can install. +const PACKAGES = { + "darwin arm64": "@reachpad/cli-darwin-arm64", + "darwin x64": "@reachpad/cli-darwin-x64", + "linux x64": "@reachpad/cli-linux-x64", + "linux arm64": "@reachpad/cli-linux-arm64", +}; + +/** The platform package for a given `process.platform`/`process.arch` pair. */ +function packageFor(platform, arch) { + return PACKAGES[`${platform} ${arch}`]; +} + +/** Every package this release publishes, for the CI cross-check. */ +function allPackages() { + return Object.values(PACKAGES); +} + +/** + * The path of the `reachpad` executable, or a thrown error whose message tells + * the reader what to do next. + * + * `resolve` is injected so the tests can drive both failure shapes without + * uninstalling anything. + */ +function resolveBinary( + platform = process.platform, + arch = process.arch, + resolve = (specifier) => require.resolve(specifier) +) { + const pkg = packageFor(platform, arch); + if (!pkg) { + throw new Error(unsupportedPlatform(platform, arch)); + } + try { + return resolve(`${pkg}/bin/reachpad`); + } catch { + throw new Error(missingPackage(pkg)); + } +} + +function unsupportedPlatform(platform, arch) { + return [ + `reachpad: no prebuilt binary for ${platform}/${arch}.`, + "", + "Supported: " + Object.keys(PACKAGES).join(", ") + ".", + "Windows is not a target yet — run the CLI inside WSL, or tell us you need", + "it at https://github.com/Reachpad/reachpad-cli/issues.", + ].join("\n"); +} + +// The reachable causes, in the order they actually happen. `--omit=optional` +// is first because it is the one a person types on purpose and then forgets. +function missingPackage(pkg) { + return [ + `reachpad: ${pkg} is not installed, so there is no binary to run.`, + "", + "This package carries the CLI itself as an optional dependency. It goes", + "missing when the install skipped optional dependencies:", + "", + " npm install -g @reachpad/cli # not --omit=optional, not --no-optional", + "", + "If that does not fix it, install without npm at all:", + "", + " curl -fsSL https://reachpad.dev/install | sh", + ].join("\n"); +} + +module.exports = { PACKAGES, packageFor, allPackages, resolveBinary }; diff --git a/npm/cli/package.json b/npm/cli/package.json new file mode 100644 index 0000000..01c76ba --- /dev/null +++ b/npm/cli/package.json @@ -0,0 +1,47 @@ +{ + "name": "@reachpad/cli", + "version": "0.0.0-dev", + "description": "Run coding agents in durable cloud workspaces. The Reachpad CLI, installable with npm.", + "license": "UNLICENSED", + "homepage": "https://reachpad.dev/docs/cli", + "repository": { + "type": "git", + "url": "git+https://github.com/Reachpad/reachpad-cli.git", + "directory": "npm/cli" + }, + "bugs": { + "url": "https://github.com/Reachpad/reachpad-cli/issues" + }, + "bin": { + "reachpad": "bin/reachpad.js" + }, + "files": [ + "bin", + "lib", + "README.md" + ], + "keywords": [ + "reachpad", + "cli", + "coding-agents", + "development-environment", + "cloud-development-environment", + "sandbox", + "agent-infrastructure" + ], + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public" + }, + "optionalDependencies": { + "@reachpad/cli-darwin-arm64": "0.0.0-dev", + "@reachpad/cli-darwin-x64": "0.0.0-dev", + "@reachpad/cli-linux-arm64": "0.0.0-dev", + "@reachpad/cli-linux-x64": "0.0.0-dev" + }, + "scripts": { + "test": "node --test ../test/*.test.mjs" + } +} diff --git a/npm/darwin-arm64/README.md b/npm/darwin-arm64/README.md new file mode 100644 index 0000000..e355342 --- /dev/null +++ b/npm/darwin-arm64/README.md @@ -0,0 +1,11 @@ +# @reachpad/cli-darwin-arm64 + +The [reachpad](https://reachpad.dev/docs/cli) CLI binary for macOS on Apple silicon, +built from public source for the `aarch64-apple-darwin` target. + +This package exists so that `npm install -g @reachpad/cli` fetches one +binary instead of four. Install that instead: + +```sh +npm install -g @reachpad/cli +``` diff --git a/npm/darwin-arm64/package.json b/npm/darwin-arm64/package.json new file mode 100644 index 0000000..0c3e132 --- /dev/null +++ b/npm/darwin-arm64/package.json @@ -0,0 +1,32 @@ +{ + "name": "@reachpad/cli-darwin-arm64", + "version": "0.0.0-dev", + "description": "The reachpad CLI binary for macOS on Apple silicon. Installed automatically by @reachpad/cli; do not depend on it directly.", + "license": "UNLICENSED", + "homepage": "https://reachpad.dev/docs/cli", + "repository": { + "type": "git", + "url": "git+https://github.com/Reachpad/reachpad-cli.git", + "directory": "npm/darwin-arm64" + }, + "bugs": { + "url": "https://github.com/Reachpad/reachpad-cli/issues" + }, + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "files": [ + "bin" + ], + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public" + }, + "preferUnplugged": true, + "reachpadTarget": "aarch64-apple-darwin" +} diff --git a/npm/darwin-x64/README.md b/npm/darwin-x64/README.md new file mode 100644 index 0000000..6cb505c --- /dev/null +++ b/npm/darwin-x64/README.md @@ -0,0 +1,11 @@ +# @reachpad/cli-darwin-x64 + +The [reachpad](https://reachpad.dev/docs/cli) CLI binary for macOS on Intel, +built from public source for the `x86_64-apple-darwin` target. + +This package exists so that `npm install -g @reachpad/cli` fetches one +binary instead of four. Install that instead: + +```sh +npm install -g @reachpad/cli +``` diff --git a/npm/darwin-x64/package.json b/npm/darwin-x64/package.json new file mode 100644 index 0000000..6078a65 --- /dev/null +++ b/npm/darwin-x64/package.json @@ -0,0 +1,32 @@ +{ + "name": "@reachpad/cli-darwin-x64", + "version": "0.0.0-dev", + "description": "The reachpad CLI binary for macOS on Intel. Installed automatically by @reachpad/cli; do not depend on it directly.", + "license": "UNLICENSED", + "homepage": "https://reachpad.dev/docs/cli", + "repository": { + "type": "git", + "url": "git+https://github.com/Reachpad/reachpad-cli.git", + "directory": "npm/darwin-x64" + }, + "bugs": { + "url": "https://github.com/Reachpad/reachpad-cli/issues" + }, + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "files": [ + "bin" + ], + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public" + }, + "preferUnplugged": true, + "reachpadTarget": "x86_64-apple-darwin" +} diff --git a/npm/linux-arm64/README.md b/npm/linux-arm64/README.md new file mode 100644 index 0000000..d7bf35f --- /dev/null +++ b/npm/linux-arm64/README.md @@ -0,0 +1,11 @@ +# @reachpad/cli-linux-arm64 + +The [reachpad](https://reachpad.dev/docs/cli) CLI binary for Linux on arm64, +built from public source for the `aarch64-unknown-linux-musl` target. + +This package exists so that `npm install -g @reachpad/cli` fetches one +binary instead of four. Install that instead: + +```sh +npm install -g @reachpad/cli +``` diff --git a/npm/linux-arm64/package.json b/npm/linux-arm64/package.json new file mode 100644 index 0000000..6c9b39a --- /dev/null +++ b/npm/linux-arm64/package.json @@ -0,0 +1,32 @@ +{ + "name": "@reachpad/cli-linux-arm64", + "version": "0.0.0-dev", + "description": "The reachpad CLI binary for Linux on arm64. Installed automatically by @reachpad/cli; do not depend on it directly.", + "license": "UNLICENSED", + "homepage": "https://reachpad.dev/docs/cli", + "repository": { + "type": "git", + "url": "git+https://github.com/Reachpad/reachpad-cli.git", + "directory": "npm/linux-arm64" + }, + "bugs": { + "url": "https://github.com/Reachpad/reachpad-cli/issues" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "files": [ + "bin" + ], + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public" + }, + "preferUnplugged": true, + "reachpadTarget": "aarch64-unknown-linux-musl" +} diff --git a/npm/linux-x64/README.md b/npm/linux-x64/README.md new file mode 100644 index 0000000..418c33b --- /dev/null +++ b/npm/linux-x64/README.md @@ -0,0 +1,11 @@ +# @reachpad/cli-linux-x64 + +The [reachpad](https://reachpad.dev/docs/cli) CLI binary for Linux on x86-64, +built from public source for the `x86_64-unknown-linux-musl` target. + +This package exists so that `npm install -g @reachpad/cli` fetches one +binary instead of four. Install that instead: + +```sh +npm install -g @reachpad/cli +``` diff --git a/npm/linux-x64/package.json b/npm/linux-x64/package.json new file mode 100644 index 0000000..b0903a2 --- /dev/null +++ b/npm/linux-x64/package.json @@ -0,0 +1,32 @@ +{ + "name": "@reachpad/cli-linux-x64", + "version": "0.0.0-dev", + "description": "The reachpad CLI binary for Linux on x86-64. Installed automatically by @reachpad/cli; do not depend on it directly.", + "license": "UNLICENSED", + "homepage": "https://reachpad.dev/docs/cli", + "repository": { + "type": "git", + "url": "git+https://github.com/Reachpad/reachpad-cli.git", + "directory": "npm/linux-x64" + }, + "bugs": { + "url": "https://github.com/Reachpad/reachpad-cli/issues" + }, + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "files": [ + "bin" + ], + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public" + }, + "preferUnplugged": true, + "reachpadTarget": "x86_64-unknown-linux-musl" +} diff --git a/npm/prepare.mjs b/npm/prepare.mjs new file mode 100644 index 0000000..b8323f7 --- /dev/null +++ b/npm/prepare.mjs @@ -0,0 +1,164 @@ +// Turn the release tarballs into publishable npm packages. +// +// node npm/prepare.mjs --version 0.3.0 --artifacts /path/to/release/assets +// +// Two jobs, both of which exist because the alternative is a silent wrong +// answer: +// +// version The repo carries `0.0.0-dev` in every package.json. The real +// version comes from the git tag, stamped here into all five +// manifests AND into the exact pins in optionalDependencies. A +// version committed to the repo instead would drift the day +// someone bumps the Rust workspace and not this directory, and +// the drift is invisible until a user installs a CLI whose +// `--version` disagrees with the package they asked for. +// +// staging Each platform package gets `bin/reachpad` unpacked from the +// matching release tarball, after its SHA256 is checked against +// the release's own SHA256SUMS. The unpacked file is then read +// back and its object header compared to the platform it claims: +// a matrix mix-up that ships the arm64 binary to Intel Macs is +// the failure this catches, and it is one that no test outside +// that machine would ever hit. + +import { createHash } from "node:crypto"; +import { execFileSync } from "node:child_process"; +import { mkdirSync, readFileSync, readdirSync, writeFileSync, chmodSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const HERE = dirname(fileURLToPath(import.meta.url)); + +/** The five packages, and what each platform one must contain. */ +export const PLATFORMS = [ + { dir: "darwin-arm64", target: "aarch64-apple-darwin", format: "macho", machine: "arm64" }, + { dir: "darwin-x64", target: "x86_64-apple-darwin", format: "macho", machine: "x86_64" }, + { dir: "linux-x64", target: "x86_64-unknown-linux-musl", format: "elf", machine: "x86_64" }, + { dir: "linux-arm64", target: "aarch64-unknown-linux-musl", format: "elf", machine: "arm64" }, +]; + +export const PACKAGE_DIRS = ["cli", ...PLATFORMS.map((p) => p.dir)]; + +/** + * Read an executable's header and say which (format, machine) it is really + * for. Returns null for anything that is not an object file at all — which is + * what a downloaded HTML error page looks like. + */ +export function identify(bytes) { + if (bytes.length < 20) return null; + // ELF: 0x7f 'E' 'L' 'F', then e_machine at offset 18 (little-endian here; + // every target we ship is LE). + if (bytes[0] === 0x7f && bytes[1] === 0x45 && bytes[2] === 0x4c && bytes[3] === 0x46) { + const machine = bytes.readUInt16LE(18); + if (machine === 0x3e) return { format: "elf", machine: "x86_64" }; + if (machine === 0xb7) return { format: "elf", machine: "arm64" }; + return { format: "elf", machine: `unknown(${machine})` }; + } + // Mach-O 64-bit little-endian (MH_MAGIC_64), cputype in the next word. + if (bytes.readUInt32LE(0) === 0xfeedfacf) { + const cputype = bytes.readUInt32LE(4); + if (cputype === 0x01000007) return { format: "macho", machine: "x86_64" }; + if (cputype === 0x0100000c) return { format: "macho", machine: "arm64" }; + return { format: "macho", machine: `unknown(${cputype})` }; + } + return null; +} + +/** ` ` lines, as `shasum -a 256` writes them. */ +export function parseChecksums(text) { + const sums = new Map(); + for (const line of text.split("\n")) { + const match = line.match(/^([0-9a-f]{64})\s+\*?(\S+)$/); + if (match) sums.set(match[2], match[1]); + } + return sums; +} + +/** Stamp `version` through one package.json's own version and its exact pins. */ +export function stampManifest(manifest, version) { + const stamped = { ...manifest, version }; + if (stamped.optionalDependencies) { + stamped.optionalDependencies = Object.fromEntries( + Object.entries(stamped.optionalDependencies).map(([name, pin]) => + name.startsWith("@reachpad/cli-") ? [name, version] : [name, pin] + ) + ); + } + return stamped; +} + +function stampVersions(version) { + for (const dir of PACKAGE_DIRS) { + const path = join(HERE, dir, "package.json"); + const manifest = JSON.parse(readFileSync(path, "utf8")); + writeFileSync(path, JSON.stringify(stampManifest(manifest, version), null, 2) + "\n"); + } + console.log(`version ${version} stamped into ${PACKAGE_DIRS.length} manifests`); +} + +function stageBinaries(artifacts) { + const names = readdirSync(artifacts); + const sums = new Map(); + for (const name of names) { + if (name === "SHA256SUMS" || name.endsWith(".sha256")) { + for (const [file, sum] of parseChecksums(readFileSync(join(artifacts, name), "utf8"))) { + sums.set(file, sum); + } + } + } + + for (const platform of PLATFORMS) { + const asset = `reachpad-${platform.target}.tar.gz`; + const tarball = join(artifacts, asset); + const expected = sums.get(asset); + if (!expected) { + throw new Error( + `${asset} has no SHA256SUMS entry. Publishing an unverified binary is ` + + `worse than not publishing: the release's own checksum file is the ` + + `only thing tying these bytes to that workflow run.` + ); + } + const bytes = readFileSync(tarball); + const actual = createHash("sha256").update(bytes).digest("hex"); + if (actual !== expected) { + throw new Error(`${asset} checksum mismatch\n expected ${expected}\n got ${actual}`); + } + + const bin = join(HERE, platform.dir, "bin"); + mkdirSync(bin, { recursive: true }); + execFileSync("tar", ["xzf", tarball, "-C", bin, "reachpad"]); + chmodSync(join(bin, "reachpad"), 0o755); + + const header = readFileSync(join(bin, "reachpad")).subarray(0, 64); + const found = identify(header); + if (!found || found.format !== platform.format || found.machine !== platform.machine) { + throw new Error( + `${platform.dir} was staged with the wrong binary: expected ` + + `${platform.format}/${platform.machine}, found ` + + `${found ? `${found.format}/${found.machine}` : "not an object file"}` + ); + } + console.log(`staged ${platform.dir}: ${asset} (${found.format}/${found.machine})`); + } +} + +function main(argv) { + const args = new Map(); + for (let i = 0; i < argv.length; i += 2) args.set(argv[i], argv[i + 1]); + const version = args.get("--version"); + const artifacts = args.get("--artifacts"); + if (!version || !artifacts) { + console.error("usage: node npm/prepare.mjs --version --artifacts "); + process.exit(2); + } + if (!/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version)) { + console.error(`refusing to publish "${version}": not a semver release version`); + process.exit(2); + } + stampVersions(version); + stageBinaries(artifacts); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + main(process.argv.slice(2)); +} diff --git a/npm/test/packages.test.mjs b/npm/test/packages.test.mjs new file mode 100644 index 0000000..0eeb49a --- /dev/null +++ b/npm/test/packages.test.mjs @@ -0,0 +1,259 @@ +// What this suite is defending: the npm packages are a DISTRIBUTION of the +// Rust binary, so almost nothing here is about behaviour. It is about the four +// lists that describe the same set of platforms staying the same list — the +// release matrix, the staging table, the launcher's lookup, and the optional +// dependencies — plus the two things a launcher can get wrong that no unit +// test of the CLI would ever notice: exit codes and signals. + +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { execFileSync, spawnSync } from "node:child_process"; +import { createRequire } from "node:module"; +import { cpSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync, chmodSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { PLATFORMS, PACKAGE_DIRS, identify, parseChecksums, stampManifest } from "../prepare.mjs"; + +const NPM_DIR = dirname(dirname(fileURLToPath(import.meta.url))); +const REPO = dirname(NPM_DIR); +const require = createRequire(import.meta.url); +const { PACKAGES, packageFor, resolveBinary } = require("../cli/lib/binary.js"); + +const manifest = (dir) => JSON.parse(readFileSync(join(NPM_DIR, dir, "package.json"), "utf8")); + +test("every list of platforms is the same list", () => { + const staged = PLATFORMS.map((p) => `@reachpad/cli-${p.dir}`).sort(); + + // The launcher's lookup table. + assert.deepEqual(Object.values(PACKAGES).sort(), staged); + + // What `npm install -g @reachpad/cli` will actually fetch. A package staged + // and published but never depended on is a binary nobody can install. + assert.deepEqual(Object.keys(manifest("cli").optionalDependencies).sort(), staged); + + // The release matrix. Parsed rather than restated: this is the list that + // decides which tarballs exist at all, so it is the one with the last word. + const workflow = readFileSync(join(REPO, ".github/workflows/release.yml"), "utf8"); + const built = [...workflow.matchAll(/^\s*- target:\s*(\S+)/gm)].map((m) => m[1]).sort(); + assert.deepEqual( + PLATFORMS.map((p) => p.target).sort(), + built, + "release.yml builds a different set of targets than npm/prepare.mjs stages" + ); +}); + +test("each platform package declares the os/cpu npm selects it by", () => { + for (const platform of PLATFORMS) { + const pkg = manifest(platform.dir); + const [os, cpu] = platform.dir.split("-"); + assert.deepEqual(pkg.os, [os], `${platform.dir} os`); + assert.deepEqual(pkg.cpu, [cpu], `${platform.dir} cpu`); + assert.equal(pkg.reachpadTarget, platform.target, `${platform.dir} target triple`); + // Yarn Berry zips packages into its cache, and an executable inside a zip + // cannot be exec'd. + assert.equal(pkg.preferUnplugged, true, `${platform.dir} preferUnplugged`); + // A published binary that says which repo built it is the provenance + // claim npm attaches; a missing one fails the publish AFTER the + // attestation is logged, which is a bad place to find out. + assert.match(pkg.repository.url, /Reachpad\/reachpad-cli/); + } +}); + +test("the launcher maps this machine, and refuses the ones we do not ship", () => { + assert.equal(packageFor("darwin", "arm64"), "@reachpad/cli-darwin-arm64"); + assert.equal(packageFor("linux", "x64"), "@reachpad/cli-linux-x64"); + assert.equal(packageFor("win32", "x64"), undefined); + + assert.throws(() => resolveBinary("win32", "x64"), /no prebuilt binary for win32\/x64[\s\S]*WSL/); + assert.throws(() => resolveBinary("sunos", "sparc"), /no prebuilt binary for sunos\/sparc/); +}); + +test("a skipped optional dependency explains itself instead of stack-tracing", () => { + const boom = () => { + throw Object.assign(new Error("Cannot find module"), { code: "MODULE_NOT_FOUND" }); + }; + assert.throws(() => resolveBinary("linux", "x64", boom), (error) => { + assert.match(error.message, /@reachpad\/cli-linux-x64 is not installed/); + assert.match(error.message, /--omit=optional/); + assert.match(error.message, /reachpad\.dev\/install/); + return true; + }); +}); + +test("object headers are identified, and a downloaded error page is not one", () => { + const elf = (machine) => { + const b = Buffer.alloc(64); + b.write("\x7fELF", 0, "latin1"); + b.writeUInt16LE(machine, 18); + return b; + }; + const macho = (cputype) => { + const b = Buffer.alloc(64); + b.writeUInt32LE(0xfeedfacf, 0); + b.writeUInt32LE(cputype, 4); + return b; + }; + assert.deepEqual(identify(elf(0x3e)), { format: "elf", machine: "x86_64" }); + assert.deepEqual(identify(elf(0xb7)), { format: "elf", machine: "arm64" }); + assert.deepEqual(identify(macho(0x01000007)), { format: "macho", machine: "x86_64" }); + assert.deepEqual(identify(macho(0x0100000c)), { format: "macho", machine: "arm64" }); + assert.equal(identify(Buffer.from("404: Not Found")), null); + assert.equal(identify(Buffer.alloc(4)), null); +}); + +test("checksums are read the way shasum writes them", () => { + const sums = parseChecksums( + "abc not-a-sha\n" + + "1".repeat(64) + " reachpad-x86_64-unknown-linux-musl.tar.gz\n" + + "2".repeat(64) + " *reachpad-aarch64-apple-darwin.tar.gz\n" + ); + assert.equal(sums.get("reachpad-x86_64-unknown-linux-musl.tar.gz"), "1".repeat(64)); + assert.equal(sums.get("reachpad-aarch64-apple-darwin.tar.gz"), "2".repeat(64)); + assert.equal(sums.get("not-a-sha"), undefined); +}); + +test("stamping a version reaches the pins, not just the package's own version", () => { + const stamped = stampManifest(manifest("cli"), "1.2.3"); + assert.equal(stamped.version, "1.2.3"); + for (const [name, pin] of Object.entries(stamped.optionalDependencies)) { + assert.equal(pin, "1.2.3", `${name} pin`); + } +}); + +test("the repo carries no real version: the tag is the only source", () => { + for (const dir of PACKAGE_DIRS) { + assert.equal(manifest(dir).version, "0.0.0-dev", `${dir} version`); + } +}); + +// --- prepare.mjs, end to end on a throwaway copy ----------------------------- + +function fakeRelease(dir, { corrupt = null, wrongArch = false } = {}) { + mkdirSync(dir, { recursive: true }); + const sums = []; + for (const platform of PLATFORMS) { + const header = Buffer.alloc(256); + const machine = wrongArch && platform.dir === "darwin-x64" ? "arm64" : platform.machine; + if (platform.format === "elf") { + header.write("\x7fELF", 0, "latin1"); + header.writeUInt16LE(machine === "x86_64" ? 0x3e : 0xb7, 18); + } else { + header.writeUInt32LE(0xfeedfacf, 0); + header.writeUInt32LE(machine === "x86_64" ? 0x01000007 : 0x0100000c, 4); + } + const stage = mkdtempSync(join(tmpdir(), "rp-stage-")); + writeFileSync(join(stage, "reachpad"), header); + const asset = `reachpad-${platform.target}.tar.gz`; + execFileSync("tar", ["czf", join(dir, asset), "-C", stage, "reachpad"]); + const sum = execFileSync("sha256sum", [join(dir, asset)]).toString().slice(0, 64); + sums.push(`${corrupt === platform.dir ? "0".repeat(64) : sum} ${asset}`); + } + writeFileSync(join(dir, "SHA256SUMS"), sums.join("\n") + "\n"); +} + +function runPrepare(options = {}) { + const work = mkdtempSync(join(tmpdir(), "rp-npm-")); + cpSync(NPM_DIR, join(work, "npm"), { recursive: true }); + cpSync(join(REPO, ".github"), join(work, ".github"), { recursive: true }); + const artifacts = join(work, "artifacts"); + fakeRelease(artifacts, options); + const result = spawnSync( + process.execPath, + [join(work, "npm/prepare.mjs"), "--version", "9.9.9", "--artifacts", artifacts], + { encoding: "utf8" } + ); + return { work, result }; +} + +test("prepare stamps the tag's version and stages every platform", () => { + const { work, result } = runPrepare(); + assert.equal(result.status, 0, result.stderr); + + for (const dir of PACKAGE_DIRS) { + const pkg = JSON.parse(readFileSync(join(work, "npm", dir, "package.json"), "utf8")); + assert.equal(pkg.version, "9.9.9", `${dir} version`); + } + const cli = JSON.parse(readFileSync(join(work, "npm/cli/package.json"), "utf8")); + for (const pin of Object.values(cli.optionalDependencies)) assert.equal(pin, "9.9.9"); + + for (const platform of PLATFORMS) { + const binary = join(work, "npm", platform.dir, "bin", "reachpad"); + const found = identify(readFileSync(binary)); + assert.deepEqual(found, { format: platform.format, machine: platform.machine }); + } +}); + +test("prepare refuses a tarball whose checksum does not match the release", () => { + const { result } = runPrepare({ corrupt: "linux-x64" }); + assert.notEqual(result.status, 0); + assert.match(result.stderr, /checksum mismatch/); +}); + +test("prepare refuses a binary built for the wrong architecture", () => { + const { result } = runPrepare({ wrongArch: true }); + assert.notEqual(result.status, 0); + assert.match(result.stderr, /darwin-x64 was staged with the wrong binary/); +}); + +test("prepare refuses a tag name where a version belongs", () => { + // `cli-v0.3.0` is the tag; `0.3.0` is the version. Publishing the former + // would put a package on npm that no `@latest` range can ever resolve. + const run = spawnSync( + process.execPath, + [join(NPM_DIR, "prepare.mjs"), "--version", "cli-v0.3.0", "--artifacts", "/nonexistent"], + { encoding: "utf8" } + ); + assert.equal(run.status, 2); + assert.match(run.stderr, /not a semver release version/); +}); + +// --- the launcher, against a real child process ------------------------------ + +function launcherFixture(script) { + const work = mkdtempSync(join(tmpdir(), "rp-run-")); + const cli = join(work, "node_modules/@reachpad/cli"); + cpSync(join(NPM_DIR, "cli"), cli, { recursive: true }); + const platform = packageFor(process.platform, process.arch); + assert.ok(platform, `this test host (${process.platform}/${process.arch}) is not a target`); + const bin = join(work, "node_modules", platform, "bin"); + mkdirSync(bin, { recursive: true }); + writeFileSync(join(bin, "reachpad"), script); + chmodSync(join(bin, "reachpad"), 0o755); + return join(cli, "bin/reachpad.js"); +} + +test("the guest's exit code is the launcher's exit code", () => { + const launcher = launcherFixture("#!/bin/sh\nexit 42\n"); + const run = spawnSync(process.execPath, [launcher], { encoding: "utf8" }); + assert.equal(run.status, 42, "`reachpad run` returns the guest's status; a wrapper must not eat it"); +}); + +test("argv and both output streams pass through unmangled", () => { + const launcher = launcherFixture( + "#!/bin/sh\nprintf 'out:%s' \"$*\"\nprintf 'err:%s' \"$1\" >&2\n" + ); + const run = spawnSync(process.execPath, [launcher, "run", "ws-1", "--", "ls", "-la"], { + encoding: "utf8", + }); + assert.equal(run.stdout, "out:run ws-1 -- ls -la"); + assert.equal(run.stderr, "err:run"); + assert.equal(run.status, 0); +}); + +test("a guest killed by a signal kills the launcher the same way", () => { + const launcher = launcherFixture("#!/bin/sh\nkill -TERM $$\n"); + const run = spawnSync(process.execPath, [launcher], { encoding: "utf8" }); + assert.equal(run.signal, "SIGTERM", "the shell must see Terminated, not exit 1"); +}); + +test("no platform package at all is a paragraph on stderr, not a stack", () => { + const work = mkdtempSync(join(tmpdir(), "rp-bare-")); + const cli = join(work, "node_modules/@reachpad/cli"); + cpSync(join(NPM_DIR, "cli"), cli, { recursive: true }); + const run = spawnSync(process.execPath, [join(cli, "bin/reachpad.js")], { encoding: "utf8" }); + assert.equal(run.status, 1); + assert.doesNotMatch(run.stderr, /at Object|MODULE_NOT_FOUND/); + assert.match(run.stderr, /is not installed/); +}); From c71f66bf6b7bcb25e22df8869fd06011c3953035 Mon Sep 17 00:00:00 2001 From: HeapSmasher <98077186+las7@users.noreply.github.com> Date: Fri, 14 Aug 2026 23:07:43 +0000 Subject: [PATCH 2/5] Say what the Gatekeeper warning is, on the page that causes it A browser download from the releases page is the one install path that stamps com.apple.quarantine, so it is the one that meets Gatekeeper while the binaries are only ad-hoc signed. Someone who hits "Apple could not verify reachpad is free of malware" with no explanation next to the download concludes the binary is malware rather than unsigned. The release body now leads with the three install commands that avoid the tag, and gives the checksum-then-xattr pair for the tarball itself. Greentree-Change-Id: a4f6e540b26185556c82353e2250920e --- .github/workflows/release.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0cf70ad..dd7db34 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -139,6 +139,12 @@ jobs: merge-multiple: true - name: combined checksum file run: cat *.sha256 > SHA256SUMS + # The body carries the macOS quarantine note on purpose. Downloading a + # tarball from THIS page in a browser is the one install path that + # stamps com.apple.quarantine, and until the binaries are notarized it + # is also the one that meets Gatekeeper. Someone who hits "Apple could + # not verify reachpad is free of malware" with no explanation next to + # the download concludes the binary is malware, not that it is unsigned. - name: create release uses: softprops/action-gh-release@v2 with: @@ -146,6 +152,34 @@ jobs: *.tar.gz SHA256SUMS fail_on_unmatched_files: true + body: | + ## Install + + ```sh + brew install reachpad/tap/reachpad # macOS, Linux + npm install -g @reachpad/cli # anywhere Node 18+ runs + curl -fsSL https://reachpad.dev/install | sh + ``` + + All three deliver the binaries below, and none of them hits the + macOS warning described next. + + ## Downloading a tarball here, on macOS + + These binaries are ad-hoc signed, not yet Developer ID signed and + notarized. A **browser** download tags the file with + `com.apple.quarantine`, and macOS then refuses it with "Apple + could not verify reachpad is free of malware". The file is fine — + it is unsigned, not unsafe — and any of the three commands above + avoids the tag entirely. If you want this exact tarball anyway: + + ```sh + shasum -a 256 -c SHA256SUMS --ignore-missing + xattr -d com.apple.quarantine reachpad + ``` + + Verify the checksum first, as above; that is the check the + signature would otherwise be doing for you. # The same binaries, on npm. Separate job so a registry outage cannot lose # the GitHub release, and `needs: publish` so npm never advertises a version From c10458a97ae9a2d7ee36f327c06cdb827e284e7d Mon Sep 17 00:00:00 2001 From: HeapSmasher <98077186+las7@users.noreply.github.com> Date: Fri, 14 Aug 2026 23:13:40 +0000 Subject: [PATCH 3/5] Assert provenance metadata on all five packages, not four MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit npm signs provenance on every OIDC publish and refuses the upload when package.json does not name the repository it was built from — after the tarball is built and the attestation is already in the transparency log. The check covered the four platform packages and skipped @reachpad/cli, which is the one published LAST: a missing field there fails with four packages already public and a version npm will not accept again. Greentree-Change-Id: cdd9dfd0b14b83eafd89b9970533937d --- npm/test/packages.test.mjs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/npm/test/packages.test.mjs b/npm/test/packages.test.mjs index 0eeb49a..9cd91d8 100644 --- a/npm/test/packages.test.mjs +++ b/npm/test/packages.test.mjs @@ -54,10 +54,20 @@ test("each platform package declares the os/cpu npm selects it by", () => { // Yarn Berry zips packages into its cache, and an executable inside a zip // cannot be exec'd. assert.equal(pkg.preferUnplugged, true, `${platform.dir} preferUnplugged`); - // A published binary that says which repo built it is the provenance - // claim npm attaches; a missing one fails the publish AFTER the - // attestation is logged, which is a bad place to find out. - assert.match(pkg.repository.url, /Reachpad\/reachpad-cli/); + } +}); + +test("every package names the repo npm signs provenance against", () => { + // npm signs provenance on every OIDC publish and REFUSES the upload when + // package.json does not name the repository it was built from. That + // rejection arrives after the tarball is built and the attestation is + // already in the transparency log, which is a confusing place to learn it. + // All five, not just the platform ones: @reachpad/cli is published last, so + // a missing field there fails after four packages are already public. + for (const dir of PACKAGE_DIRS) { + const pkg = manifest(dir); + assert.match(pkg.repository?.url ?? "", /Reachpad\/reachpad-cli/, `${dir} repository.url`); + assert.equal(pkg.publishConfig?.access, "public", `${dir} publishConfig.access`); } }); From e9f239d054bc8cf91896c243f32674d54746ffee Mon Sep 17 00:00:00 2001 From: HeapSmasher <98077186+las7@users.noreply.github.com> Date: Fri, 14 Aug 2026 23:15:06 +0000 Subject: [PATCH 4/5] Name the one npm failure that is certain to happen once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Trusted Publishing can only be configured on a package that already exists, so the first version of all five must be pushed by hand — and until then the publish dies with ENEEDAUTH next to a release that otherwise succeeded, which reads as a credentials problem rather than a setup step nobody has done yet. The failure path now checks whether the package exists at all and, when it does not, emits an annotation with the bootstrap commands and the per-package trusted-publisher settings. Greentree-Change-Id: 4128d9db73fdace724aba6623606bc16 --- .github/workflows/release.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dd7db34..3d3eb29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -223,7 +223,19 @@ jobs: name=$(node -p "require('./npm/$dir/package.json').name") if npm view "$name@$version" version >/dev/null 2>&1; then echo "$name@$version is already on npm; leaving it alone" - else - npm publish "npm/$dir" + continue fi + if npm publish "npm/$dir"; then + continue + fi + # A publish can fail for ordinary reasons, but there is exactly one + # that is guaranteed to happen once and reads as an unrelated auth + # error when it does: npm Trusted Publishing can only be configured + # on a package that ALREADY EXISTS, so the first version of each of + # these five has to be pushed by hand. Say so here rather than + # leaving ENEEDAUTH next to a green release. + if ! npm view "$name" version >/dev/null 2>&1; then + echo "::error title=$name has never been published::OIDC cannot publish a package that does not exist yet. Publish each of the five once by hand, then configure the trusted publisher for each at npmjs.com (Settings -> Trusted Publisher -> GitHub Actions; org Reachpad, repo reachpad-cli, workflow release.yml, environment blank). The commands are in npm/README.md. Re-running this tag afterwards is safe: publishes already done are skipped." + fi + exit 1 done From 35eae0c707d0089a796f3a8a554f3649a8160c2b Mon Sep 17 00:00:00 2001 From: HeapSmasher <98077186+las7@users.noreply.github.com> Date: Fri, 14 Aug 2026 23:35:59 +0000 Subject: [PATCH 5/5] Build releases with --locked, so the lock binds the shipped binary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pruning the lock made it correct; nothing was using it. The release build and CI both re-resolved on the runner, which means the committed lock described nothing that was ever built, two builds of one tag could differ, and a transitive dependency publishing a semver-compatible release between them would be picked up with nobody deciding to. The provenance claim at the top of release.yml — tag, readable source, workflow run, SHA256SUMS — needs the source to determine the binary. --locked is the step that makes that true rather than nearly true. CI gets it too, so the lock is checked on every PR instead of first discovered at release time, and so CI stops being green on trees the repo's own greentree check refuses. Verified: cargo build --release --locked -p reach succeeds and the binary reports reachpad 0.3.0. Greentree-Change-Id: 921271c61caa36784a769b292483d5a9 --- .github/workflows/ci.yml | 8 ++++++-- .github/workflows/release.yml | 10 +++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc84d05..b2ea7be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,8 +17,12 @@ jobs: - run: sudo apt-get update && sudo apt-get install -y protobuf-compiler - uses: Swatinem/rust-cache@v2 - run: cargo fmt --all --check - - run: cargo build --workspace - - run: cargo test --workspace + # --locked here so the lock is checked on every PR, not first discovered + # at release time. It is also what makes CI agree with the greentree + # `test` check, which has always passed --locked: without it CI was green + # on a tree the repo's own gate refused. + - run: cargo build --workspace --locked + - run: cargo test --workspace --locked # The npm distribution. No build, no network, no credentials — it is four # descriptions of the same platform list, checked against each other, plus diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3d3eb29..162c677 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,8 +48,16 @@ jobs: else sudo apt-get update && sudo apt-get install -y protobuf-compiler musl-tools fi + # --locked is the difference between "built from this source" and "built + # from this source and these exact dependency versions". Without it cargo + # re-resolves on the runner, so the committed lock describes nothing that + # was ever built, two builds of ONE tag can differ, and a transitive + # dependency that publishes a semver-compatible release between them is + # picked up with nobody deciding to. That is the hole the provenance + # claim at the top of this file must not have. It fails loudly if the + # lock and the manifest ever disagree again, which is the point. - name: build - run: cargo build --release -p reach --target ${{ matrix.target }} + run: cargo build --release --locked -p reach --target ${{ matrix.target }} # --- macOS: Developer ID signature + notarization --------------------- #