``` ├── .dockerignore ├── .github/ ├── workflows/ ├── pull_request.yml ├── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── Dockerfile.ext ├── LICENSE ├── Makefile ├── README.md ├── common/ ├── scripts/ ├── get-agentproxy ├── report_build_info.sh ├── crates/ ├── a2a-sdk/ ├── Cargo.toml ├── src/ ├── jsonrpc.rs ├── lib.rs ├── agentgateway/ ├── Cargo.toml ├── build.rs ├── proto/ ├── a2a/ ├── target.proto ├── common.proto ├── google/ ├── protobuf/ ├── any.proto ├── duration.proto ├── empty.proto ├── struct.proto ├── wrappers.proto ├── listener.proto ├── mcp/ ├── target.proto ├── openapi.yaml ├── rbac.proto ├── xds.proto ├── src/ ├── a2a/ ├── handlers.rs ``` ## /.dockerignore ```dockerignore path="/.dockerignore" target .idea .vscode .DS_Store manifests examples ``` ## /.github/workflows/pull_request.yml ```yml path="/.github/workflows/pull_request.yml" name: Branch on: push: branches: [ "main" ] pull_request: branches: [ "main" ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-musl - os: ubuntu-22.04-arm target: aarch64-unknown-linux-musl - os: macos-latest target: aarch64-apple-darwin steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 23 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Rust uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Install Protoc uses: arduino/setup-protoc@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Build UI run: | cd ui npm install npm run build - name: Install musl-tools if: ${{ matrix.os == 'ubuntu-22.04-arm' || matrix.os == 'ubuntu-latest' }} run: | sudo apt-get update sudo apt-get install -y musl-tools rustup target add ${{ matrix.target }} - name: Build run: make build env: CARGO_BUILD_ARGS: "--target ${{ matrix.target }}" lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Install Protoc uses: arduino/setup-protoc@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Lint run: make lint test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Install Protoc uses: arduino/setup-protoc@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Test run: make test - name: Validate run: make validate -B docker: strategy: matrix: os: - ubuntu-latest - ubuntu-22.04-arm runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build env: DOCKER_BUILDER: "docker buildx" run: make docker ``` ## /.github/workflows/release.yml ```yml path="/.github/workflows/release.yml" name: Release on: push: tags: - "v*.*.*" workflow_dispatch: inputs: version: description: 'Version number' env: REGISTRY_IMAGE: ghcr.io/agentgateway/agentgateway jobs: build-image: runs-on: ${{ matrix.os }} permissions: contents: read packages: write strategy: fail-fast: false matrix: include: - platform: linux/amd64 os: ubuntu-latest - platform: linux/arm64 os: ubuntu-22.04-arm steps: - name: Prepare run: | platform=${{ matrix.platform }} echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY_IMAGE }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and push by digest id: build uses: docker/build-push-action@v6 with: platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} tags: ${{ env.REGISTRY_IMAGE }} outputs: type=image,push-by-digest=true,name-canonical=true,push=true - name: Export digest run: | mkdir -p ${{ runner.temp }}/digests digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v4 with: name: digests-${{ env.PLATFORM_PAIR }} path: ${{ runner.temp }}/digests/* if-no-files-found: error retention-days: 1 push-image: runs-on: ubuntu-latest permissions: contents: read packages: write needs: - build-image steps: - name: Download digests uses: actions/download-artifact@v4 with: path: ${{ runner.temp }}/digests pattern: digests-* merge-multiple: true - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY_IMAGE }} tags: | type=semver,pattern={{version}} # use custom value instead of git tag type=semver,pattern={{version}},value=${{ github.event.inputs.version }} - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) - name: Inspect image run: | docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} ext-image: needs: - push-image runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and push env: DOCKER_BUILDER: "docker buildx" run: | # if workflow_dispatch is used, use the version input if [ -n "${{ github.event.inputs.version }}" ]; then export VERSION=${{ github.event.inputs.version }} else export VERSION=$(echo "$GITHUB_REF" | cut -c12-) fi make docker-ext DOCKER_BUILD_ARGS="--push --platform linux/amd64,linux/arm64 --build-arg VERSION=$VERSION --tag ${{ env.REGISTRY_IMAGE }}:latest-ext" build: runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-musl - os: ubuntu-22.04-arm target: aarch64-unknown-linux-musl - os: macos-latest target: aarch64-apple-darwin steps: - name: Checkout Repository uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 23 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Install Protoc uses: arduino/setup-protoc@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} # TODO: build this in a separate job and just copy it over - name: Build UI run: | cd ui npm install npm run build - name: Install musl-tools if: ${{ matrix.os == 'ubuntu-22.04-arm' || matrix.os == 'ubuntu-latest' }} run: | sudo apt-get update sudo apt-get install -y musl-tools rustup target add ${{ matrix.target }} - name: Build run: make build env: CARGO_BUILD_ARGS: "--target ${{ matrix.target }}" - name: Upload Artifact uses: actions/upload-artifact@v4 with: name: release-binary-${{ matrix.os }} path: target/${{ matrix.target }}/release/agentgateway release: needs: - ext-image - build runs-on: ubuntu-latest permissions: contents: write steps: - name: Download Artifacts uses: actions/download-artifact@v4 with: pattern: release-binary-* - name: Display structure of downloaded files run: | ls -R mkdir outputs mv release-binary-macos-latest/agentgateway outputs/agentgateway-darwin-arm64 sha256sum outputs/agentgateway-darwin-arm64 > outputs/agentgateway-darwin-arm64.sha256 mv release-binary-ubuntu-latest/agentgateway outputs/agentgateway-linux-amd64 sha256sum outputs/agentgateway-linux-amd64 > outputs/agentgateway-linux-amd64.sha256 mv release-binary-ubuntu-22.04-arm/agentgateway outputs/agentgateway-linux-arm64 sha256sum outputs/agentgateway-linux-arm64 > outputs/agentgateway-linux-arm64.sha256 - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: files: outputs/agentgateway-* tag_name: ${{ github.ref_name }} body: "Automated release of ${{ github.ref_name }}." env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: startsWith(github.ref, 'refs/tags/') ``` ## /.gitignore ```gitignore path="/.gitignore" /target .vscode .idea .DS_Store ``` ## /Cargo.lock ```lock path="/Cargo.lock" # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "a2a-sdk" version = "0.4.0" dependencies = [ "chrono", "serde", "serde_json", ] [[package]] name = "addr2line" version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] name = "adler2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "agent-core" version = "0.4.12" dependencies = [ "arcstr", "bytes", "pin-project-lite", "prometheus-client", "rustc_version", "serde", "thiserror 2.0.12", "tokio", "tracing", "tracing-core", ] [[package]] name = "agent-hbone" version = "0.4.12" dependencies = [ "agent-core", "anyhow", "bytes", "flurry", "futures", "futures-util", "h2 0.4.9", "http 1.3.1", "pingora-pool", "rustls 0.23.26", "serde", "tokio", "tokio-rustls 0.26.2", "tonic 0.13.0", "tracing", ] [[package]] name = "agent-proxy" version = "0.4.12" dependencies = [ "agent-core", "agent-hbone", "agent-xds", "anyhow", "async-trait", "axum-core", "bytes", "futures-core", "futures-util", "hex", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-util", "ipnet", "itertools 0.14.0", "minijinja", "pin-project-lite", "prometheus-client", "prost", "prost-build", "prost-types", "rand 0.9.0", "regex", "rustls 0.23.26", "rustls-pemfile 2.2.0", "serde", "serde_regex", "thiserror 2.0.12", "tokio", "tokio-rustls 0.26.2", "tokio-stream", "tonic 0.13.0", "tonic-build", "tower 0.5.2", "tracing", "url", ] [[package]] name = "agent-proxy-app" version = "0.4.12" dependencies = [ "agent-core", "agent-hbone", "agent-proxy", "agent-xds", "anyhow", "async-trait", "axum-core", "bytes", "duration-str", "futures-core", "futures-util", "hex", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-util", "ipnet", "itertools 0.14.0", "minijinja", "once_cell", "pin-project-lite", "prometheus-client", "prost", "prost-types", "rand 0.9.0", "regex", "rustls 0.23.26", "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_regex", "serde_yaml", "thiserror 2.0.12", "tokio", "tokio-rustls 0.26.2", "tokio-stream", "tonic 0.13.0", "tower 0.5.2", "tracing", "tracing-appender", "tracing-core", "tracing-log", "tracing-subscriber", "url", ] [[package]] name = "agent-xds" version = "0.0.0" dependencies = [ "agent-core", "anyhow", "async-stream", "prometheus-client", "prost", "prost-build", "prost-types", "serde_json", "split-iter", "thiserror 2.0.12", "tokio", "tonic 0.13.0", "tonic-build", "tracing", ] [[package]] name = "agentgateway" version = "0.4.12" dependencies = [ "a2a-sdk", "agent-core", "anyhow", "arcstr", "async-stream", "async-trait", "aws-config", "aws-sdk-lambda", "aws-smithy-runtime-api", "axum", "axum-extra", "base64 0.22.1", "bytes", "clap", "eventsource-stream", "futures", "google-cloud-auth", "headers", "homedir", "http 1.3.1", "include_dir", "itertools 0.14.0", "jsonwebtoken", "lazy_static", "mime", "once_cell", "openapiv3", "opentelemetry", "opentelemetry-http", "opentelemetry-otlp", "opentelemetry_sdk", "pbjson", "pbjson-build", "pbjson-types", "ppp", "prometheus-client", "prost", "prost-build", "rand 0.9.0", "regex", "reqwest", "rmcp", "rustc_version", "rustls 0.23.26", "secrecy", "serde", "serde_json", "serde_yaml", "sse-stream", "thiserror 2.0.12", "tls-listener", "tokio", "tokio-rustls 0.26.2", "tokio-stream", "tokio-util", "tonic 0.13.0", "tonic-build", "tower-http", "tower-serve-static", "tracing", "tracing-subscriber", "wiremock", ] [[package]] name = "ahash" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "const-random", "once_cell", "version_check", "zerocopy 0.7.35", ] [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 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-tzdata" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[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 = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arcstr" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03918c3dbd7701a85c6b9887732e2921175f26c350b4563841d0958c21d57e6d" dependencies = [ "serde", ] [[package]] name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert-json-diff" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" dependencies = [ "serde", "serde_json", ] [[package]] name = "async-stream" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", "pin-project-lite", ] [[package]] name = "async-stream-impl" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "async-trait" version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c39646d1a6b51240a1a23bb57ea4eebede7e16fbc237fdc876980233dcecb4f" dependencies = [ "aws-credential-types", "aws-runtime", "aws-sdk-sso", "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "fastrand", "hex", "http 1.3.1", "ring", "time", "tokio", "tracing", "url", "zeroize", ] [[package]] name = "aws-credential-types" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4471bef4c22a06d2c7a1b6492493d3fdf24a805323109d6874f9c94d5906ac14" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "zeroize", ] [[package]] name = "aws-lc-rs" version = "1.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dabb68eb3a7aa08b46fddfd59a3d55c978243557a90ab804769f7e20e67d2b01" dependencies = [ "aws-lc-sys", "zeroize", ] [[package]] name = "aws-lc-sys" version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77926887776171ced7d662120a75998e444d3750c951abfe07f90da130514b1f" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", ] [[package]] name = "aws-runtime" version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0aff45ffe35196e593ea3b9dd65b320e51e2dda95aff4390bc459e461d09c6ad" dependencies = [ "aws-credential-types", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", "http-body 0.4.6", "once_cell", "percent-encoding", "pin-project-lite", "tracing", "uuid", ] [[package]] name = "aws-sdk-lambda" version = "1.75.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eebfb3c1189b7a906cc3e2609fc60c4e94a951f0dff53e1694e8b66c84f6b61a" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" version = "1.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d4bdb0e5f80f0689e61c77ab678b2b9304af329616af38aef5b6b967b8e736" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" version = "1.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbbb3ce8da257aedbccdcb1aadafbbb6a5fe9adf445db0e1ea897bdc7e22d08" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "fastrand", "http 0.2.12", "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" version = "1.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a78a8f50a1630db757b60f679c8226a8a70ee2ab5f5e6e51dc67f6c61c7cfd" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", "fastrand", "http 0.2.12", "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69d03c3c05ff80d54ff860fe38c726f6f494c639ae975203a101335f223386db" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "form_urlencoded", "hex", "hmac", "http 0.2.12", "http 1.3.1", "once_cell", "percent-encoding", "sha2", "time", "tracing", ] [[package]] name = "aws-smithy-async" version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" dependencies = [ "futures-util", "pin-project-lite", "tokio", ] [[package]] name = "aws-smithy-eventstream" version = "0.60.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c45d3dddac16c5c59d553ece225a88870cf81b7b813c9cc17b78cf4685eac7a" dependencies = [ "aws-smithy-types", "bytes", "crc32fast", ] [[package]] name = "aws-smithy-http" version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "bytes-utils", "futures-core", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", "percent-encoding", "pin-project-lite", "pin-utils", "tracing", ] [[package]] name = "aws-smithy-http-client" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8aff1159006441d02e57204bf57a1b890ba68bedb6904ffd2873c1c4c11c546b" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.4.9", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", "hyper 0.14.32", "hyper 1.6.0", "hyper-rustls 0.24.2", "hyper-rustls 0.27.5", "hyper-util", "pin-project-lite", "rustls 0.21.12", "rustls 0.23.26", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tower 0.5.2", "tracing", ] [[package]] name = "aws-smithy-json" version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" version = "0.60.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" dependencies = [ "aws-smithy-types", "urlencoding", ] [[package]] name = "aws-smithy-runtime" version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" dependencies = [ "aws-smithy-async", "aws-smithy-http", "aws-smithy-http-client", "aws-smithy-observability", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "fastrand", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", "pin-project-lite", "pin-utils", "tokio", "tracing", ] [[package]] name = "aws-smithy-runtime-api" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e5d9e3a80a18afa109391fb5ad09c3daf887b516c6fd805a157c6ea7994a57" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", "http 1.3.1", "pin-project-lite", "tokio", "tracing", "zeroize", ] [[package]] name = "aws-smithy-types" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40076bd09fadbc12d5e026ae080d0930defa606856186e31d83ccc6a255eeaf3" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", "itoa", "num-integer", "pin-project-lite", "pin-utils", "ryu", "serde", "time", "tokio", "tokio-util", ] [[package]] name = "aws-smithy-xml" version = "0.60.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3873f8deed8927ce8d04487630dc9ff73193bab64742a61d050e57a68dec4125" dependencies = [ "aws-credential-types", "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "rustc_version", "tracing", ] [[package]] name = "axum" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" dependencies = [ "axum-core", "axum-macros", "bytes", "form_urlencoded", "futures-util", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-util", "itoa", "matchit", "memchr", "mime", "percent-encoding", "pin-project-lite", "rustversion", "serde", "serde_json", "serde_path_to_error", "serde_urlencoded", "sync_wrapper", "tokio", "tower 0.5.2", "tower-layer", "tower-service", "tracing", ] [[package]] name = "axum-core" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ "bytes", "futures-core", "http 1.3.1", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", "sync_wrapper", "tower-layer", "tower-service", "tracing", ] [[package]] name = "axum-extra" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" dependencies = [ "axum", "axum-core", "bytes", "futures-util", "headers", "http 1.3.1", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", "serde", "serde_json", "tokio", "tokio-stream", "tokio-util", "tower 0.5.2", "tower-layer", "tower-service", ] [[package]] name = "axum-macros" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "backtrace" version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", "windows-targets 0.52.6", ] [[package]] name = "base64" version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[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 = "bindgen" version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags", "cexpr", "clang-sys", "itertools 0.12.1", "lazy_static", "lazycell", "log", "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash 1.1.0", "shlex", "syn", "which", ] [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[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 = "bumpalo" version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] [[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 = "cc" version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", "libc", "shlex", ] [[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.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", "windows-link", ] [[package]] name = "clang-sys" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", "libloading", ] [[package]] name = "clap" version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cmake" version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] [[package]] name = "colorchoice" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "const-random" version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] [[package]] name = "const-random-macro" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ "getrandom 0.2.15", "once_cell", "tiny-keccak", ] [[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "core-foundation" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 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 = "crc32fast" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "darling" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", "syn", ] [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", "syn", ] [[package]] name = "deadpool" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490" dependencies = [ "async-trait", "deadpool-runtime", "num_cpus", "tokio", ] [[package]] name = "deadpool-runtime" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" [[package]] name = "deranged" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", ] [[package]] name = "derive_builder" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", "quote", "syn", ] [[package]] name = "derive_builder_macro" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", "syn", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", "subtle", ] [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "dtoa" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "duration-str" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9add086174f60bcbcfde7175e71dcfd99da24dfd12f611d0faf74f4f26e15a06" dependencies = [ "chrono", "rust_decimal", "serde", "thiserror 2.0.12", "time", "winnow", ] [[package]] name = "dyn-clone" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encoding_rs" version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[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.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", "windows-sys 0.59.0", ] [[package]] name = "eventsource-stream" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" dependencies = [ "futures-core", "nom", "pin-project-lite", ] [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fixedbitset" version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flurry" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf5efcf77a4da27927d3ab0509dec5b0954bb3bc59da5a1de9e52642ebd4cdf9" dependencies = [ "ahash", "num_cpus", "parking_lot", "seize", ] [[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 = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 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.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", "futures-executor", "futures-io", "futures-sink", "futures-task", "futures-util", ] [[package]] name = "futures-channel" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", ] [[package]] name = "futures-core" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "futures-sink" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-macro", "futures-sink", "futures-task", "memchr", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "google-cloud-auth" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5572275b7f06b6fde8eec61a23d87c83aae362bee586bbeb8773b3f98658ae81" dependencies = [ "async-trait", "base64 0.22.1", "derive_builder", "http 1.3.1", "reqwest", "rustls 0.23.26", "rustls-pemfile 2.2.0", "serde", "serde_json", "thiserror 2.0.12", "time", "tokio", ] [[package]] name = "h2" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", "http 0.2.12", "indexmap 2.8.0", "slab", "tokio", "tokio-util", "tracing", ] [[package]] name = "h2" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", "http 1.3.1", "indexmap 2.8.0", "slab", "tokio", "tokio-util", "tracing", ] [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", "foldhash", ] [[package]] name = "headers" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" dependencies = [ "base64 0.21.7", "bytes", "headers-core", "http 1.3.1", "httpdate", "mime", "sha1", ] [[package]] name = "headers-core" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ "http 1.3.1", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ "digest", ] [[package]] name = "home" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "homedir" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bdbbd5bc8c5749697ccaa352fa45aff8730cf21c68029c0eef1ffed7c3d6ba2" dependencies = [ "cfg-if", "nix", "widestring", "windows", ] [[package]] name = "http" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", "itoa", ] [[package]] name = "http" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", "itoa", ] [[package]] name = "http-body" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http 0.2.12", "pin-project-lite", ] [[package]] name = "http-body" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.3.1", ] [[package]] name = "http-body-util" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", "socket2", "tokio", "tower-service", "tracing", "want", ] [[package]] name = "hyper" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", "h2 0.4.9", "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", "itoa", "pin-project-lite", "smallvec", "tokio", "want", ] [[package]] name = "hyper-rustls" version = "0.24.2" 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", "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] [[package]] name = "hyper-rustls" version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.3.1", "hyper 1.6.0", "hyper-util", "rustls 0.23.26", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls 0.26.2", "tower-service", "webpki-roots", ] [[package]] name = "hyper-timeout" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", "tower-service", ] [[package]] name = "hyper-tls" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", "hyper 1.6.0", "hyper-util", "native-tls", "tokio", "tokio-native-tls", "tower-service", ] [[package]] name = "hyper-util" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.3.1", "http-body 1.0.1", "hyper 1.6.0", "pin-project-lite", "socket2", "tokio", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", "windows-core 0.52.0", ] [[package]] name = "iana-time-zone-haiku" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ "cc", ] [[package]] name = "icu_collections" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_locid" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", "tinystr", "writeable", "zerovec", ] [[package]] name = "icu_locid_transform" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ "displaydoc", "icu_locid", "icu_locid_transform_data", "icu_provider", "tinystr", "zerovec", ] [[package]] name = "icu_locid_transform_data" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" [[package]] name = "icu_normalizer" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", "utf16_iter", "utf8_iter", "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] name = "icu_properties" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", "icu_locid_transform", "icu_properties_data", "icu_provider", "tinystr", "zerovec", ] [[package]] name = "icu_properties_data" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", "icu_locid", "icu_provider_macros", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_provider_macros" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ "idna_adapter", "smallvec", "utf8_iter", ] [[package]] name = "idna_adapter" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", ] [[package]] name = "include_dir" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ "proc-macro2", "quote", ] [[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", ] [[package]] name = "indexmap" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown 0.15.2", "serde", ] [[package]] name = "ipnet" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" dependencies = [ "serde", ] [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "jsonwebtoken" version = "9.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" dependencies = [ "base64 0.22.1", "js-sys", "pem", "ring", "serde", "serde_json", "simple_asn1", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libloading" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", ] [[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.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "lru" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f8cc7106155f10bdf99a6f379688f543ad6596a415375b36a59a054ceda1198" dependencies = [ "hashbrown 0.15.2", ] [[package]] name = "matchers" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ "regex-automata 0.1.10", ] [[package]] name = "matchit" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memo-map" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", ] [[package]] name = "minijinja" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98642a6dfca91122779a307b77cd07a4aa951fbe32232aaf5bad9febc66be754" dependencies = [ "memo-map", "self_cell", "serde", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] [[package]] name = "mio" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] name = "multimap" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "native-tls" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", "openssl", "openssl-probe", "openssl-sys", "schannel", "security-framework 2.11.1", "security-framework-sys", "tempfile", ] [[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags", "cfg-if", "cfg_aliases", "libc", ] [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "nu-ansi-term" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", "winapi", ] [[package]] name = "num-bigint" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", ] [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ "num-traits", ] [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] [[package]] name = "object" version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openapiv3" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc02deea53ffe807708244e5914f6b099ad7015a207ee24317c22112e17d9c5c" dependencies = [ "indexmap 2.8.0", "serde", "serde_json", ] [[package]] name = "openssl" version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", "openssl-macros", "openssl-sys", ] [[package]] name = "openssl-macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", "pkg-config", "vcpkg", ] [[package]] name = "opentelemetry" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e87237e2775f74896f9ad219d26a2081751187eb7c9f5c58dde20a23b95d16c" dependencies = [ "futures-core", "futures-sink", "js-sys", "pin-project-lite", "thiserror 2.0.12", "tracing", ] [[package]] name = "opentelemetry-http" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46d7ab32b827b5b495bd90fa95a6cb65ccc293555dcc3199ae2937d2d237c8ed" dependencies = [ "async-trait", "bytes", "http 1.3.1", "opentelemetry", "reqwest", "tracing", ] [[package]] name = "opentelemetry-otlp" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d899720fe06916ccba71c01d04ecd77312734e2de3467fd30d9d580c8ce85656" dependencies = [ "futures-core", "http 1.3.1", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk", "prost", "reqwest", "thiserror 2.0.12", "tokio", "tonic 0.12.3", "tracing", ] [[package]] name = "opentelemetry-proto" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c40da242381435e18570d5b9d50aca2a4f4f4d8e146231adb4e7768023309b3" dependencies = [ "opentelemetry", "opentelemetry_sdk", "prost", "tonic 0.12.3", ] [[package]] name = "opentelemetry_sdk" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdefb21d1d47394abc1ba6c57363ab141be19e27cc70d0e422b7f303e4d290b" dependencies = [ "futures-channel", "futures-executor", "futures-util", "glob", "opentelemetry", "percent-encoding", "rand 0.9.0", "serde_json", "thiserror 2.0.12", "tracing", ] [[package]] name = "outref" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking_lot" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", "windows-targets 0.52.6", ] [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbjson" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" dependencies = [ "base64 0.21.7", "serde", ] [[package]] name = "pbjson-build" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" dependencies = [ "heck", "itertools 0.13.0", "prost", "prost-types", ] [[package]] name = "pbjson-types" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" dependencies = [ "bytes", "chrono", "pbjson", "pbjson-build", "prost", "prost-build", "serde", ] [[package]] name = "pem" version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ "base64 0.22.1", "serde", ] [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", "indexmap 2.8.0", ] [[package]] name = "pin-project" version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pingora-pool" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bacdd5dbdec690d468856d988b170c8bb4ab62e0edefc0f432ba5e326489f421" dependencies = [ "crossbeam-queue", "log", "lru", "parking_lot", "pingora-timeout", "thread_local", "tokio", ] [[package]] name = "pingora-timeout" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "685bb8808cc1919c63a06ab14fdac9b84a4887ced49259a5c0adc8bfb2ffe558" dependencies = [ "once_cell", "parking_lot", "pin-project-lite", "thread_local", "tokio", ] [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppp" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a7a2049cd2570bd67bf0228e86bf850f8ceb5190a345c471d03a909da6049e0" dependencies = [ "thiserror 1.0.69", ] [[package]] name = "ppv-lite86" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy 0.8.23", ] [[package]] name = "prettyplease" version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" dependencies = [ "proc-macro2", "syn", ] [[package]] name = "proc-macro2" version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "prometheus-client" version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf41c1a7c32ed72abe5082fb19505b969095c12da9f5732a4bc9878757fd087c" dependencies = [ "dtoa", "itoa", "parking_lot", "prometheus-client-derive-encode", ] [[package]] name = "prometheus-client-derive-encode" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "prost" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", "prost-derive", ] [[package]] name = "prost-build" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ "heck", "itertools 0.14.0", "log", "multimap", "once_cell", "petgraph", "prettyplease", "prost", "prost-types", "regex", "syn", "tempfile", ] [[package]] name = "prost-derive" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", "itertools 0.14.0", "proc-macro2", "quote", "syn", ] [[package]] name = "prost-types" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" dependencies = [ "prost", ] [[package]] name = "quinn" version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" dependencies = [ "bytes", "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", "rustls 0.23.26", "socket2", "thiserror 2.0.12", "tokio", "tracing", "web-time", ] [[package]] name = "quinn-proto" version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" dependencies = [ "bytes", "getrandom 0.3.2", "rand 0.9.0", "ring", "rustc-hash 2.1.1", "rustls 0.23.26", "rustls-pki-types", "slab", "thiserror 2.0.12", "tinyvec", "tracing", "web-time", ] [[package]] name = "quinn-udp" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", "windows-sys 0.59.0", ] [[package]] name = "quote" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", ] [[package]] name = "rand" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", "zerocopy 0.8.23", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core 0.6.4", ] [[package]] name = "rand_chacha" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core 0.9.3", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom 0.2.15", ] [[package]] name = "rand_core" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.2", ] [[package]] name = "redox_syscall" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ "bitflags", ] [[package]] name = "regex" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.9", "regex-syntax 0.8.5", ] [[package]] name = "regex-automata" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ "regex-syntax 0.6.29", ] [[package]] name = "regex-automata" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", "regex-syntax 0.8.5", ] [[package]] name = "regex-lite" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-channel", "futures-core", "futures-util", "h2 0.4.9", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-tls", "hyper-util", "ipnet", "js-sys", "log", "mime", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls 0.23.26", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls 0.26.2", "tokio-util", "tower 0.5.2", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", "webpki-roots", "windows-registry", ] [[package]] name = "ring" version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rmcp" version = "0.1.5" source = "git+https://github.com/modelcontextprotocol/rust-sdk?rev=6a423048fa7f3da99190f28bcb2d6d8cdbb99bbe#6a423048fa7f3da99190f28bcb2d6d8cdbb99bbe" dependencies = [ "base64 0.21.7", "chrono", "futures", "paste", "pin-project-lite", "reqwest", "rmcp-macros", "schemars", "serde", "serde_json", "sse-stream", "thiserror 2.0.12", "tokio", "tokio-util", "tracing", "url", ] [[package]] name = "rmcp-macros" version = "0.1.5" source = "git+https://github.com/modelcontextprotocol/rust-sdk?rev=6a423048fa7f3da99190f28bcb2d6d8cdbb99bbe#6a423048fa7f3da99190f28bcb2d6d8cdbb99bbe" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "rust_decimal" version = "1.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faa7de2ba56ac291bd90c6b9bece784a52ae1411f9506544b3eae36dd2356d50" dependencies = [ "arrayvec", "num-traits", ] [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[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.59.0", ] [[package]] name = "rustix" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] [[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.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", "rustls-webpki 0.103.0", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", "rustls-pemfile 1.0.4", "schannel", "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", "security-framework 3.2.0", ] [[package]] name = "rustls-pemfile" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ "base64 0.21.7", ] [[package]] name = "rustls-pemfile" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ "rustls-pki-types", ] [[package]] name = "rustls-pki-types" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] [[package]] name = "rustls-webpki" version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", "untrusted", ] [[package]] name = "rustls-webpki" version = "0.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" dependencies = [ "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", ] [[package]] name = "rustversion" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "schemars" version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", "schemars_derive", "serde", "serde_json", ] [[package]] name = "schemars_derive" version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", "syn", ] [[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", ] [[package]] name = "secrecy" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" dependencies = [ "zeroize", ] [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework" version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ "bitflags", "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "seize" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "689224d06523904ebcc9b482c6a3f4f7fb396096645c4cd10c0d2ff7371a34d3" [[package]] name = "self_cell" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" [[package]] name = "semver" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_derive_internals" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", "ryu", "serde", ] [[package]] name = "serde_path_to_error" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", ] [[package]] name = "serde_regex" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" dependencies = [ "regex", "serde", ] [[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 = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ "indexmap 2.8.0", "itoa", "ryu", "serde", "unsafe-libyaml", ] [[package]] name = "sha1" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[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 = "signal-hook-registry" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "simple_asn1" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", "thiserror 2.0.12", "time", ] [[package]] name = "slab" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", ] [[package]] name = "split-iter" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f2b15926089e5526bb2dd738a2eb0e59034356e06eb71e1cd912358c0e62c4d" [[package]] name = "sse-stream" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "150ffbc62464270222a175e9d9ffae6ba2f5c5534da0fcd2d953f4b71dda9e08" dependencies = [ "bytes", "futures-util", "http-body 1.0.1", "http-body-util", "pin-project-lite", ] [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", "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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "system-configuration" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags", "core-foundation 0.9.4", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "tempfile" version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", "rustix 1.0.3", "windows-sys 0.59.0", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thiserror-impl" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thread_local" version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", ] [[package]] name = "time" version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", "serde", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tiny-keccak" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" dependencies = [ "crunchy", ] [[package]] name = "tinystr" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", ] [[package]] name = "tinyvec" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tls-listener" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab41256c16d6fc2b3021545f20bf77a73200b18bd54040ac656dddfca6205bfa" dependencies = [ "futures-util", "pin-project-lite", "thiserror 2.0.12", "tokio", ] [[package]] name = "tokio" version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tokio-native-tls" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", ] [[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.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls 0.23.26", "tokio", ] [[package]] name = "tokio-stream" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", "tokio", "tokio-util", ] [[package]] name = "tokio-util" version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", ] [[package]] name = "tonic" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-trait", "base64 0.22.1", "bytes", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost", "tokio", "tokio-stream", "tower 0.4.13", "tower-layer", "tower-service", "tracing", ] [[package]] name = "tonic" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85839f0b32fd242bb3209262371d07feda6d780d16ee9d2bc88581b89da1549b" dependencies = [ "async-trait", "axum", "base64 0.22.1", "bytes", "h2 0.4.9", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost", "socket2", "tokio", "tokio-stream", "tower 0.5.2", "tower-layer", "tower-service", "tracing", ] [[package]] name = "tonic-build" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d85f0383fadd15609306383a90e85eaed44169f931a5d2be1b42c76ceff1825e" dependencies = [ "prettyplease", "proc-macro2", "prost-build", "prost-types", "quote", "syn", ] [[package]] name = "tower" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", "indexmap 1.9.3", "pin-project", "pin-project-lite", "rand 0.8.5", "slab", "tokio", "tokio-util", "tower-layer", "tower-service", "tracing", ] [[package]] name = "tower" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", "indexmap 2.8.0", "pin-project-lite", "slab", "sync_wrapper", "tokio", "tokio-util", "tower-layer", "tower-service", "tracing", ] [[package]] name = "tower-http" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "bitflags", "bytes", "http 1.3.1", "http-body 1.0.1", "http-body-util", "pin-project-lite", "tower-layer", "tower-service", ] [[package]] name = "tower-layer" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-serve-static" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "148022c3d604d85a3b558ef7154aa90aaec5f9506beae64f6ad4e856306d287f" dependencies = [ "bytes", "futures-util", "http 1.3.1", "http-body 1.0.1", "http-body-util", "include_dir", "mime", "mime_guess", "percent-encoding", "pin-project", "tokio", "tokio-util", "tower-service", ] [[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.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-appender" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 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-serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", "once_cell", "regex", "serde", "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", "tracing-serde", ] [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicase" version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unsafe-libyaml" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[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.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] [[package]] name = "urlencoding" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf16_iter" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" 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 = "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.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] [[package]] name = "wasm-bindgen" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 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.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "web-time" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "webpki-roots" version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" 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 = "widestring" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ "windows-core 0.57.0", "windows-targets 0.52.6", ] [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-core" version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ "windows-implement", "windows-interface", "windows-result 0.1.2", "windows-targets 0.52.6", ] [[package]] name = "windows-implement" version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-interface" version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-link" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" [[package]] name = "windows-registry" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result 0.3.1", "windows-strings", "windows-targets 0.53.0", ] [[package]] name = "windows-result" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-result" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ "windows-link", ] [[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", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[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_i686_gnullvm 0.52.6", "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", ] [[package]] name = "windows-targets" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" dependencies = [ "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", "windows_i686_gnullvm 0.53.0", "windows_i686_msvc 0.53.0", "windows_x86_64_gnu 0.53.0", "windows_x86_64_gnullvm 0.53.0", "windows_x86_64_msvc 0.53.0", ] [[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_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[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_gnu" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[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_gnullvm" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ "memchr", ] [[package]] name = "wiremock" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "101681b74cd87b5899e87bcf5a64e83334dd313fcd3053ea72e6dba18928e301" dependencies = [ "assert-json-diff", "async-trait", "base64 0.22.1", "deadpool", "futures", "http 1.3.1", "http-body-util", "hyper 1.6.0", "hyper-util", "log", "once_cell", "regex", "serde", "serde_json", "tokio", "url", ] [[package]] name = "wit-bindgen-rt" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags", ] [[package]] name = "write16" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xmlparser" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "yoke" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", "yoke-derive", "zerofrom", ] [[package]] name = "yoke-derive" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zerocopy" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive 0.7.35", ] [[package]] name = "zerocopy" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" dependencies = [ "zerocopy-derive 0.8.23", ] [[package]] name = "zerocopy-derive" version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zerocopy-derive" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zerofrom" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zerovec" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ "yoke", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", "syn", ] ``` ## /Cargo.toml ```toml path="/Cargo.toml" [workspace] resolver = "2" members = [ "crates/a2a-sdk", "crates/core", "crates/xds", "crates/hbone", "crates/proxy", "crates/agentproxy", "crates/agentgateway" ] [workspace.package] version = "0.4.12" edition = "2024" rust-version = "1.85" license = "Apache-2.0" publish = false [workspace.dependencies] a2a-sdk = { version = "0.4.0", path = "crates/a2a-sdk" } agent-core = { path = "crates/core" } agent-hbone = { path = "crates/hbone" } agent-xds = { path = "crates/xds" } agent-proxy = { path = "crates/proxy" } anyhow = "1.0" arcstr = { version = "1.2", features = ["serde"] } async-stream = "0.3.6" async-trait = "0.1" aws-config = "1.6.1" aws-sdk-lambda = "1.67.0" aws-smithy-runtime-api = "1.7.4" axum = { version = "0.8" , features = ["macros"] } axum-core = "0.5.2" axum-extra = { version = "0.10" , features = ["json-lines", "typed-header"] } base64 = "0.22" bytes = { version = "1.10.1", features = ["serde"] } chrono = { version = "0.4.40", features = ["serde"] } clap = { version = "4.5", features = ["derive"] } eventsource-stream = "0.2.3" flurry = "0.5.2" futures = "0.3.31" futures-core = "0.3" futures-util = "0.3.31" google-cloud-auth = "0.18.0" h2 = "0.4.9" headers = "0.4" hex = "0.4.3" homedir = "0.3.4" http = "1.3.1" http-body = "1" http-body-util = "0.1.3" hyper = { version = "1.6" , features = ["full"] } hyper-util = { version = "0.1", features = ["full"] } include_dir = "0.7.4" ipnet = { version = "2.11", features = ["serde"] } itertools = "0.14" jsonwebtoken = "9.3" lazy_static = "1.4" mime = "0.3.17" minijinja = { version = "2.9.0" , features = ["loader"]} once_cell = "1.21.3" openapiv3 = "2.0.0" opentelemetry = "0.29" opentelemetry-http = "0.29" opentelemetry-otlp = { version = "0.29" , features = ["grpc-tonic"] } opentelemetry_sdk = "0.29" pbjson = "0.7" pbjson-build = "0.7" pbjson-types = "0.7" pin-project-lite = "0.2.16" pingora-pool = "0.4.0" ppp = "2.3.0" prometheus-client = "0.23.1" prost = "0.13.5" prost-build = "0.13" prost-types = "0.13.5" rand = "0.9" regex = "1.11.1" reqwest = { version = "0.12.14", default-features = false, features = ["http2", "charset", "macos-system-configuration", "rustls-tls"] } rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk", rev = "6a423048fa7f3da99190f28bcb2d6d8cdbb99bbe", features = ["client", "transport-sse", "transport-child-process"] } rustc_version = "0.4" rustls = { version = "0.23.26", features = ["tls12", "ring"] } rustls-pemfile = "2.2" secrecy = "0.10.3" serde = { version = "1.0.219", features = ["derive", "rc"] } serde_json = "1.0.140" serde_regex = "1.1.0" serde_yaml = "0.9.34" split-iter = "0.1.0" sse-stream = "0.1.3" thiserror = "2.0.12" tls-listener = "0.11" tokio = { version = "1.44.2", features = ["full", "macros", "sync"] } tokio-rustls = { version = "0.26.2", default-features = false } tokio-stream = { version = "0.1", features = ["net", "sync"] } tokio-util = { version = "0.7", features = ["codec"] } tonic = { version = "0.13.0", features = ["prost", "codegen", "transport"] } tonic-build = { version = "0.13", features = ["prost", "transport"] } tower = { version = "0.5"} tower-http = { version = "0.5" , features = ["cors"] } tower-serve-static = "0.1.1" tracing = "0.1.41" tracing-core = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "registry", "json"] } tracing-appender = "0.2" tracing-log = "0.2" url = "2.5" wiremock = "0.6.3" duration-str = "0.17" ``` ## /Dockerfile ``` path="/Dockerfile" FROM docker.io/library/node:23.11.0-bookworm AS node WORKDIR /app COPY ui . RUN npm install RUN npm run build FROM docker.io/library/rust:1.86.0-slim-bookworm AS builder ARG TARGETARCH RUN apt-get update && apt-get install -y --no-install-recommends \ protobuf-compiler make libssl-dev pkg-config \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY Makefile Cargo.toml Cargo.lock ./ COPY crates ./crates COPY common ./common COPY --from=node /app/out ./ui/out RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry cargo fetch --locked RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry make build RUN strip target/release/agentgateway FROM gcr.io/distroless/cc-debian12 AS runner ARG TARGETARCH WORKDIR /app COPY --from=builder /app/target/release/agentgateway /app/agentgateway LABEL org.opencontainers.image.source=https://github.com/agentgateway/agentgateway LABEL org.opencontainers.image.description="Agent Gateway is an agentic network gateway." ENTRYPOINT ["/app/agentgateway"] ``` ## /Dockerfile.ext ```ext path="/Dockerfile.ext" ARG VERSION="latest" FROM ghcr.io/agentgateway/agentgateway:${VERSION} as source FROM ghcr.io/astral-sh/uv:0.6.5-debian-slim AS final COPY --from=source /app/agentgateway /bin/agentgateway ARG TARGETARCH RUN apt-get update && apt-get install -y --no-install-recommends \ git \ ca-certificates \ curl \ gnupg \ && update-ca-certificates \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /etc/apt/keyrings \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ && apt-get update \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* RUN uv python install 3.12 ENTRYPOINT ["/bin/agentgateway"] ``` ## /LICENSE ``` path="/LICENSE" Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2017 Solo.io, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ``` ## /Makefile ``` path="/Makefile" # Image configuration DOCKER_REGISTRY ?= ghcr.io DOCKER_REPO ?= agentgateway IMAGE_NAME ?= agentgateway VERSION ?= $(shell git describe --tags --always --dirty) IMAGE_TAG ?= $(VERSION) IMAGE_FULL_NAME ?= $(DOCKER_REGISTRY)/$(DOCKER_REPO)/$(IMAGE_NAME):$(IMAGE_TAG) DOCKER_BUILDER ?= docker DOCKER_BUILD_ARGS ?= KIND_CLUSTER_NAME ?= agentgateway # docker .PHONY: docker docker: $(DOCKER_BUILDER) build $(DOCKER_BUILD_ARGS) -t $(IMAGE_FULL_NAME) . .PHONY: docker-ext docker-ext: $(DOCKER_BUILDER) build $(DOCKER_BUILD_ARGS) -t $(IMAGE_FULL_NAME)-ext -f Dockerfile.ext . CARGO_BUILD_ARGS ?= # build .PHONY: build build: cargo build --release --features ui $(CARGO_BUILD_ARGS) # lint .PHONY: lint lint: cargo fmt --check cargo clippy --all-targets -- -D warnings # test .PHONY: test test: cargo test --all-targets # clean .PHONY: clean clean: cargo clean objects := $(wildcard examples/*/config.json) .PHONY: validate validate: $(objects) %/config.json: cargo run -- --mode=validate -f $*/config.json ``` ## /README.md
agentgateway
Discord Latest Release
The first full featured, enterprise-grade Agent Gateway.
--- **Key Features:** - [x] **Highly performant:** agentgateway is written in rust, and is designed from the ground up to handle any scale you can throw at it. - [x] **Security First:** agentgateway includes a robust MCP/A2A focused RBAC system. - [x] **Multi Tenant:** agentgateway supports multiple tenants, each with their own set of resources and users. - [x] **Dynamic:** agentgateway supports dynamic configuration updates via xDS, without any downtime. - [x] **Run Anywhere:** agentgateway can run anywhere, from a single machine to a large scale multi-tenant deployment. - [x] **Legacy API Support:** agentgateway can transform legacy APIs into MCP resources. Currently supports OpenAPI. (gRPC coming soon) - [x] **Open Source:** agentgateway is open source, and licensed under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0).
# Getting Started To get started with agentgateway, please check out the [Getting Started Guide](https://agentgateway.dev/docs/quickstart ). ## /common/scripts/get-agentproxy ``` path="/common/scripts/get-agentproxy" #!/usr/bin/env bash # Copyright The agentgateway Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # The install script is based off of the MIT-licensed script from glide, # the package manager for Go: https://github.com/Masterminds/glide.sh/blob/master/get : ${BINARY_NAME:="agentgateway"} : ${USE_SUDO:="true"} : ${DEBUG:="false"} : ${VERIFY_CHECKSUM:="true"} : ${AGENTGATEWAY_INSTALL_DIR:="/usr/local/bin"} HAS_CURL="$(type "curl" &> /dev/null && echo true || echo false)" HAS_WGET="$(type "wget" &> /dev/null && echo true || echo false)" HAS_OPENSSL="$(type "openssl" &> /dev/null && echo true || echo false)" HAS_GPG="$(type "gpg" &> /dev/null && echo true || echo false)" HAS_GIT="$(type "git" &> /dev/null && echo true || echo false)" HAS_TAR="$(type "tar" &> /dev/null && echo true || echo false)" HAS_JQ="$(type "jq" &> /dev/null && echo true || echo false)" # initArch discovers the architecture for this system. initArch() { ARCH=$(uname -m) case $ARCH in armv5*) ARCH="armv5";; armv6*) ARCH="armv6";; armv7*) ARCH="arm";; aarch64) ARCH="arm64";; x86) ARCH="386";; x86_64) ARCH="amd64";; i686) ARCH="386";; i386) ARCH="386";; esac } # initOS discovers the operating system for this system. initOS() { OS=$(echo `uname`|tr '[:upper:]' '[:lower:]') case "$OS" in # Minimalist GNU for Windows mingw*|cygwin*) OS='windows';; esac } # runs the given command as root (detects if we are root already) runAsRoot() { if [ $EUID -ne 0 -a "$USE_SUDO" = "true" ]; then sudo "${@}" else "${@}" fi } # verifySupported checks that the os/arch combination is supported for # binary builds, as well whether or not necessary tools are present. verifySupported() { local supported="darwin-amd64\ndarwin-arm64\nlinux-386\nlinux-amd64\nlinux-arm\nlinux-arm64\nlinux-ppc64le\nlinux-s390x\nlinux-riscv64\nwindows-amd64\nwindows-arm64" if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then echo "No prebuilt binary for ${OS}-${ARCH}." echo "To build from source, go to https://github.com/agentgateway/agentgateway" exit 1 fi if [ "${HAS_CURL}" != "true" ] && [ "${HAS_WGET}" != "true" ]; then echo "Either curl or wget is required" exit 1 fi if [ "${VERIFY_CHECKSUM}" == "true" ] && [ "${HAS_OPENSSL}" != "true" ]; then echo "In order to verify checksum, openssl must first be installed." echo "Please install openssl or set VERIFY_CHECKSUM=false in your environment." exit 1 fi if [ "${HAS_GIT}" != "true" ]; then echo "[WARNING] Could not find git. It is required for plugin installation." fi if [ "${HAS_TAR}" != "true" ]; then echo "[ERROR] Could not find tar. It is required to extract the agentgateway binary archive." exit 1 fi } # checkDesiredVersion checks if the desired version is available. checkDesiredVersion() { if [ "x$DESIRED_VERSION" == "x" ]; then # Get tag from release URL local latest_release_url="https://api.github.com/repos/agentgateway/agentgateway/releases/latest" local latest_release_response="" if [ "${HAS_CURL}" == "true" ]; then latest_release_response=$( curl -L --silent --show-error --fail "$latest_release_url" 2>&1 || true ) elif [ "${HAS_WGET}" == "true" ]; then latest_release_response=$( wget "$latest_release_url" -q -O - 2>&1 || true ) fi TAG=$( echo "$latest_release_response" | jq -r .tag_name | grep '^v[0-9]' ) if [ "x$TAG" == "x" ]; then printf "Could not retrieve the latest release tag information from %s: %s\n" "${latest_release_url}" "${latest_release_response}" exit 1 fi else TAG=$DESIRED_VERSION fi } # checkAgentGatewayInstalledVersion checks which version of is installed and # if it needs to be changed. checkAgentGatewayInstalledVersion() { if [[ -f "${AGENTGATEWAY_INSTALL_DIR}/${BINARY_NAME}" ]]; then local version=$("${AGENTGATEWAY_INSTALL_DIR}/${BINARY_NAME}" version --template="{{ .Version }}") if [[ "$version" == "$TAG" ]]; then echo "agentgateway ${version} is already ${DESIRED_VERSION:-latest}" return 0 else echo "agentgateway ${TAG} is available. Changing from version ${version}." return 1 fi else return 1 fi } # downloadFile downloads the latest binary package and also the checksum # for that binary. downloadFile() { AGENTGATEWAY_DIST="agentgateway-$OS-$ARCH" DOWNLOAD_URL="https://github.com/agentgateway/agentgateway/releases/download/$TAG/$AGENTGATEWAY_DIST" CHECKSUM_URL="$DOWNLOAD_URL.sha256" AGENTGATEWAY_TMP_ROOT="$(mktemp -dt agentgateway-installer-XXXXXX)" AGENTGATEWAY_TMP_FILE="$AGENTGATEWAY_TMP_ROOT/$AGENTGATEWAY_DIST" AGENTGATEWAY_SUM_FILE="$AGENTGATEWAY_TMP_ROOT/$AGENTGATEWAY_DIST.sha256" echo "Downloading $DOWNLOAD_URL" if [ "${HAS_CURL}" == "true" ]; then curl -SsL "$CHECKSUM_URL" -o "$AGENTGATEWAY_SUM_FILE" curl -SsL "$DOWNLOAD_URL" -o "$AGENTGATEWAY_TMP_FILE" elif [ "${HAS_WGET}" == "true" ]; then wget -q -O "$AGENTGATEWAY_SUM_FILE" "$CHECKSUM_URL" wget -q -O "$AGENTGATEWAY_TMP_FILE" "$DOWNLOAD_URL" fi } # verifyFile verifies the SHA256 checksum of the binary package # and the GPG signatures for both the package and checksum file # (depending on settings in environment). verifyFile() { if [ "${VERIFY_CHECKSUM}" == "true" ]; then verifyChecksum fi } # installFile installs the agentgateway binary. installFile() { echo "Preparing to install $BINARY_NAME into ${AGENTGATEWAY_INSTALL_DIR}" runAsRoot chmod +x "$AGENTGATEWAY_TMP_ROOT/$BINARY_NAME-$OS-$ARCH" runAsRoot cp "$AGENTGATEWAY_TMP_ROOT/$BINARY_NAME-$OS-$ARCH" "$AGENTGATEWAY_INSTALL_DIR/$BINARY_NAME" echo "$BINARY_NAME installed into $AGENTGATEWAY_INSTALL_DIR/$BINARY_NAME" } # verifyChecksum verifies the SHA256 checksum of the binary package. verifyChecksum() { printf "Verifying checksum... " local sum=$(openssl sha1 -sha256 ${AGENTGATEWAY_TMP_FILE} | awk '{print $2}') local expected_sum=$(cat ${AGENTGATEWAY_SUM_FILE} | awk '{print $1}') if [ "$sum" != "$expected_sum" ]; then echo "SHA sum of ${AGENTGATEWAY_TMP_FILE} does not match. Aborting." exit 1 fi echo "Done." } # fail_trap is executed if an error occurs. fail_trap() { result=$? if [ "$result" != "0" ]; then if [[ -n "$INPUT_ARGUMENTS" ]]; then echo "Failed to install $BINARY_NAME with the arguments provided: $INPUT_ARGUMENTS" help else echo "Failed to install $BINARY_NAME" fi echo -e "\tFor support, go to https://github.com/agentgateway/agentgateway." fi cleanup exit $result } # testVersion tests the installed client to make sure it is working. testVersion() { set +e AGENTGATEWAY="$(command -v $BINARY_NAME)" if [ "$?" = "1" ]; then echo "$BINARY_NAME not found. Is $AGENTGATEWAY_INSTALL_DIR on your "'$PATH?' exit 1 fi set -e } # help provides possible cli installation arguments help () { echo "Accepted cli arguments are:" echo -e "\t[--help|-h ] ->> prints this help" echo -e "\t[--version|-v ] . When not defined it fetches the latest release tag from the agentgateway GitHub repository" echo -e "\te.g. --version v3.0.0 or -v canary" echo -e "\t[--no-sudo] ->> install without sudo" } # cleanup temporary files to avoid https://github.com/helm/helm/issues/2977 cleanup() { if [[ -d "${AGENTGATEWAY_TMP_ROOT:-}" ]]; then rm -rf "$AGENTGATEWAY_TMP_ROOT" fi } # Execution #Stop execution on any error trap "fail_trap" EXIT set -e # Set debug if desired if [ "${DEBUG}" == "true" ]; then set -x fi # Parsing input arguments (if any) export INPUT_ARGUMENTS="${@}" set -u while [[ $# -gt 0 ]]; do case $1 in '--version'|-v) shift if [[ $# -ne 0 ]]; then export DESIRED_VERSION="${1}" if [[ "$1" != "v"* ]]; then echo "Expected version arg ('${DESIRED_VERSION}') to begin with 'v', fixing..." export DESIRED_VERSION="v${1}" fi else echo -e "Please provide the desired version. e.g. --version v0.1.0 or -v canary" exit 0 fi ;; '--no-sudo') USE_SUDO="false" ;; '--help'|-h) help exit 0 ;; *) exit 1 ;; esac shift done set +u initArch initOS verifySupported checkDesiredVersion if ! checkAgentGatewayInstalledVersion; then downloadFile verifyFile installFile fi testVersion cleanup ``` ## /common/scripts/report_build_info.sh ```sh path="/common/scripts/report_build_info.sh" #!/bin/bash if BUILD_GIT_REVISION=$(git rev-parse HEAD 2> /dev/null); then if [[ -z "${IGNORE_DIRTY_TREE}" ]] && [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then BUILD_GIT_REVISION=${BUILD_GIT_REVISION}"-dirty" fi else BUILD_GIT_REVISION=unknown fi # Check for local changes tree_status="Clean" if [[ -z "${IGNORE_DIRTY_TREE}" ]] && ! git diff-index --quiet HEAD --; then tree_status="Modified" fi GIT_DESCRIBE_TAG=$(git describe --tags --always) HUB=${HUB:-"ghcr.io/kagent-dev/mcp-relay"} # used by common/scripts/gobuild.sh echo "agentgateway.dev.buildVersion=${VERSION:-$BUILD_GIT_REVISION}" echo "agentgateway.dev.buildGitRevision=${BUILD_GIT_REVISION}" echo "agentgateway.dev.buildStatus=${tree_status}" echo "agentgateway.dev.buildTag=${GIT_DESCRIBE_TAG}" echo "agentgateway.dev.buildHub=${HUB}" echo "agentgateway.dev.buildOS=$(uname -s)" echo "agentgateway.dev.buildArch=$(uname -m)" ``` ## /crates/a2a-sdk/Cargo.toml ```toml path="/crates/a2a-sdk/Cargo.toml" [package] name = "a2a-sdk" version = "0.4.0" edition = "2024" description = "Unofficial Google A2A SDK" license = "MIT" [dependencies] serde.workspace = true serde_json.workspace = true chrono.workspace = true ``` ## /crates/a2a-sdk/src/jsonrpc.rs ```rs path="/crates/a2a-sdk/src/jsonrpc.rs" use serde::{Deserialize, Serialize}; use serde_json::Value; use std::fmt::Display; use std::sync::Arc; // JSON RPC serde inspired by https://github.com/4t145/rmcp/ #[allow(dead_code)] pub trait ConstString: Default { const VALUE: &str; fn as_string(&self) -> &'static str { Self::VALUE } } #[macro_export] macro_rules! const_string { ($name:ident = $value:literal) => { #[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] pub struct $name; impl ConstString for $name { const VALUE: &str = $value; } impl serde::Serialize for $name { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { $value.serialize(serializer) } } impl<'de> serde::Deserialize<'de> for $name { fn deserialize(deserializer: D) -> Result<$name, D::Error> where D: serde::Deserializer<'de>, { let s: String = serde::Deserialize::deserialize(deserializer)?; if s == $value { Ok($name) } else { Err(serde::de::Error::custom(format!(concat!( "expect const string value \"", $value, "\"" )))) } } } }; } const_string!(JsonRpcVersion2_0 = "2.0"); #[derive(Debug, Clone, Eq, PartialEq, Hash)] pub enum NumberOrString { Number(u32), String(Arc), } impl NumberOrString { pub fn into_json_value(self) -> Value { match self { NumberOrString::Number(n) => Value::Number(serde_json::Number::from(n)), NumberOrString::String(s) => Value::String(s.to_string()), } } } impl std::fmt::Display for NumberOrString { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { NumberOrString::Number(n) => Display::fmt(&n, f), NumberOrString::String(s) => Display::fmt(&s, f), } } } impl Serialize for NumberOrString { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { match self { NumberOrString::Number(n) => n.serialize(serializer), NumberOrString::String(s) => s.serialize(serializer), } } } impl<'de> Deserialize<'de> for NumberOrString { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let value: Value = Deserialize::deserialize(deserializer)?; match value { Value::Number(n) => Ok(NumberOrString::Number( n.as_u64() .ok_or(serde::de::Error::custom("Expect an integer"))? as u32, )), Value::String(s) => Ok(NumberOrString::String(s.into())), _ => Err(serde::de::Error::custom("Expect number or string")), } } } pub type RequestId = NumberOrString; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] pub struct JsonRpcRequest { pub jsonrpc: JsonRpcVersion2_0, pub id: RequestId, #[serde(flatten)] pub request: R, } #[derive(Debug, Clone)] pub struct Request { pub method: M, pub params: P, } impl Serialize for Request where M: Serialize, R: Serialize, { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { Proxy::serialize( &Proxy { method: &self.method, params: &self.params, }, serializer, ) } } #[derive(Serialize, Deserialize)] struct Proxy { method: M, params: P, } impl<'de, M, R> Deserialize<'de> for Request where M: Deserialize<'de>, R: Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let body = Proxy::deserialize(deserializer)?; Ok(Request { method: body.method, params: body.params, }) } } pub type JsonObject = serde_json::Map; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] pub struct JsonRpcResponse { pub jsonrpc: JsonRpcVersion2_0, pub id: RequestId, pub result: R, } ``` ## /crates/a2a-sdk/src/lib.rs ```rs path="/crates/a2a-sdk/src/lib.rs" #![allow(clippy::redundant_closure_call)] #![allow(clippy::needless_lifetimes)] #![allow(clippy::match_single_binding)] #![allow(clippy::clone_on_copy)] mod jsonrpc; use crate::jsonrpc::*; use serde::{Deserialize, Serialize}; use std::borrow::Cow; use std::fmt::Debug; use std::fmt::Display; use std::fmt::Formatter; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(untagged)] pub enum JsonRpcMessage { Request(JsonRpcRequest), Response(JsonRpcResponse), Error(JsonRpcError), } impl JsonRpcMessage { pub fn response(&self) -> Option<&A2aResponse> { match self { JsonRpcMessage::Request(_) => None, JsonRpcMessage::Response(resp) => Some(&resp.result), JsonRpcMessage::Error(_) => None, } } } #[derive(Debug, Serialize, Deserialize, Clone)] pub struct JsonRpcError { pub jsonrpc: JsonRpcVersion2_0, pub id: RequestId, pub error: ErrorData, } #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] pub struct ErrorCode(pub i32); /// Error information for JSON-RPC error responses. #[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] pub struct ErrorData { /// The error type that occurred. pub code: ErrorCode, /// A short description of the error. The message SHOULD be limited to a concise single sentence. pub message: Cow<'static, str>, /// Additional information about the error. The value of this member is defined by the /// sender (e.g. detailed error information, nested errors etc.). #[serde(skip_serializing_if = "Option::is_none")] pub data: Option, } // TODO: this is not complete, add the rest #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] #[serde(untagged)] pub enum A2aRequest { SendTaskRequest(SendTaskRequest), GetTaskRequest(GetTaskRequest), CancelTaskRequest(CancelTaskRequest), SendSubscribeTaskRequest(SendSubscribeTaskRequest), TaskPushNotificationGetRequest(TaskPushNotificationGetRequest), TaskPushNotificationSetRequest(TaskPushNotificationSetRequest), TaskResubscribeRequest(TaskResubscribeRequest), } impl A2aRequest { pub fn method(&self) -> &'static str { match self { A2aRequest::SendTaskRequest(i) => i.method.as_string(), A2aRequest::SendSubscribeTaskRequest(i) => i.method.as_string(), A2aRequest::GetTaskRequest(i) => i.method.as_string(), A2aRequest::CancelTaskRequest(i) => i.method.as_string(), A2aRequest::TaskPushNotificationGetRequest(i) => i.method.as_string(), A2aRequest::TaskPushNotificationSetRequest(i) => i.method.as_string(), A2aRequest::TaskResubscribeRequest(i) => i.method.as_string(), } } pub fn id(&self) -> String { match self { A2aRequest::SendTaskRequest(i) => i.params.id.clone(), A2aRequest::SendSubscribeTaskRequest(i) => i.params.id.clone(), A2aRequest::GetTaskRequest(i) => i.params.id.clone(), A2aRequest::CancelTaskRequest(i) => i.params.id.clone(), A2aRequest::TaskPushNotificationGetRequest(i) => i.params.id.clone(), A2aRequest::TaskPushNotificationSetRequest(i) => i.params.id.clone(), A2aRequest::TaskResubscribeRequest(i) => i.params.id.clone(), } } pub fn session_id(&self) -> Option { match self { A2aRequest::SendTaskRequest(i) => i.params.session_id.clone(), A2aRequest::SendSubscribeTaskRequest(i) => i.params.session_id.clone(), A2aRequest::GetTaskRequest(_) => None, A2aRequest::CancelTaskRequest(_) => None, A2aRequest::TaskPushNotificationGetRequest(_) => None, A2aRequest::TaskPushNotificationSetRequest(_) => None, A2aRequest::TaskResubscribeRequest(_) => None, } } } // TODO: this is not complete, add the rest #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] #[serde(untagged)] pub enum A2aResponse { SendTaskResponse(Option), SendTaskUpdateResponse(SendTaskStreamingResponseResult), } impl A2aResponse { pub fn id(&self) -> Option { match self { A2aResponse::SendTaskResponse(i) => i.as_ref().map(|i| i.id.clone()), A2aResponse::SendTaskUpdateResponse(SendTaskStreamingResponseResult::Status(i)) => { Some(i.id.clone()) }, A2aResponse::SendTaskUpdateResponse(SendTaskStreamingResponseResult::Artifact(i)) => { Some(i.id.clone()) }, A2aResponse::SendTaskUpdateResponse(SendTaskStreamingResponseResult::None) => None, } } } impl From for A2aRequest { fn from(value: SendTaskRequest) -> Self { Self::SendTaskRequest(value) } } impl From for A2aRequest { fn from(value: GetTaskRequest) -> Self { Self::GetTaskRequest(value) } } // impl From for A2aRequest { // fn from(value: CancelTaskRequest) -> Self { // Self::CancelTaskRequest(value) // } // } // impl From for A2aRequest { // fn from(value: SetTaskPushNotificationRequest) -> Self { // Self::SetTaskPushNotificationRequest(value) // } // } // impl From for A2aRequest { // fn from(value: GetTaskPushNotificationRequest) -> Self { // Self::GetTaskPushNotificationRequest(value) // } // } // impl From for A2aRequest { // fn from(value: TaskResubscriptionRequest) -> Self { // Self::TaskResubscriptionRequest(value) // } // } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct AgentAuthentication { #[serde(default, skip_serializing_if = "Option::is_none")] pub credentials: Option, pub schemes: Vec, } impl From<&AgentAuthentication> for AgentAuthentication { fn from(value: &AgentAuthentication) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug, Default)] pub struct AgentCapabilities { #[serde(rename = "pushNotifications", default)] pub push_notifications: bool, #[serde(rename = "stateTransitionHistory", default)] pub state_transition_history: bool, #[serde(default)] pub streaming: bool, } impl From<&AgentCapabilities> for AgentCapabilities { fn from(value: &AgentCapabilities) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct AgentCard { #[serde(default, skip_serializing_if = "Option::is_none")] pub authentication: Option, pub capabilities: AgentCapabilities, #[serde( rename = "defaultInputModes", default = "defaults::agent_card_default_input_modes" )] pub default_input_modes: Vec, #[serde( rename = "defaultOutputModes", default = "defaults::agent_card_default_output_modes" )] pub default_output_modes: Vec, #[serde(default, skip_serializing_if = "Option::is_none")] pub description: Option, #[serde( rename = "documentationUrl", default, skip_serializing_if = "Option::is_none" )] pub documentation_url: Option, pub name: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub provider: Option, pub skills: Vec, pub url: String, pub version: String, } impl From<&AgentCard> for AgentCard { fn from(value: &AgentCard) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct AgentProvider { pub organization: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub url: Option, } impl From<&AgentProvider> for AgentProvider { fn from(value: &AgentProvider) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct AgentSkill { #[serde(default, skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub examples: Option>, pub id: String, #[serde( rename = "inputModes", default, skip_serializing_if = "Option::is_none" )] pub input_modes: Option>, pub name: String, #[serde( rename = "outputModes", default, skip_serializing_if = "Option::is_none" )] pub output_modes: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] pub tags: Option>, } impl From<&AgentSkill> for AgentSkill { fn from(value: &AgentSkill) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct Artifact { #[serde(default, skip_serializing_if = "Option::is_none")] pub append: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(default)] pub index: i64, #[serde(rename = "lastChunk", default, skip_serializing_if = "Option::is_none")] pub last_chunk: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, #[serde(default, skip_serializing_if = "Option::is_none")] pub name: Option, pub parts: Vec, } impl From<&Artifact> for Artifact { fn from(value: &Artifact) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct AuthenticationInfo { #[serde(default, skip_serializing_if = "Option::is_none")] pub credentials: Option, pub schemes: Vec, } impl From<&AuthenticationInfo> for AuthenticationInfo { fn from(value: &AuthenticationInfo) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct DataPart { pub data: ::serde_json::Map, } impl From<&DataPart> for DataPart { fn from(value: &DataPart) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug, Default)] pub struct FileContent { #[serde(default, skip_serializing_if = "Option::is_none")] pub bytes: Option, #[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")] pub mime_type: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub name: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub uri: Option, } impl From<&FileContent> for FileContent { fn from(value: &FileContent) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct FilePart { pub file: FileContent, } impl From<&FilePart> for FilePart { fn from(value: &FilePart) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] #[serde(untagged)] pub enum Id { Variant0(i64), Variant1(String), Variant2, } impl From<&Self> for Id { fn from(value: &Id) -> Self { value.clone() } } impl From for Id { fn from(value: i64) -> Self { Self::Variant0(value) } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct InternalError { pub code: i64, #[serde(default, skip_serializing_if = "Option::is_none")] pub data: Option<::serde_json::Value>, pub message: String, } impl From<&InternalError> for InternalError { fn from(value: &InternalError) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct InvalidParamsError { pub code: i64, #[serde(default, skip_serializing_if = "Option::is_none")] pub data: Option<::serde_json::Value>, pub message: String, } impl From<&InvalidParamsError> for InvalidParamsError { fn from(value: &InvalidParamsError) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct InvalidRequestError { pub code: i64, #[serde(default, skip_serializing_if = "Option::is_none")] pub data: Option<::serde_json::Value>, pub message: String, } impl From<&InvalidRequestError> for InvalidRequestError { fn from(value: &InvalidRequestError) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct Message { #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, pub parts: Vec, pub role: Role, } impl From<&Message> for Message { fn from(value: &Message) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct MethodNotFoundError { pub code: i64, pub data: ::serde_json::Value, pub message: String, } impl From<&MethodNotFoundError> for MethodNotFoundError { fn from(value: &MethodNotFoundError) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct Part { #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, #[serde(flatten)] pub r#type: PartType, } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] #[serde(tag = "type")] pub enum PartType { #[serde(rename = "text")] TextPart(TextPart), #[serde(rename = "file")] FilePart(FilePart), #[serde(rename = "data")] DataPart(DataPart), } impl From<&Self> for Part { fn from(value: &Part) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct PushNotificationConfig { #[serde(default, skip_serializing_if = "Option::is_none")] pub authentication: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub token: Option, pub url: String, } impl From<&PushNotificationConfig> for PushNotificationConfig { fn from(value: &PushNotificationConfig) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct PushNotificationNotSupportedError { pub code: i64, pub data: ::serde_json::Value, pub message: String, } impl From<&PushNotificationNotSupportedError> for PushNotificationNotSupportedError { fn from(value: &PushNotificationNotSupportedError) -> Self { value.clone() } } #[derive( serde::Deserialize, serde::Serialize, Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, )] pub enum Role { #[serde(rename = "user")] User, #[serde(rename = "agent")] Agent, } impl From<&Self> for Role { fn from(value: &Role) -> Self { value.clone() } } impl Display for Role { fn fmt(&self, f: &mut Formatter<'_>) -> ::std::fmt::Result { match *self { Self::User => write!(f, "user"), Self::Agent => write!(f, "agent"), } } } impl ::std::str::FromStr for Role { type Err = self::error::ConversionError; fn from_str(value: &str) -> Result { match value { "user" => Ok(Self::User), "agent" => Ok(Self::Agent), _ => Err("invalid value".into()), } } } impl TryFrom<&str> for Role { type Error = self::error::ConversionError; fn try_from(value: &str) -> Result { value.parse() } } impl TryFrom<&String> for Role { type Error = self::error::ConversionError; fn try_from(value: &String) -> Result { value.parse() } } impl TryFrom for Role { type Error = self::error::ConversionError; fn try_from(value: String) -> Result { value.parse() } } const_string!(CancelTaskRequestMethod = "tasks/cancel"); pub type CancelTaskRequest = Request; const_string!(GetTaskRequestMethod = "tasks/get"); pub type GetTaskRequest = Request; const_string!(SendTaskRequestMethod = "tasks/send"); pub type SendTaskRequest = Request; const_string!(SendSubscribeTaskRequestMethod = "tasks/sendSubscribe"); pub type SendSubscribeTaskRequest = Request; const_string!(TaskResubscribeRequestMethod = "tasks/resubscribe"); pub type TaskResubscribeRequest = Request; const_string!(TaskPushNotificationGetRequestMethod = "tasks/pushNotification/get"); pub type TaskPushNotificationGetRequest = Request; const_string!(TaskPushNotificationSetRequestMethod = "tasks/pushNotification/set"); pub type TaskPushNotificationSetRequest = Request; #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] #[serde(untagged)] #[derive(Default)] pub enum SendTaskStreamingResponseResult { Status(TaskStatusUpdateEvent), Artifact(TaskArtifactUpdateEvent), #[default] None, } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct Task { #[serde(default, skip_serializing_if = "Option::is_none")] pub artifacts: Option>, pub id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, #[serde(rename = "sessionId", default, skip_serializing_if = "Option::is_none")] pub session_id: Option, pub status: TaskStatus, pub history: Option>, } impl From<&Task> for Task { fn from(value: &Task) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskArtifactUpdateEvent { pub artifact: Artifact, pub id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, } impl From<&TaskArtifactUpdateEvent> for TaskArtifactUpdateEvent { fn from(value: &TaskArtifactUpdateEvent) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskIdParams { pub id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, } impl From<&TaskIdParams> for TaskIdParams { fn from(value: &TaskIdParams) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskNotCancelableError { pub code: i64, pub data: ::serde_json::Value, pub message: String, } impl From<&TaskNotCancelableError> for TaskNotCancelableError { fn from(value: &TaskNotCancelableError) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskNotFoundError { pub code: i64, pub data: ::serde_json::Value, pub message: String, } impl From<&TaskNotFoundError> for TaskNotFoundError { fn from(value: &TaskNotFoundError) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskPushNotificationConfig { pub id: String, #[serde(rename = "pushNotificationConfig")] pub push_notification_config: PushNotificationConfig, } impl From<&TaskPushNotificationConfig> for TaskPushNotificationConfig { fn from(value: &TaskPushNotificationConfig) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskQueryParams { #[serde( rename = "historyLength", default, skip_serializing_if = "Option::is_none" )] pub history_length: Option, pub id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, } impl From<&TaskQueryParams> for TaskQueryParams { fn from(value: &TaskQueryParams) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskSendParams { #[serde( rename = "historyLength", default, skip_serializing_if = "Option::is_none" )] pub history_length: Option, pub id: String, pub message: Message, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, #[serde( rename = "pushNotification", default, skip_serializing_if = "Option::is_none" )] pub push_notification: Option, #[serde(rename = "sessionId", default, skip_serializing_if = "Option::is_none")] pub session_id: Option, } impl From<&TaskSendParams> for TaskSendParams { fn from(value: &TaskSendParams) -> Self { value.clone() } } #[derive( serde::Deserialize, serde::Serialize, Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, )] pub enum TaskState { #[serde(rename = "submitted")] Submitted, #[serde(rename = "working")] Working, #[serde(rename = "input-required")] InputRequired, #[serde(rename = "completed")] Completed, #[serde(rename = "canceled")] Canceled, #[serde(rename = "failed")] Failed, #[serde(rename = "unknown")] Unknown, } impl From<&Self> for TaskState { fn from(value: &TaskState) -> Self { value.clone() } } impl Display for TaskState { fn fmt(&self, f: &mut Formatter<'_>) -> ::std::fmt::Result { match *self { Self::Submitted => write!(f, "submitted"), Self::Working => write!(f, "working"), Self::InputRequired => write!(f, "input-required"), Self::Completed => write!(f, "completed"), Self::Canceled => write!(f, "canceled"), Self::Failed => write!(f, "failed"), Self::Unknown => write!(f, "unknown"), } } } impl ::std::str::FromStr for TaskState { type Err = self::error::ConversionError; fn from_str(value: &str) -> Result { match value { "submitted" => Ok(Self::Submitted), "working" => Ok(Self::Working), "input-required" => Ok(Self::InputRequired), "completed" => Ok(Self::Completed), "canceled" => Ok(Self::Canceled), "failed" => Ok(Self::Failed), "unknown" => Ok(Self::Unknown), _ => Err("invalid value".into()), } } } impl TryFrom<&str> for TaskState { type Error = self::error::ConversionError; fn try_from(value: &str) -> Result { value.parse() } } impl TryFrom<&String> for TaskState { type Error = self::error::ConversionError; fn try_from(value: &String) -> Result { value.parse() } } impl TryFrom for TaskState { type Error = self::error::ConversionError; fn try_from(value: String) -> Result { value.parse() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskStatus { #[serde(default, skip_serializing_if = "Option::is_none")] pub message: Option, pub state: TaskState, #[serde(default, skip_serializing_if = "Option::is_none")] pub timestamp: Option, } impl From<&TaskStatus> for TaskStatus { fn from(value: &TaskStatus) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TaskStatusUpdateEvent { #[serde(rename = "final", default)] pub final_: bool, pub id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option<::serde_json::Map>, pub status: TaskStatus, } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct TextPart { pub text: String, } impl From<&TextPart> for TextPart { fn from(value: &TextPart) -> Self { value.clone() } } #[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct UnsupportedOperationError { pub code: i64, pub data: ::serde_json::Value, pub message: String, } impl From<&UnsupportedOperationError> for UnsupportedOperationError { fn from(value: &UnsupportedOperationError) -> Self { value.clone() } } pub mod defaults { pub(super) fn agent_card_default_input_modes() -> Vec { vec!["text".to_string()] } pub(super) fn agent_card_default_output_modes() -> Vec { vec!["text".to_string()] } } pub mod error { use std::fmt::Display; use std::fmt::{Debug, Formatter}; pub struct ConversionError(::std::borrow::Cow<'static, str>); impl ::std::error::Error for ConversionError {} impl Display for ConversionError { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), ::std::fmt::Error> { Display::fmt(&self.0, f) } } impl Debug for ConversionError { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), ::std::fmt::Error> { Debug::fmt(&self.0, f) } } impl From<&'static str> for ConversionError { fn from(value: &'static str) -> Self { Self(value.into()) } } impl From for ConversionError { fn from(value: String) -> Self { Self(value.into()) } } } #[cfg(test)] mod tests { #[test] fn test_serde() { let js = serde_json::json! { { "jsonrpc": "2.0", "id": "d1306567eb364c7ba9e7a7b922dba672", "result": { "id": "8b34914c735a464986e1d5ce5b6ec478", "status": { "state": "completed", "message": { "role": "agent", "parts": [ { "type": "text", "text": "Hello!" } ] }, "timestamp": "2025-04-10T15:07:15.833777" }, "final": false } } }; let _: crate::JsonRpcMessage = serde_json::from_value(js).unwrap(); } } ``` ## /crates/agentgateway/Cargo.toml ```toml path="/crates/agentgateway/Cargo.toml" [package] name = "agentgateway" version = { workspace = true } license = { workspace = true } edition = { workspace = true } publish = { workspace = true } default-run = "agentgateway" [features] default = [] gcp = ["dep:google-cloud-auth"] aws = ["dep:aws-config", "dep:aws-sdk-lambda", "dep:aws-smithy-runtime-api"] ui = ["dep:include_dir", "dep:tower-serve-static"] [dependencies] agent-core.workspace = true a2a-sdk.workspace = true anyhow.workspace = true arcstr.workspace = true async-stream.workspace = true async-trait.workspace = true aws-config = { workspace = true, optional = true } aws-sdk-lambda = { workspace = true, optional = true } aws-smithy-runtime-api = { workspace = true, optional = true } axum.workspace = true axum-extra.workspace = true base64.workspace = true bytes.workspace = true clap.workspace = true eventsource-stream.workspace = true futures.workspace = true google-cloud-auth = { workspace = true, optional = true } headers.workspace = true homedir.workspace = true http.workspace = true include_dir = { workspace = true, optional = true } itertools.workspace = true jsonwebtoken.workspace = true lazy_static.workspace = true mime.workspace = true once_cell.workspace = true openapiv3.workspace = true opentelemetry.workspace = true opentelemetry-http.workspace = true opentelemetry-otlp.workspace = true opentelemetry_sdk.workspace = true pbjson.workspace = true pbjson-types.workspace = true ppp.workspace = true prometheus-client.workspace = true prost.workspace = true rand.workspace = true regex.workspace = true reqwest.workspace = true rmcp.workspace = true rustls.workspace = true secrecy.workspace = true serde.workspace = true serde_json.workspace = true serde_yaml.workspace = true sse-stream.workspace = true thiserror.workspace = true tls-listener.workspace = true tokio.workspace = true tokio-rustls.workspace = true tokio-stream.workspace = true tokio-util.workspace = true tonic.workspace = true tower-http.workspace = true tower-serve-static = { workspace = true, optional = true } tracing.workspace = true tracing-subscriber.workspace = true [build-dependencies] tonic-build.workspace = true prost-build.workspace = true anyhow.workspace = true rustc_version.workspace = true pbjson-build.workspace = true [lib] path = "src/lib.rs" bench = false [[bin]] name = "agentgateway" path = "src/main.rs" bench = false [dev-dependencies] serde_json.workspace = true tokio.workspace = true wiremock.workspace = true ``` ## /crates/agentgateway/build.rs ```rs path="/crates/agentgateway/build.rs" use std::env; // This build script is used to generate the rust source files that // we need for XDS GRPC communication. fn main() -> Result<(), anyhow::Error> { // Fuzzing uses custom cfg (https://rust-fuzz.github.io/book/cargo-fuzz/guide.html) // Tell cargo to expect this (https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html). println!("cargo::rustc-check-cfg=cfg(fuzzing)"); let proto_files = [ "proto/a2a/target.proto", "proto/mcp/target.proto", "proto/xds.proto", "proto/common.proto", "proto/listener.proto", "proto/rbac.proto", ] .iter() .map(|name| std::env::current_dir().unwrap().join(name)) .collect::>(); let include_dirs = ["proto/"] .iter() .map(|i| std::env::current_dir().unwrap().join(i)) .collect::>(); let config = { let mut c = prost_build::Config::new(); c.disable_comments(Some(".")); c }; let out_dir = env::var("OUT_DIR").unwrap(); let descriptor_path = std::path::PathBuf::from(out_dir.clone()).join("proto_descriptor.bin"); tonic_build::configure() .build_server(true) .file_descriptor_set_path(descriptor_path.clone()) .compile_well_known_types(true) .extern_path(".google.protobuf", "::pbjson_types") .compile_protos_with_config( config, &proto_files .iter() .map(|path| path.to_str().unwrap()) .collect::>(), &include_dirs .iter() .map(|p| p.to_str().unwrap()) .collect::>(), )?; // This tells cargo to re-run this build script only when the proto files // we're interested in change or the any of the proto directories were updated. for path in [proto_files, include_dirs].concat() { println!("cargo:rerun-if-changed={}", path.to_str().unwrap()); } let descriptor_set = std::fs::read(descriptor_path).expect("descriptors not present"); pbjson_build::Builder::new() .register_descriptors(&descriptor_set)? .preserve_proto_field_names() .emit_fields() .build(&[ ".agentgateway.dev.a2a.target", ".agentgateway.dev.mcp.target", ".agentgateway.dev.common", ".agentgateway.dev.listener", ".agentgateway.dev.rbac", ])?; Ok(()) } ``` ## /crates/agentgateway/proto/a2a/target.proto ```proto path="/crates/agentgateway/proto/a2a/target.proto" syntax = "proto3"; package agentgateway.dev.a2a.target; import "common.proto"; message Target { // The listeners which are allowed to connect to the target. repeated string listeners = 1; // The name of the target. string name = 2; // The host of the target. string host = 3; // The port of the target. uint32 port = 4; // The path of the target. string path = 5; // The headers of the target. repeated agentgateway.dev.common.Header headers = 6; // The auth of the target. agentgateway.dev.common.BackendAuth auth = 7; // The tls of the target. agentgateway.dev.common.BackendTls tls = 8; } ``` ## /crates/agentgateway/proto/common.proto ```proto path="/crates/agentgateway/proto/common.proto" syntax = "proto3"; import "google/protobuf/duration.proto"; import "google/protobuf/empty.proto"; package agentgateway.dev.common; message LocalDataSource { oneof source { string file_path = 1; bytes inline = 2; } } message RemoteDataSource { string url = 1; uint32 port = 2; string path = 3; repeated Header headers = 4; google.protobuf.Duration initial_timeout = 5; google.protobuf.Duration refresh_interval = 6; } message BackendAuth { oneof auth { // Passthrough the Auth header google.protobuf.Empty passthrough = 1; // Use GCP auth google.protobuf.Empty GCP = 2; } } message BackendTls { bool insecure_skip_verify = 1; } message Header { string key = 1; oneof value { string string_value = 2; string env_value = 3; } } ``` ## /crates/agentgateway/proto/google/protobuf/any.proto ```proto path="/crates/agentgateway/proto/google/protobuf/any.proto" // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. syntax = "proto3"; package google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option go_package = "github.com/golang/protobuf/ptypes/any"; option java_package = "com.google.protobuf"; option java_outer_classname = "AnyProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // `Any` contains an arbitrary serialized protocol buffer message along with a // URL that describes the type of the serialized message. // // Protobuf library provides support to pack/unpack Any values in the form // of utility functions or additional generated methods of the Any type. // // Example 1: Pack and unpack a message in C++. // // Foo foo = ...; // Any any; // any.PackFrom(foo); // ... // if (any.UnpackTo(&foo)) { // ... // } // // Example 2: Pack and unpack a message in Java. // // Foo foo = ...; // Any any = Any.pack(foo); // ... // if (any.is(Foo.class)) { // foo = any.unpack(Foo.class); // } // // Example 3: Pack and unpack a message in Python. // // foo = Foo(...) // any = Any() // any.Pack(foo) // ... // if any.Is(Foo.DESCRIPTOR): // any.Unpack(foo) // ... // // Example 4: Pack and unpack a message in Go // // foo := &pb.Foo{...} // any, err := ptypes.MarshalAny(foo) // ... // foo := &pb.Foo{} // if err := ptypes.UnmarshalAny(any, foo); err != nil { // ... // } // // The pack methods provided by protobuf library will by default use // 'type.googleapis.com/full.type.name' as the type URL and the unpack // methods only use the fully qualified type name after the last '/' // in the type URL, for example "foo.bar.com/x/y.z" will yield type // name "y.z". // // // JSON // ==== // The JSON representation of an `Any` value uses the regular // representation of the deserialized, embedded message, with an // additional field `@type` which contains the type URL. Example: // // package google.profile; // message Person { // string first_name = 1; // string last_name = 2; // } // // { // "@type": "type.googleapis.com/google.profile.Person", // "firstName": , // "lastName": // } // // If the embedded message type is well-known and has a custom JSON // representation, that representation will be embedded adding a field // `value` which holds the custom JSON in addition to the `@type` // field. Example (for message [google.protobuf.Duration][]): // // { // "@type": "type.googleapis.com/google.protobuf.Duration", // "value": "1.212s" // } // message Any { // A URL/resource name that uniquely identifies the type of the serialized // protocol buffer message. This string must contain at least // one "/" character. The last segment of the URL's path must represent // the fully qualified name of the type (as in // `path/google.protobuf.Duration`). The name should be in a canonical form // (e.g., leading "." is not accepted). // // In practice, teams usually precompile into the binary all types that they // expect it to use in the context of Any. However, for URLs which use the // scheme `http`, `https`, or no scheme, one can optionally set up a type // server that maps type URLs to message definitions as follows: // // * If no scheme is provided, `https` is assumed. // * An HTTP GET on the URL must yield a [google.protobuf.Type][] // value in binary format, or produce an error. // * Applications are allowed to cache lookup results based on the // URL, or have them precompiled into a binary to avoid any // lookup. Therefore, binary compatibility needs to be preserved // on changes to types. (Use versioned type names to manage // breaking changes.) // // Note: this functionality is not currently available in the official // protobuf release, and it is not used for type URLs beginning with // type.googleapis.com. // // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. // string type_url = 1; // Must be a valid serialized protocol buffer of the above specified type. bytes value = 2; } ``` ## /crates/agentgateway/proto/google/protobuf/duration.proto ```proto path="/crates/agentgateway/proto/google/protobuf/duration.proto" // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. syntax = "proto3"; package google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/duration"; option java_package = "com.google.protobuf"; option java_outer_classname = "DurationProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // A Duration represents a signed, fixed-length span of time represented // as a count of seconds and fractions of seconds at nanosecond // resolution. It is independent of any calendar and concepts like "day" // or "month". It is related to Timestamp in that the difference between // two Timestamp values is a Duration and it can be added or subtracted // from a Timestamp. Range is approximately +-10,000 years. // // # Examples // // Example 1: Compute Duration from two Timestamps in pseudo code. // // Timestamp start = ...; // Timestamp end = ...; // Duration duration = ...; // // duration.seconds = end.seconds - start.seconds; // duration.nanos = end.nanos - start.nanos; // // if (duration.seconds < 0 && duration.nanos > 0) { // duration.seconds += 1; // duration.nanos -= 1000000000; // } else if (duration.seconds > 0 && duration.nanos < 0) { // duration.seconds -= 1; // duration.nanos += 1000000000; // } // // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. // // Timestamp start = ...; // Duration duration = ...; // Timestamp end = ...; // // end.seconds = start.seconds + duration.seconds; // end.nanos = start.nanos + duration.nanos; // // if (end.nanos < 0) { // end.seconds -= 1; // end.nanos += 1000000000; // } else if (end.nanos >= 1000000000) { // end.seconds += 1; // end.nanos -= 1000000000; // } // // Example 3: Compute Duration from datetime.timedelta in Python. // // td = datetime.timedelta(days=3, minutes=10) // duration = Duration() // duration.FromTimedelta(td) // // # JSON Mapping // // In JSON format, the Duration type is encoded as a string rather than an // object, where the string ends in the suffix "s" (indicating seconds) and // is preceded by the number of seconds, with nanoseconds expressed as // fractional seconds. For example, 3 seconds with 0 nanoseconds should be // encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should // be expressed in JSON format as "3.000000001s", and 3 seconds and 1 // microsecond should be expressed in JSON format as "3.000001s". // // message Duration { // Signed seconds of the span of time. Must be from -315,576,000,000 // to +315,576,000,000 inclusive. Note: these bounds are computed from: // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years int64 seconds = 1; // Signed fractions of a second at nanosecond resolution of the span // of time. Durations less than one second are represented with a 0 // `seconds` field and a positive or negative `nanos` field. For durations // of one second or more, a non-zero value for the `nanos` field must be // of the same sign as the `seconds` field. Must be from -999,999,999 // to +999,999,999 inclusive. int32 nanos = 2; } ``` ## /crates/agentgateway/proto/google/protobuf/empty.proto ```proto path="/crates/agentgateway/proto/google/protobuf/empty.proto" // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. syntax = "proto3"; package google.protobuf; option go_package = "google.golang.org/protobuf/types/known/emptypb"; option java_package = "com.google.protobuf"; option java_outer_classname = "EmptyProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; // A generic empty message that you can re-use to avoid defining duplicated // empty messages in your APIs. A typical example is to use it as the request // or the response type of an API method. For instance: // // service Foo { // rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); // } // message Empty {} ``` ## /crates/agentgateway/proto/google/protobuf/struct.proto ```proto path="/crates/agentgateway/proto/google/protobuf/struct.proto" // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. syntax = "proto3"; package google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "google.golang.org/protobuf/types/known/structpb"; option java_package = "com.google.protobuf"; option java_outer_classname = "StructProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // `Struct` represents a structured data value, consisting of fields // which map to dynamically typed values. In some languages, `Struct` // might be supported by a native representation. For example, in // scripting languages like JS a struct is represented as an // object. The details of that representation are described together // with the proto support for the language. // // The JSON representation for `Struct` is JSON object. message Struct { // Unordered map of dynamically typed values. map fields = 1; } // `Value` represents a dynamically typed value which can be either // null, a number, a string, a boolean, a recursive struct value, or a // list of values. A producer of value is expected to set one of these // variants. Absence of any variant indicates an error. // // The JSON representation for `Value` is JSON value. message Value { // The kind of value. oneof kind { // Represents a null value. NullValue null_value = 1; // Represents a double value. double number_value = 2; // Represents a string value. string string_value = 3; // Represents a boolean value. bool bool_value = 4; // Represents a structured value. Struct struct_value = 5; // Represents a repeated `Value`. ListValue list_value = 6; } } // `NullValue` is a singleton enumeration to represent the null value for the // `Value` type union. // // The JSON representation for `NullValue` is JSON `null`. enum NullValue { // Null value. NULL_VALUE = 0; } // `ListValue` is a wrapper around a repeated field of values. // // The JSON representation for `ListValue` is JSON array. message ListValue { // Repeated field of dynamically typed values. repeated Value values = 1; } ``` ## /crates/agentgateway/proto/google/protobuf/wrappers.proto ```proto path="/crates/agentgateway/proto/google/protobuf/wrappers.proto" // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Wrappers for primitive (non-message) types. These types are useful // for embedding primitives in the `google.protobuf.Any` type and for places // where we need to distinguish between the absence of a primitive // typed field and its default value. // // These wrappers have no meaningful use within repeated fields as they lack // the ability to detect presence on individual elements. // These wrappers have no meaningful use within a map or a oneof since // individual entries of a map or fields of a oneof can already detect presence. syntax = "proto3"; package google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/wrappers"; option java_package = "com.google.protobuf"; option java_outer_classname = "WrappersProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // Wrapper message for `double`. // // The JSON representation for `DoubleValue` is JSON number. message DoubleValue { // The double value. double value = 1; } // Wrapper message for `float`. // // The JSON representation for `FloatValue` is JSON number. message FloatValue { // The float value. float value = 1; } // Wrapper message for `int64`. // // The JSON representation for `Int64Value` is JSON string. message Int64Value { // The int64 value. int64 value = 1; } // Wrapper message for `uint64`. // // The JSON representation for `UInt64Value` is JSON string. message UInt64Value { // The uint64 value. uint64 value = 1; } // Wrapper message for `int32`. // // The JSON representation for `Int32Value` is JSON number. message Int32Value { // The int32 value. int32 value = 1; } // Wrapper message for `uint32`. // // The JSON representation for `UInt32Value` is JSON number. message UInt32Value { // The uint32 value. uint32 value = 1; } // Wrapper message for `bool`. // // The JSON representation for `BoolValue` is JSON `true` and `false`. message BoolValue { // The bool value. bool value = 1; } // Wrapper message for `string`. // // The JSON representation for `StringValue` is JSON string. message StringValue { // The string value. string value = 1; } // Wrapper message for `bytes`. // // The JSON representation for `BytesValue` is JSON string. message BytesValue { // The bytes value. bytes value = 1; } ``` ## /crates/agentgateway/proto/listener.proto ```proto path="/crates/agentgateway/proto/listener.proto" syntax = "proto3"; package agentgateway.dev.listener; import "common.proto"; import "rbac.proto"; message Listener { string name = 1; enum Protocol { MCP = 0; A2A = 1; } Protocol protocol = 2; oneof listener { SseListener sse = 3; StdioListener stdio = 4; } } message SseListener { // The address of the listener. string address = 1; // The port of the listener. uint32 port = 2; message TlsConfig { agentgateway.dev.common.LocalDataSource key_pem = 1; agentgateway.dev.common.LocalDataSource cert_pem = 2; } TlsConfig tls = 3; message Authn { message JwtConfig { repeated string issuer = 1; repeated string audience = 2; oneof jwks { agentgateway.dev.common.LocalDataSource local_jwks = 3; agentgateway.dev.common.RemoteDataSource remote_jwks = 4; } } JwtConfig jwt = 1; } Authn authn = 4; repeated agentgateway.dev.rbac.RuleSet rbac = 5; } message StdioListener {} ``` ## /crates/agentgateway/proto/mcp/target.proto ```proto path="/crates/agentgateway/proto/mcp/target.proto" syntax = "proto3"; package agentgateway.dev.mcp.target; import "common.proto"; import "google/protobuf/empty.proto"; message Target { // The name of the target. string name = 1; // The listeners which are allowed to connect to the target. repeated string listeners = 2; oneof target { SseTarget sse = 3; OpenAPITarget openapi = 4; StdioTarget stdio = 5; } message SseTarget { // The host of the target. string host = 1; // The port of the target. uint32 port = 2; // The path of the target. string path = 3; // The headers of the target. repeated agentgateway.dev.common.Header headers = 4; agentgateway.dev.common.BackendAuth auth = 5; agentgateway.dev.common.BackendTls tls = 6; } message StdioTarget { // The command of the target. string cmd = 1; // The arguments of the target. repeated string args = 2; // The environment variables of the target. map env = 3; } message OpenAPITarget { // The host of the target. string host = 1; // The port of the target. uint32 port = 2; // The schema of the target. agentgateway.dev.common.LocalDataSource schema = 3; agentgateway.dev.common.BackendAuth auth = 4; agentgateway.dev.common.BackendTls tls = 5; repeated agentgateway.dev.common.Header headers = 6; } } ``` ## /crates/agentgateway/proto/openapi.yaml ```yaml path="/crates/agentgateway/proto/openapi.yaml" openapi: 3.1.0 info: title: Agent Gateway API version: 1.0.0 description: Admin API for managing Agent Gateway targets and listeners. contact: name: GitHub Repository url: https://github.com/agentgateway/agentgateway license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 servers: - url: http://localhost:19000 description: Local development server. paths: /targets/mcp: get: summary: List all MCP targets. operationId: listMcpTargets responses: '200': description: List of MCP targets. content: application/json: schema: type: array items: $ref: '#/components/schemas/McpTarget' post: summary: Create or update an MCP target. operationId: createMcpTarget requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/McpTarget' responses: '200': description: Target created or updated successfully. '400': description: Invalid target configuration. '500': description: Internal server error. /targets/mcp/{name}: get: summary: Get an MCP target by name. operationId: getMcpTarget parameters: - name: name in: path required: true schema: type: string responses: '200': description: MCP target details. content: application/json: schema: $ref: '#/components/schemas/McpTarget' '404': description: Target not found. delete: summary: Delete an MCP target. operationId: deleteMcpTarget parameters: - name: name in: path required: true schema: type: string responses: '200': description: Target deleted successfully. '404': description: Target not found. /targets/a2a: get: summary: List all A2A targets. operationId: listA2aTargets responses: '200': description: List of A2A targets. content: application/json: schema: type: array items: $ref: '#/components/schemas/A2aTarget' post: summary: Create or update an A2A target. operationId: createA2aTarget requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/A2aTarget' responses: '200': description: Target created or updated successfully. '400': description: Invalid target configuration. '500': description: Internal server error. /targets/a2a/{name}: get: summary: Get an A2A target by name. operationId: getA2aTarget parameters: - name: name in: path required: true schema: type: string responses: '200': description: A2A target details. content: application/json: schema: $ref: '#/components/schemas/A2aTarget' '404': description: Target not found. delete: summary: Delete an A2A target. operationId: deleteA2aTarget parameters: - name: name in: path required: true schema: type: string responses: '200': description: Target deleted successfully. '404': description: Target not found. /listeners: get: summary: List all listeners. operationId: listListeners responses: '200': description: List of listeners. content: application/json: schema: type: array items: $ref: '#/components/schemas/Listener' post: summary: Create or update a listener. operationId: createListener requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Listener' responses: '200': description: Listener created or updated successfully. '400': description: Invalid listener configuration. '500': description: Internal server error. /listeners/{name}: get: summary: Get a listener by name. operationId: getListener parameters: - name: name in: path required: true schema: type: string responses: '200': description: Listener details. content: application/json: schema: $ref: '#/components/schemas/Listener' '404': description: Listener not found. delete: summary: Delete a listener. operationId: deleteListener parameters: - name: name in: path required: true schema: type: string responses: '200': description: Listener deleted successfully. '404': description: Listener not found. /listeners/{name}/targets: get: summary: List all targets for a listener. description: Currently only returns A2A targets. MCP targets are not included in the response. operationId: listListenerTargets parameters: - name: name in: path required: true schema: type: string responses: '200': description: List of A2A targets for the listener. content: application/json: schema: type: array items: $ref: '#/components/schemas/A2aTarget' components: schemas: McpTarget: type: object required: - name properties: name: type: string description: The name of the target. listeners: type: array items: type: string description: The listeners which are allowed to connect to the target. sse: $ref: '#/components/schemas/SseTarget' description: SSE target configuration. openapi: $ref: '#/components/schemas/OpenApiTarget' description: OpenAPI target configuration. stdio: $ref: '#/components/schemas/StdioTarget' description: Stdio target configuration. A2aTarget: type: object required: - name - host - port - path properties: name: type: string description: The name of the target. listeners: type: array items: type: string description: The listeners which are allowed to connect to the target. host: type: string description: The host of the target. port: type: integer format: uint32 description: The port of the target. path: type: string description: The path of the target. headers: type: array items: $ref: '#/components/schemas/Header' description: The headers of the target. auth: $ref: '#/components/schemas/BackendAuth' description: The authentication configuration. tls: $ref: '#/components/schemas/BackendTls' description: The TLS configuration. Listener: type: object required: - name - protocol properties: name: type: string description: The name of the listener. protocol: type: string enum: [MCP, A2A] description: The protocol of the listener. sse: $ref: '#/components/schemas/SseListener' description: SSE listener configuration. stdio: $ref: '#/components/schemas/StdioListener' listener: oneOf: - $ref: '#/components/schemas/SseListener' - $ref: '#/components/schemas/StdioListener' SseTarget: type: object required: - host - port - path properties: host: type: string description: The host of the target. port: type: integer format: uint32 description: The port of the target. path: type: string description: The path of the target. headers: type: array items: $ref: '#/components/schemas/Header' description: The headers of the target. auth: $ref: '#/components/schemas/BackendAuth' description: The authentication configuration. tls: $ref: '#/components/schemas/BackendTls' description: The TLS configuration. OpenApiTarget: type: object required: - host - port - schema properties: host: type: string description: The host of the target. port: type: integer format: uint32 description: The port of the target. schema: $ref: '#/components/schemas/LocalDataSource' description: The schema of the target. auth: $ref: '#/components/schemas/BackendAuth' description: The authentication configuration. tls: $ref: '#/components/schemas/BackendTls' description: The TLS configuration. headers: type: array items: $ref: '#/components/schemas/Header' description: The headers of the target. StdioTarget: type: object required: - cmd properties: cmd: type: string description: The command of the target. args: type: array items: type: string description: The arguments of the target. env: type: object additionalProperties: type: string description: The environment variables of the target. SseListener: type: object required: - address - port properties: address: type: string description: The address of the listener. port: type: integer format: uint32 description: The port of the listener. tls: $ref: '#/components/schemas/TlsConfig' description: The TLS configuration. authn: $ref: '#/components/schemas/Authn' description: The authentication configuration. rbac: type: array items: $ref: '#/components/schemas/RuleSet' description: The RBAC rules. StdioListener: type: object description: Empty configuration for stdio listener. Header: type: object required: - key - string_value properties: key: type: string description: The key of the header. string_value: type: string description: The string value of the header. env_value: type: string description: The environment variable name to use for the header value. envValue: type: string description: Alternative name for env_value. BackendAuth: type: object properties: basic: type: object required: - username - password properties: username: type: string description: The username for basic authentication. password: type: string description: The password for basic authentication. bearer: type: object required: - token properties: token: type: string description: The bearer token. BackendTls: type: object properties: ca_cert: $ref: '#/components/schemas/LocalDataSource' description: The CA certificate. client_cert: $ref: '#/components/schemas/LocalDataSource' description: The client certificate. client_key: $ref: '#/components/schemas/LocalDataSource' description: The client key. skip_verify: type: boolean description: Whether to skip TLS verification. LocalDataSource: type: object required: - data properties: data: type: string description: The data content. format: type: string enum: [json, yaml] description: The format of the data. TlsConfig: type: object required: - key_pem - cert_pem properties: key_pem: $ref: '#/components/schemas/LocalDataSource' description: The private key in PEM format. cert_pem: $ref: '#/components/schemas/LocalDataSource' description: The certificate in PEM format. Authn: type: object properties: jwt: $ref: '#/components/schemas/JwtConfig' description: JWT authentication configuration. JwtConfig: type: object properties: issuer: type: array items: type: string description: The JWT issuer. audience: type: array items: type: string description: The JWT audience. jwks: oneOf: - $ref: '#/components/schemas/LocalDataSource' - $ref: '#/components/schemas/RemoteDataSource' RemoteDataSource: type: object required: - url properties: url: type: string description: The URL to fetch the data from. format: type: string enum: [json, yaml] description: The format of the data. RuleSet: type: object properties: name: type: string description: The name of the rule set. rules: type: array items: $ref: '#/components/schemas/Rule' description: The rules in the set. Rule: type: object properties: principal: type: string description: The principal to match. action: type: string enum: [allow, deny] description: The action to take. ``` ## /crates/agentgateway/proto/rbac.proto ```proto path="/crates/agentgateway/proto/rbac.proto" syntax = "proto3"; package agentgateway.dev.rbac; // A rule that defines a resource type and a key-value pair //that can be used to match against a resource. message Rule { // The types of matchers which are supported. enum Matcher { // The value must be equal to the value in the claims. EQUALS = 0; } message Resource { // The ID of the resource. // In the case of a tool, this is the name of the tool. // In the case of a prompt, this is the name of the prompt. // In the case of a resource, this is the name of the resource. // // If this is not set, it will just match against the server name. string id = 1; // The name of the target server. // If this is not set, it will assume assume the resource can be from any server. string target = 2; // The type of resource that the rule applies to. // This is a string that is used to identify the type of resource. // For MCP, the supported types are: // - tool // - prompt // - resource // For A2A, the supported types are: // - task string type = 3; } // The key to use when finding the value in the claims. string key = 1; // The value to use when matching the value in the claims. string value = 2; // The resource ID to use when matching the resource. Resource resource = 4; // The type of matcher to apply to the value once it is retrieved. Matcher matcher = 5; } // A configuration that defines a set of RBAC rules for a given listener message RuleSet { // The name of the RBAC configuration. string name = 1; // The namespace of the RBAC configuration. string namespace = 2; // The rules that compose the RBAC configuration. repeated Rule rules = 3; } ``` ## /crates/agentgateway/proto/xds.proto ```proto path="/crates/agentgateway/proto/xds.proto" syntax = "proto3"; // GRPC package - part of the URL. Service is added. // URL: /PACKAGE.SERVICE/METHOD package envoy.service.discovery.v3; import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/struct.proto"; option go_package="github.com/envoyproxy/go-control-plane"; message Status { // The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]. int32 code = 1; // A developer-facing error message, which should be in English. Any // user-facing error message should be localized and sent in the // [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client. string message = 2; // A list of messages that carry the error details. There is a common set of // message types for APIs to use. // google.protobuf.Any repeated google.protobuf.Any details = 3; } message Node { // An opaque node identifier for the Envoy node. This also provides the local // service node name. It should be set if any of the following features are // used: :ref:`statsd `, :ref:`CDS // `, and :ref:`HTTP tracing // `, either in this message or via // :option:`--service-node`. string id = 1; // Defines the local service cluster name where Envoy is running. Though // optional, it should be set if any of the following features are used: // :ref:`statsd `, :ref:`health check cluster // verification `, // :ref:`runtime override directory `, // :ref:`user agent addition `, // :ref:`HTTP global rate limiting `, // :ref:`CDS `, and :ref:`HTTP tracing // `, either in this message or via // :option:`--service-cluster`. string cluster = 2; // Opaque metadata extending the node identifier. Envoy will pass this // directly to the management server. google.protobuf.Struct metadata = 3; // Locality specifying where the Envoy instance is running. //Locality locality = 4; // This is motivated by informing a management server during canary which // version of Envoy is being tested in a heterogeneous fleet. This will be set // by Envoy in management server RPCs. string build_version = 5; } // Binary compatible with DiscoveryRequest, with payload extension message DiscoveryRequest { // The version_info provided in the request messages will be the version_info // received with the most recent successfully processed response or empty on // the first request. It is expected that no new request is sent after a // response is received until the Envoy instance is ready to ACK/NACK the new // configuration. ACK/NACK takes place by returning the new API config version // as applied or the previous API config version respectively. Each type_url // (see below) has an independent version associated with it. string version_info = 1; // The node making the request. Node node = 2; // List of resources to subscribe to, e.g. list of cluster names or a route // configuration name. If this is empty, all resources for the API are // returned. LDS/CDS expect empty resource_names, since this is global // discovery for the Envoy instance. The LDS and CDS responses will then imply // a number of resources that need to be fetched via EDS/RDS, which will be // explicitly enumerated in resource_names. repeated string resource_names = 3; // Type of the resource that is being requested, e.g. // "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment". This is implicit // in requests made via singleton xDS APIs such as CDS, LDS, etc. but is // required for ADS. string type_url = 4; // nonce corresponding to DiscoveryResponse being ACK/NACKed. See above // discussion on version_info and the DiscoveryResponse nonce comment. This // may be empty if no nonce is available, e.g. at startup or for non-stream // xDS implementations. string response_nonce = 5; // This is populated when the previous :ref:`DiscoveryResponse ` // failed to update configuration. The *message* field in *error_details* provides the Envoy // internal exception related to the failure. It is only intended for consumption during manual // debugging, the string provided is not guaranteed to be stable across Envoy versions. // google.rpc.Status Status error_detail = 6; } message DiscoveryResponse { // The version of the response data. string version_info = 1; // The response resources. These resources are typed and depend on the API being called. // google.protobuf.Any repeated google.protobuf.Any resources = 2; // [#not-implemented-hide:] // Canary is used to support two Envoy command line flags: // // * --terminate-on-canary-transition-failure. When set, Envoy is able to // terminate if it detects that configuration is stuck at canary. Consider // this example sequence of updates: // - Management server applies a canary config successfully. // - Management server rolls back to a production config. // - Envoy rejects the new production config. // Since there is no sensible way to continue receiving configuration // updates, Envoy will then terminate and apply production config from a // clean slate. // * --dry-run-canary. When set, a canary response will never be applied, only // validated via a dry run. bool canary = 3; // Type URL for resources. This must be consistent with the type_url in the // Any messages for resources if resources is non-empty. This effectively // identifies the xDS API when muxing over ADS. string type_url = 4; // For gRPC based subscriptions, the nonce provides a way to explicitly ack a // specific DiscoveryResponse in a following DiscoveryRequest. Additional // messages may have been sent by Envoy to the management server for the // previous version on the stream prior to this DiscoveryResponse, that were // unprocessed at response send time. The nonce allows the management server // to ignore any further DiscoveryRequests for the previous version until a // DiscoveryRequest bearing the nonce. The nonce is optional and is not // required for non-stream based xDS implementations. string nonce = 5; } message DeltaDiscoveryRequest { // The node making the request. Node node = 1; // Type of the resource that is being requested, e.g. // ``type.googleapis.com/envoy.api.v2.ClusterLoadAssignment``. This does not need to be set if // resources are only referenced via ``xds_resource_subscribe`` and // ``xds_resources_unsubscribe``. string type_url = 2; // DeltaDiscoveryRequests allow the client to add or remove individual // resources to the set of tracked resources in the context of a stream. // All resource names in the resource_names_subscribe list are added to the // set of tracked resources and all resource names in the resource_names_unsubscribe // list are removed from the set of tracked resources. // // *Unlike* state-of-the-world xDS, an empty resource_names_subscribe or // resource_names_unsubscribe list simply means that no resources are to be // added or removed to the resource list. // *Like* state-of-the-world xDS, the server must send updates for all tracked // resources, but can also send updates for resources the client has not subscribed to. // // NOTE: the server must respond with all resources listed in resource_names_subscribe, // even if it believes the client has the most recent version of them. The reason: // the client may have dropped them, but then regained interest before it had a chance // to send the unsubscribe message. See DeltaSubscriptionStateTest.RemoveThenAdd. // // These two fields can be set in any DeltaDiscoveryRequest, including ACKs // and initial_resource_versions. // // A list of Resource names to add to the list of tracked resources. repeated string resource_names_subscribe = 3; // A list of Resource names to remove from the list of tracked resources. repeated string resource_names_unsubscribe = 4; // Informs the server of the versions of the resources the xDS client knows of, to enable the // client to continue the same logical xDS session even in the face of gRPC stream reconnection. // It will not be populated: [1] in the very first stream of a session, since the client will // not yet have any resources, [2] in any message after the first in a stream (for a given // type_url), since the server will already be correctly tracking the client's state. // (In ADS, the first message *of each type_url* of a reconnected stream populates this map.) // The map's keys are names of xDS resources known to the xDS client. // The map's values are opaque resource versions. map initial_resource_versions = 5; // When the DeltaDiscoveryRequest is a ACK or NACK message in response // to a previous DeltaDiscoveryResponse, the response_nonce must be the // nonce in the DeltaDiscoveryResponse. // Otherwise (unlike in DiscoveryRequest) response_nonce must be omitted. string response_nonce = 6; // This is populated when the previous :ref:`DiscoveryResponse ` // failed to update configuration. The ``message`` field in ``error_details`` // provides the Envoy internal exception related to the failure. Status error_detail = 7; } message DeltaDiscoveryResponse { // The version of the response data (used for debugging). string system_version_info = 1; // The response resources. These are typed resources, whose types must match // the type_url field. repeated Resource resources = 2; // field id 3 IS available! // Type URL for resources. Identifies the xDS API when muxing over ADS. // Must be consistent with the type_url in the Any within 'resources' if 'resources' is non-empty. string type_url = 4; // Resources names of resources that have be deleted and to be removed from the xDS Client. // Removed resources for missing resources can be ignored. repeated string removed_resources = 6; // The nonce provides a way for DeltaDiscoveryRequests to uniquely // reference a DeltaDiscoveryResponse when (N)ACKing. The nonce is required. string nonce = 5; } message Resource { // Cache control properties for the resource. // [#not-implemented-hide:] message CacheControl { // If true, xDS proxies may not cache this resource. // Note that this does not apply to clients other than xDS proxies, which must cache resources // for their own use, regardless of the value of this field. bool do_not_cache = 1; } // The resource's name, to distinguish it from others of the same type of resource. string name = 3; // The aliases are a list of other names that this resource can go by. repeated string aliases = 4; // The resource level version. It allows xDS to track the state of individual // resources. string version = 1; // The resource being tracked. google.protobuf.Any resource = 2; // Time-to-live value for the resource. For each resource, a timer is started. The timer is // reset each time the resource is received with a new TTL. If the resource is received with // no TTL set, the timer is removed for the resource. Upon expiration of the timer, the // configuration for the resource will be removed. // // The TTL can be refreshed or changed by sending a response that doesn't change the resource // version. In this case the resource field does not need to be populated, which allows for // light-weight "heartbeat" updates to keep a resource with a TTL alive. // // The TTL feature is meant to support configurations that should be removed in the event of // a management server failure. For example, the feature may be used for fault injection // testing where the fault injection should be terminated in the event that Envoy loses contact // with the management server. google.protobuf.Duration ttl = 6; // Cache control properties for the resource. // [#not-implemented-hide:] CacheControl cache_control = 7; } // Bi-directional streaming interface for messages. // Subscribe, Ack, Push are represented as upstream messages. // Monitor, Receipts, SubscribeResponse, AckResponse are represented as downstream messages. // // See https://github.com/lyft/envoy-api#apis for a description of the role of // ADS and how it is intended to be used by a management server. ADS requests // have the same structure as their singleton xDS counterparts, but can // multiplex many resource types on a single stream. The type_url in the // DiscoveryRequest/DiscoveryResponse provides sufficient information to recover // the multiplexed singleton APIs at the Envoy instance and management server. service AggregatedDiscoveryService { rpc StreamAggregatedResources(stream DiscoveryRequest) returns (stream DiscoveryResponse) {} rpc DeltaAggregatedResources(stream DeltaDiscoveryRequest) returns (stream DeltaDiscoveryResponse) {} } ``` The content has been capped at 50000 tokens, and files over NaN bytes have been omitted. The user could consider applying other filters to refine the result. The better and more specific the context, the better the LLM can follow instructions. If the context seems verbose, the user can refine the filter using uithub. Thank you for using https://uithub.com - Perfect LLM context for any GitHub repo.