From e355b14f2d247bcbecb33538a9a3afe7e4b528b9 Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 10:07:42 +0100 Subject: [PATCH 01/10] Rename repository to contextforge-data-plane Signed-off-by: lucarlig --- .github/workflows/docker_image_ci.yaml | 2 +- .gitignore | 2 +- AGENTS.md | 8 +- Cargo.lock | 20 ++--- Cargo.toml | 16 ++-- Makefile | 8 +- README.md | 14 +-- .../Cargo.toml | 2 +- .../src/lib.rs | 0 .../src/main.rs | 2 +- .../src/runtime_plugin_config.rs | 0 .../src/user.rs | 0 .../src/user_store.rs | 0 .../Cargo.toml | 4 +- .../src/cmf.rs | 0 .../src/config.rs | 4 +- .../src/error.rs | 0 .../src/factory.rs | 0 .../src/handle.rs | 2 +- .../src/hooks.rs | 0 .../src/lib.rs | 0 .../src/pipeline.rs | 0 .../src/runtime.rs | 0 .../Cargo.toml | 6 +- .../src/common.rs | 66 +++++++------- .../src/const_values.rs | 0 .../src/gateway/backend_client.rs | 2 +- .../src/gateway/backend_transports.rs | 0 .../src/gateway/identifier_routing.rs | 2 +- .../src/gateway/list_aggregation.rs | 2 +- .../src/gateway/mcp_call_validator.rs | 2 +- .../src/gateway/mcp_service.rs | 2 +- .../src/gateway/mcp_service/completion.rs | 0 .../src/gateway/mcp_service/initialization.rs | 4 +- .../src/gateway/mcp_service/prompts.rs | 0 .../src/gateway/mcp_service/resources.rs | 0 .../src/gateway/mcp_service/tools.rs | 2 +- .../src/gateway/mod.rs | 0 .../src/gateway/session_manager.rs | 2 +- .../session_store/local_session_store.rs | 0 .../src/gateway/session_store/mod.rs | 0 .../session_store/redis_session_store.rs | 0 .../src/layers/claims_id.rs | 2 +- .../src/layers/mod.rs | 0 .../src/layers/session_id.rs | 0 .../src/layers/user_config_store.rs | 2 +- .../src/layers/virtual_host_config.rs | 4 +- .../src/layers/virtual_host_id.rs | 0 .../src/lib.rs | 2 +- .../src/telemetry.rs | 0 .../src/tools.rs | 2 +- .../src/transports/mod.rs | 0 .../src/transports/tcp.rs | 0 .../src/transports/tls.rs | 0 .../src/user_config_store/mod.rs | 2 +- .../user_config_store/redis_config_store.rs | 2 +- .../tests/gateway_completions.rs | 2 +- .../tests/gateway_list_tools.rs | 2 +- .../tests/gateway_pagination.rs | 4 +- .../tests/gateway_plugins.rs | 2 +- .../tests/gateway_prompts.rs | 2 +- .../tests/gateway_resource_templates.rs | 2 +- .../tests/gateway_subscriptions.rs | 2 +- .../tests/support/auth.rs | 0 .../tests/support/client.rs | 2 +- .../tests/support/list_tools_gateway.rs | 4 +- .../tests/support/mock_counter.rs | 0 .../tests/support/mod.rs | 0 .../tests/support/paginating_mock.rs | 0 .../tests/support/plugin.rs | 0 .../tests/support/plugin_gateway.rs | 8 +- .../tests/support/runtime.rs | 2 +- .../tests/support/tool.rs | 0 .../tests/support/user_config_store.rs | 4 +- .../Cargo.toml | 9 +- .../src/logging.rs | 6 +- .../src/main.rs | 6 +- .../src/runtime.rs | 16 ++-- .../src/test_plugins.rs | 2 +- .../tests/secrets_detection_e2e.rs | 12 +-- deny.toml | 3 +- docker/Dockerfile | 10 +-- docker/dev.Dockerfile | 10 +-- docker/docker-compose-langfuse.yaml | 6 +- docker/docker-compose-otel-collector.yaml | 2 +- docker/docker-compose.yml | 90 +++++++++---------- docker/mcp_conformance.Dockerfile | 3 +- docker/mcp_counter.Dockerfile | 3 +- docker/nginx.conf | 2 +- docker/otel-collector-config.yaml | 2 +- docs/book/README.md | 4 +- docs/book/book.toml | 10 +-- docs/book/src/SUMMARY.md | 4 +- docs/book/src/capability-flow.md | 2 +- docs/book/src/contributing.md | 10 +-- docs/book/src/control-plane-integration.md | 6 +- docs/book/src/deployment-notes.md | 4 +- docs/book/src/gateway-options.md | 64 ++++++------- docs/book/src/local-docker-stack.md | 4 +- docs/book/src/performance.md | 2 +- docs/book/src/request-flow.md | 4 +- docs/book/src/running-the-gateway.md | 10 +-- docs/book/src/runtime-configuration.md | 2 +- docs/book/src/security-model.md | 2 +- docs/book/src/system-shape.md | 14 +-- docs/book/src/telemetry-and-diagnostics.md | 8 +- docs/book/src/testing.md | 4 +- ....md => what-is-contextforge-data-plane.md} | 6 +- 108 files changed, 286 insertions(+), 282 deletions(-) rename crates/{contextforge-gateway-rs-apis => contextforge-data-plane-apis}/Cargo.toml (92%) rename crates/{contextforge-gateway-rs-apis => contextforge-data-plane-apis}/src/lib.rs (100%) rename crates/{contextforge-gateway-rs-apis => contextforge-data-plane-apis}/src/main.rs (91%) rename crates/{contextforge-gateway-rs-apis => contextforge-data-plane-apis}/src/runtime_plugin_config.rs (100%) rename crates/{contextforge-gateway-rs-apis => contextforge-data-plane-apis}/src/user.rs (100%) rename crates/{contextforge-gateway-rs-apis => contextforge-data-plane-apis}/src/user_store.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/Cargo.toml (84%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/cmf.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/config.rs (97%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/error.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/factory.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/handle.rs (99%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/hooks.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/lib.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/pipeline.rs (100%) rename crates/{contextforge-gateway-rs-cpex => contextforge-data-plane-cpex}/src/runtime.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/Cargo.toml (91%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/common.rs (86%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/const_values.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/backend_client.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/backend_transports.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/identifier_routing.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/list_aggregation.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_call_validator.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_service.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_service/completion.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_service/initialization.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_service/prompts.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_service/resources.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mcp_service/tools.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/mod.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/session_manager.rs (97%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/session_store/local_session_store.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/session_store/mod.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/gateway/session_store/redis_session_store.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/layers/claims_id.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/layers/mod.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/layers/session_id.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/layers/user_config_store.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/layers/virtual_host_config.rs (96%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/layers/virtual_host_id.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/lib.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/telemetry.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/tools.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/transports/mod.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/transports/tcp.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/transports/tls.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/user_config_store/mod.rs (92%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/src/user_config_store/redis_config_store.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_completions.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_list_tools.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_pagination.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_plugins.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_prompts.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_resource_templates.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/gateway_subscriptions.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/auth.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/client.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/list_tools_gateway.rs (99%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/mock_counter.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/mod.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/paginating_mock.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/plugin.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/plugin_gateway.rs (98%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/runtime.rs (96%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/tool.rs (100%) rename crates/{contextforge-gateway-rs-lib => contextforge-data-plane-lib}/tests/support/user_config_store.rs (84%) rename crates/{contextforge-gateway-rs => contextforge-data-plane}/Cargo.toml (85%) rename crates/{contextforge-gateway-rs => contextforge-data-plane}/src/logging.rs (98%) rename crates/{contextforge-gateway-rs => contextforge-data-plane}/src/main.rs (94%) rename crates/{contextforge-gateway-rs => contextforge-data-plane}/src/runtime.rs (91%) rename crates/{contextforge-gateway-rs => contextforge-data-plane}/src/test_plugins.rs (90%) rename crates/{contextforge-gateway-rs => contextforge-data-plane}/tests/secrets_detection_e2e.rs (98%) rename docs/book/src/{what-is-contextforge-gateway.md => what-is-contextforge-data-plane.md} (97%) diff --git a/.github/workflows/docker_image_ci.yaml b/.github/workflows/docker_image_ci.yaml index b817c27f..64b654df 100644 --- a/.github/workflows/docker_image_ci.yaml +++ b/.github/workflows/docker_image_ci.yaml @@ -6,7 +6,7 @@ on: # tags: ["2.0.0"] env: - IMAGE_NAME: contextforge-gateway-rs + IMAGE_NAME: contextforge-data-plane jobs: diff --git a/.gitignore b/.gitignore index c267df73..9e301cdc 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ target **/mutants.out*/ # Generated by gateway local runs -contextforge-gateway-rs.log.* +contextforge-data-plane.log.* # Generated by mdBook docs/book/book/ diff --git a/AGENTS.md b/AGENTS.md index ef70deb7..a238e3a2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS.md -Guidance for agents working on `contextforge-gateway-rs`. +Guidance for agents working on `contextforge-data-plane`. This repo is the Rust dataplane part of ContextForge. It must stay compatible with the external ContextForge control plane in @@ -25,13 +25,13 @@ control-plane, UI, IAM, or metrics-storage app. ## Architecture -Architecture documentation lives in The ContextForge Gateway Book under +Architecture documentation lives in The ContextForge Data Plane Book under [docs/book](docs/book/README.md). Read the relevant page before changing the hot path: | Page | Read it for | | --- | --- | -| [What is ContextForge Gateway?](docs/book/src/what-is-contextforge-gateway.md) | Scope, boundaries, key terms, and the mental model. | +| [What is ContextForge Data Plane?](docs/book/src/what-is-contextforge-data-plane.md) | Scope, boundaries, key terms, and the mental model. | | [System Shape](docs/book/src/system-shape.md) | Crate layout, control-plane boundary, pipeline shape, state ownership, and module boundaries. | | [Request Flow](docs/book/src/request-flow.md) | Startup, middleware order, initialize fanout, authorized calls, and the response path. | | [Concurrency And Runtime Model](docs/book/src/concurrency-and-runtime.md) | Executor shapes, shared state and locks, fanout, and cancellation. | @@ -49,7 +49,7 @@ see [docs/book/README.md](docs/book/README.md) for build and validation steps. ## Working Rules -- Most product behavior belongs in `contextforge-gateway-rs-lib`; avoid adding +- Most product behavior belongs in `contextforge-data-plane-lib`; avoid adding dataplane logic to the binary crate. - Keep persistent config access behind `UserConfigStore`; do not push Redis details into routing code. diff --git a/Cargo.lock b/Cargo.lock index f4ae0146..79c19748 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -562,14 +562,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "contextforge-gateway-rs" +name = "contextforge-data-plane" version = "0.1.0" dependencies = [ "axum", "clap", - "contextforge-gateway-rs-apis", - "contextforge-gateway-rs-cpex", - "contextforge-gateway-rs-lib", + "contextforge-data-plane-apis", + "contextforge-data-plane-cpex", + "contextforge-data-plane-lib", "cpex-payload-marker", "cpex-text-prefixer", "cpex-tool-namespace", @@ -597,7 +597,7 @@ dependencies = [ ] [[package]] -name = "contextforge-gateway-rs-apis" +name = "contextforge-data-plane-apis" version = "0.1.0" dependencies = [ "cpex", @@ -608,12 +608,12 @@ dependencies = [ ] [[package]] -name = "contextforge-gateway-rs-cpex" +name = "contextforge-data-plane-cpex" version = "0.1.0" dependencies = [ "arc-swap", "async-trait", - "contextforge-gateway-rs-apis", + "contextforge-data-plane-apis", "cpex", "redis", "rmcp", @@ -625,7 +625,7 @@ dependencies = [ ] [[package]] -name = "contextforge-gateway-rs-lib" +name = "contextforge-data-plane-lib" version = "0.1.0" dependencies = [ "async-trait", @@ -634,8 +634,8 @@ dependencies = [ "axum-server", "chrono", "clap", - "contextforge-gateway-rs-apis", - "contextforge-gateway-rs-cpex", + "contextforge-data-plane-apis", + "contextforge-data-plane-cpex", "cpex", "futures", "http", diff --git a/Cargo.toml b/Cargo.toml index ea9a3f88..2d0fa785 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [workspace] members = [ - "crates/contextforge-gateway-rs", - "crates/contextforge-gateway-rs-apis", - "crates/contextforge-gateway-rs-cpex", - "crates/contextforge-gateway-rs-lib", + "crates/contextforge-data-plane", + "crates/contextforge-data-plane-apis", + "crates/contextforge-data-plane-cpex", + "crates/contextforge-data-plane-lib", "crates/contextforge-load-test", ] resolver = "3" @@ -14,15 +14,15 @@ edition = "2024" rust-version = "1.96" license = "Apache-2.0" keywords = ["mcp", "gateway", "rust", "contextforge", "a2a", "ai", "llm"] -homepage = "https://github.com/contextforge-gateway-rs/contextforge-gateway-rs" +homepage = "https://github.com/contextforge-org/contextforge-data-plane" readme = "./README.md" -repository = "https://github.com/contextforge-gateway-rs/contextforge-gateway-rs" +repository = "https://github.com/contextforge-org/contextforge-data-plane" [workspace.dependencies] # Keep dependencies here only when at least two workspace members inherit them. -contextforge-gateway-rs-cpex = { path = "./crates/contextforge-gateway-rs-cpex" } -contextforge-gateway-rs-apis = { path = "./crates/contextforge-gateway-rs-apis"} +contextforge-data-plane-cpex = { path = "./crates/contextforge-data-plane-cpex" } +contextforge-data-plane-apis = { path = "./crates/contextforge-data-plane-apis"} rmcp = { version = "3.0.1", features = [ "server", "client", diff --git a/Makefile b/Makefile index 03a6f86e..655d37c6 100644 --- a/Makefile +++ b/Makefile @@ -3,12 +3,12 @@ help: ## Show this help @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' -docker-prod: ## Build production Docker image (dataplane:latest) from docker/Dockerfile - docker build -t dataplane:latest -f docker/Dockerfile . +docker-prod: ## Build production Docker image (contextforge-data-plane:latest) from docker/Dockerfile + docker build -t contextforge-data-plane:latest -f docker/Dockerfile . testing-up: ## Launch testing stack: nginx, control plane, redis, postgres, pgbouncer, dataplane, fast_time_server - @docker image inspect dataplane:latest >/dev/null 2>&1 || { \ - echo "Image dataplane:latest not found. Run 'make docker-prod' first."; \ + @docker image inspect contextforge-data-plane:latest >/dev/null 2>&1 || { \ + echo "Image contextforge-data-plane:latest not found. Run 'make docker-prod' first."; \ exit 1; \ } docker compose -f docker/docker-compose.yml up -d nginx control-plane redis postgres pgbouncer data-plane fast_time_server register_fast_time diff --git a/README.md b/README.md index 67a4ef2c..1d6e5456 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# ContextForge Dataplane +# ContextForge Data Plane Architecture, configuration, and operations documentation lives in -[The ContextForge Gateway Book](docs/book/src/SUMMARY.md) under `docs/book`. +[The ContextForge Data Plane Book](docs/book/src/SUMMARY.md) under `docs/book`. Build it locally with `mdbook serve docs/book`; see [docs/book/README.md](docs/book/README.md) for details. @@ -18,7 +18,7 @@ docker compose -f docker/docker-compose-local.yaml ps redis gateway-one gateway- 2. Run gateway ```bash - cargo run --bin contextforge-gateway-rs -- --address 0.0.0.0:8001 --redis-port 6379 --redis-address 127.0.0.1 --token-verification-public-key assets/jwt.key.pub --token-verification-private-key assets/jwt.key --number-of-cpus 16 --redis-mode=plain-text --upstream-connection-mode=plain-text-or-tls + cargo run --bin contextforge-data-plane -- --address 0.0.0.0:8001 --redis-port 6379 --redis-address 127.0.0.1 --token-verification-public-key assets/jwt.key.pub --token-verification-private-key assets/jwt.key --number-of-cpus 16 --redis-mode=plain-text --upstream-connection-mode=plain-text-or-tls ``` This should spin up Redis instance and two mcp-gateways: a simple counter and a conformance test server from mcp-rust-sdk @@ -76,7 +76,7 @@ curl --request POST \ Runtime CPEX plugins are disabled by default. Enable hook execution when starting the gateway: ```bash -cargo run --release --bin contextforge-gateway-rs -- \ +cargo run --release --bin contextforge-data-plane -- \ --address 0.0.0.0:8001 \ --redis-port 6379 \ --redis-address 127.0.0.1 \ @@ -99,7 +99,7 @@ This demo uses the `test-plugins` feature, which includes the demo plugin crates Build the gateway with the demo plugin factories: ```bash -cargo check -p contextforge-gateway-rs --features test-plugins +cargo check -p contextforge-data-plane --features test-plugins ``` The `test-plugins` feature registers those demo plugin factories through the gateway's generic CMF factory adapter. @@ -141,7 +141,7 @@ Run only one gateway process on port `8001` at a time. Stop the current gateway Start the gateway with runtime plugins disabled for a baseline run: ```bash -cargo run --release --features test-plugins --bin contextforge-gateway-rs -- \ +cargo run --release --features test-plugins --bin contextforge-data-plane -- \ --address 0.0.0.0:8001 \ --redis-port 6379 \ --redis-address 127.0.0.1 \ @@ -156,7 +156,7 @@ cargo run --release --features test-plugins --bin contextforge-gateway-rs -- \ Start the gateway with runtime plugins enabled for the marker run: ```bash -cargo run --release --features test-plugins --bin contextforge-gateway-rs -- \ +cargo run --release --features test-plugins --bin contextforge-data-plane -- \ --address 0.0.0.0:8001 \ --redis-port 6379 \ --redis-address 127.0.0.1 \ diff --git a/crates/contextforge-gateway-rs-apis/Cargo.toml b/crates/contextforge-data-plane-apis/Cargo.toml similarity index 92% rename from crates/contextforge-gateway-rs-apis/Cargo.toml rename to crates/contextforge-data-plane-apis/Cargo.toml index 478c6410..9ddfc1a6 100644 --- a/crates/contextforge-gateway-rs-apis/Cargo.toml +++ b/crates/contextforge-data-plane-apis/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "contextforge-gateway-rs-apis" +name = "contextforge-data-plane-apis" version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/contextforge-gateway-rs-apis/src/lib.rs b/crates/contextforge-data-plane-apis/src/lib.rs similarity index 100% rename from crates/contextforge-gateway-rs-apis/src/lib.rs rename to crates/contextforge-data-plane-apis/src/lib.rs diff --git a/crates/contextforge-gateway-rs-apis/src/main.rs b/crates/contextforge-data-plane-apis/src/main.rs similarity index 91% rename from crates/contextforge-gateway-rs-apis/src/main.rs rename to crates/contextforge-data-plane-apis/src/main.rs index 97eba7e1..88ff3252 100644 --- a/crates/contextforge-gateway-rs-apis/src/main.rs +++ b/crates/contextforge-data-plane-apis/src/main.rs @@ -1,6 +1,6 @@ use std::fs; -use contextforge_gateway_rs_apis::{User, user_store}; +use contextforge_data_plane_apis::{User, user_store}; use schemars::SchemaGenerator; use user_store::UserConfig; #[allow(clippy::print_stdout)] diff --git a/crates/contextforge-gateway-rs-apis/src/runtime_plugin_config.rs b/crates/contextforge-data-plane-apis/src/runtime_plugin_config.rs similarity index 100% rename from crates/contextforge-gateway-rs-apis/src/runtime_plugin_config.rs rename to crates/contextforge-data-plane-apis/src/runtime_plugin_config.rs diff --git a/crates/contextforge-gateway-rs-apis/src/user.rs b/crates/contextforge-data-plane-apis/src/user.rs similarity index 100% rename from crates/contextforge-gateway-rs-apis/src/user.rs rename to crates/contextforge-data-plane-apis/src/user.rs diff --git a/crates/contextforge-gateway-rs-apis/src/user_store.rs b/crates/contextforge-data-plane-apis/src/user_store.rs similarity index 100% rename from crates/contextforge-gateway-rs-apis/src/user_store.rs rename to crates/contextforge-data-plane-apis/src/user_store.rs diff --git a/crates/contextforge-gateway-rs-cpex/Cargo.toml b/crates/contextforge-data-plane-cpex/Cargo.toml similarity index 84% rename from crates/contextforge-gateway-rs-cpex/Cargo.toml rename to crates/contextforge-data-plane-cpex/Cargo.toml index 5b373ec6..f273f902 100644 --- a/crates/contextforge-gateway-rs-cpex/Cargo.toml +++ b/crates/contextforge-data-plane-cpex/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "contextforge-gateway-rs-cpex" +name = "contextforge-data-plane-cpex" version.workspace = true edition.workspace = true rust-version.workspace = true @@ -12,7 +12,7 @@ doctest = false [dependencies] arc-swap = "1.7" async-trait.workspace = true -contextforge-gateway-rs-apis.workspace = true +contextforge-data-plane-apis.workspace = true cpex.workspace = true redis.workspace = true rmcp.workspace = true diff --git a/crates/contextforge-gateway-rs-cpex/src/cmf.rs b/crates/contextforge-data-plane-cpex/src/cmf.rs similarity index 100% rename from crates/contextforge-gateway-rs-cpex/src/cmf.rs rename to crates/contextforge-data-plane-cpex/src/cmf.rs diff --git a/crates/contextforge-gateway-rs-cpex/src/config.rs b/crates/contextforge-data-plane-cpex/src/config.rs similarity index 97% rename from crates/contextforge-gateway-rs-cpex/src/config.rs rename to crates/contextforge-data-plane-cpex/src/config.rs index c5538ea1..4dc67006 100644 --- a/crates/contextforge-gateway-rs-cpex/src/config.rs +++ b/crates/contextforge-data-plane-cpex/src/config.rs @@ -7,7 +7,7 @@ use redis::{ use tokio::sync::Mutex; use crate::error::GatewayPluginRuntimeError; -use contextforge_gateway_rs_apis::runtime_plugin_config::{ +use contextforge_data_plane_apis::runtime_plugin_config::{ RUNTIME_PLUGIN_CONFIG_KEY, RUNTIME_PLUGIN_CONFIG_VERSION, RuntimePluginConfigDocument, }; use cpex::cpex_core::config::CpexConfig; @@ -86,7 +86,7 @@ pub(crate) fn decode_config_document(config: &[u8]) -> Result, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TOKEN_VERIFICATION_PUBLIC_KEY")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TOKEN_VERIFICATION_PUBLIC_KEY")] pub token_verification_public_key: Option, #[cfg(feature = "with_tools")] - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TOKEN_VERIFICATION_PRIVATE_KEY")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TOKEN_VERIFICATION_PRIVATE_KEY")] pub token_verification_private_key: PathBuf, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TOKEN_SECRET")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TOKEN_SECRET")] pub token_verification_secret: Option>, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_ENABLE_OPEN_TELEMETRY")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_ENABLE_OPEN_TELEMETRY")] pub enable_open_telemetry: Option, /// OTLP exporter endpoint. For `grpc` this is the collector address /// (e.g. `http://127.0.0.1:4317`). For `http-protobuf` this must be the /// full traces URL (e.g. `http://langfuse-web:3000/api/public/otel/v1/traces` /// for Langfuse, or `http://collector:4318/v1/traces` for the OTel Collector). - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_ENDPOINT")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_ENDPOINT")] pub otlp_endpoint: Option, /// OTLP wire protocol. Use `http-protobuf` when exporting directly to /// Langfuse (it does not accept gRPC). - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_PROTOCOL")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_PROTOCOL")] pub otlp_protocol: Option, /// Additional headers to attach to every OTLP request, formatted as /// `key1=value1,key2=value2`. Used to pass authentication (for example /// Langfuse's `Authorization=Basic `). - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_HEADERS")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_HEADERS")] pub otlp_headers: Option, /// Overrides the `service.name` OpenTelemetry resource attribute. - /// Defaults to `CONTEXTFORGE-GATEWAY-RS`. - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_OTEL_SERVICE_NAME")] + /// Defaults to `CONTEXTFORGE-DATA-PLANE`. + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_OTEL_SERVICE_NAME")] pub otlp_service_name: Option, /// Enables OTLP export of HTTP server metrics (request counts, latency @@ -187,7 +187,7 @@ pub struct Config { /// Independent from `enable_open_telemetry` so traces and metrics can be /// turned on individually. Langfuse does not ingest metrics, so this /// typically targets an OpenTelemetry Collector. - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_ENABLE_OTEL_METRICS")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_ENABLE_OTEL_METRICS")] pub enable_otel_metrics: Option, /// OTLP metrics endpoint. For `grpc` defaults to `http://127.0.0.1:4317`; @@ -195,67 +195,67 @@ pub struct Config { /// Kept separate from `otlp_endpoint` so traces and metrics can be routed /// to different backends (typical: traces to Langfuse, metrics to an /// OTel Collector). - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_METRICS_ENDPOINT")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_METRICS_ENDPOINT")] pub otlp_metrics_endpoint: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_GATEWAY_CPUS")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_NUMBER_OF_CPUS")] pub number_of_cpus: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_SINGLE_RUNTIME")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_SINGLE_RUNTIME")] pub single_runtime: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_RUNTIME_PLUGINS_ENABLED")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_RUNTIME_PLUGINS_ENABLED")] pub runtime_plugins_enabled: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TLS_ADDRESS")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TLS_ADDRESS")] pub tls_address: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TLS_SERVER_PRIVATE_KEY")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TLS_SERVER_PRIVATE_KEY")] pub server_private_key: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TLS_SERVER_CERTIFICATE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TLS_SERVER_CERTIFICATE")] pub server_certificate: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_UPSTREAM_CONNECTION_MODE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_UPSTREAM_CONNECTION_MODE")] pub upstream_connection_mode: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TLS_UPSTREAM_PRIVATE_KEY")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TLS_UPSTREAM_PRIVATE_KEY")] pub upstream_private_key: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TLS_UPSTREAM_CERTIFICATE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TLS_UPSTREAM_CERTIFICATE")] pub upstream_certificate: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_TLS_UPSTREAM_TRUST_BUNDLE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_TLS_UPSTREAM_TRUST_BUNDLE")] pub upstream_trust_bundle: Option, /// Expiry in seconds for the in-process user config cache in front of /// Redis. The control-plane dataplane publisher rewrites UserConfig keys /// every 60s, so this bounds how stale a subject's config can get. /// 0 disables caching and reads Redis on every request. - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_USER_CONFIG_CACHE_EXPIRY_SECONDS", default_value_t = 60)] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_USER_CONFIG_CACHE_EXPIRY_SECONDS", default_value_t = 60)] pub user_config_cache_expiry_seconds: u64, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_REDIS_HOSTNAME")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_REDIS_HOSTNAME")] pub redis_address: String, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_REDIS_PORT")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_REDIS_PORT")] pub redis_port: u16, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_REDIS_CONNECTION_MODE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_REDIS_CONNECTION_MODE")] pub redis_mode: RedisConnectionMode, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_REDIS_TLS_REDIS_TRUST_BUNDLE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_REDIS_TLS_REDIS_TRUST_BUNDLE")] pub redis_tls_trust_bundle: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_REDIS_TLS_REDIS_CLIENT_PRIVATE_KEY")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_REDIS_TLS_REDIS_CLIENT_PRIVATE_KEY")] pub redis_tls_client_private_key: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_RS_REDIS_TLS_REDIS_CLIENT_CERTIFICATE")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_REDIS_TLS_REDIS_CLIENT_CERTIFICATE")] pub redis_tls_client_certificate: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_LOG_NAME")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_LOG_NAME")] pub log_name: Option, - #[arg(long, env = "CONTEXTFORGE_GATEWAY_LOG_ROTATION")] + #[arg(long, env = "CONTEXTFORGE_DATA_PLANE_LOG_ROTATION")] pub log_rotation: Option, } diff --git a/crates/contextforge-gateway-rs-lib/src/const_values.rs b/crates/contextforge-data-plane-lib/src/const_values.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/const_values.rs rename to crates/contextforge-data-plane-lib/src/const_values.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/backend_client.rs b/crates/contextforge-data-plane-lib/src/gateway/backend_client.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/gateway/backend_client.rs rename to crates/contextforge-data-plane-lib/src/gateway/backend_client.rs index 7d9b2eb7..034bef24 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/backend_client.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/backend_client.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, sync::Arc}; -use contextforge_gateway_rs_cpex::{GatewayPluginRuntimeHandle, RuntimeHookState}; +use contextforge_data_plane_cpex::{GatewayPluginRuntimeHandle, RuntimeHookState}; use rmcp::{ ClientHandler, Peer, RoleClient, RoleServer, model::{ diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/backend_transports.rs b/crates/contextforge-data-plane-lib/src/gateway/backend_transports.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/backend_transports.rs rename to crates/contextforge-data-plane-lib/src/gateway/backend_transports.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/identifier_routing.rs b/crates/contextforge-data-plane-lib/src/gateway/identifier_routing.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/gateway/identifier_routing.rs rename to crates/contextforge-data-plane-lib/src/gateway/identifier_routing.rs index 647e0793..ab94523e 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/identifier_routing.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/identifier_routing.rs @@ -1,4 +1,4 @@ -use contextforge_gateway_rs_apis::user_store::VirtualHost; +use contextforge_data_plane_apis::user_store::VirtualHost; use rmcp::{ErrorData, model::ErrorCode, service::ServiceError}; use tracing::{debug, warn}; diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/list_aggregation.rs b/crates/contextforge-data-plane-lib/src/gateway/list_aggregation.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/gateway/list_aggregation.rs rename to crates/contextforge-data-plane-lib/src/gateway/list_aggregation.rs index f9945f1d..001ea53f 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/list_aggregation.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/list_aggregation.rs @@ -3,7 +3,7 @@ use std::{ future::Future, }; -use contextforge_gateway_rs_apis::user_store::VirtualHost; +use contextforge_data_plane_apis::user_store::VirtualHost; use rmcp::{ ErrorData, model::{ diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_call_validator.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_call_validator.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_call_validator.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_call_validator.rs index 16b94ba2..026de314 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_call_validator.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/mcp_call_validator.rs @@ -1,4 +1,4 @@ -use contextforge_gateway_rs_apis::user_store::{UserConfig, VirtualHost}; +use contextforge_data_plane_apis::user_store::{UserConfig, VirtualHost}; use http::request::Parts; use rmcp::{ErrorData, RoleServer, model::ErrorCode, service::RequestContext}; use tracing::debug; diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_service.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_service.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_service.rs index 564da261..452a4669 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/mcp_service.rs @@ -4,7 +4,7 @@ mod prompts; mod resources; mod tools; -use contextforge_gateway_rs_cpex::GatewayPluginRuntimeHandle; +use contextforge_data_plane_cpex::GatewayPluginRuntimeHandle; use rmcp::{ ErrorData, RoleServer, ServerHandler, model::{ diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/completion.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/completion.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/completion.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_service/completion.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/initialization.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/initialization.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/initialization.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_service/initialization.rs index 60331220..3370cac6 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/initialization.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/initialization.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, sync::Arc}; -use contextforge_gateway_rs_apis::user_store::BackendMCPGateway; +use contextforge_data_plane_apis::user_store::BackendMCPGateway; use http::request::Parts; use rmcp::{ ErrorData, RoleClient, RoleServer, ServiceExt, @@ -275,7 +275,7 @@ fn is_protected_header(name: &http::HeaderName) -> bool { #[cfg(test)] mod tests { - use contextforge_gateway_rs_apis::user_store::Transport; + use contextforge_data_plane_apis::user_store::Transport; use super::*; diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/prompts.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/prompts.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/prompts.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_service/prompts.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/resources.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/resources.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/resources.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_service/resources.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/tools.rs b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/tools.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/tools.rs rename to crates/contextforge-data-plane-lib/src/gateway/mcp_service/tools.rs index 903eb43e..b442fb7d 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/mcp_service/tools.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/mcp_service/tools.rs @@ -1,4 +1,4 @@ -use contextforge_gateway_rs_cpex::ToolPreCallResult; +use contextforge_data_plane_cpex::ToolPreCallResult; use rmcp::{ ErrorData, RoleServer, model::{CallToolRequestParams, CallToolResponse, ErrorCode, ListToolsResult, PaginatedRequestParams}, diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/mod.rs b/crates/contextforge-data-plane-lib/src/gateway/mod.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/mod.rs rename to crates/contextforge-data-plane-lib/src/gateway/mod.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/session_manager.rs b/crates/contextforge-data-plane-lib/src/gateway/session_manager.rs similarity index 97% rename from crates/contextforge-gateway-rs-lib/src/gateway/session_manager.rs rename to crates/contextforge-data-plane-lib/src/gateway/session_manager.rs index af361e72..20aa828a 100644 --- a/crates/contextforge-gateway-rs-lib/src/gateway/session_manager.rs +++ b/crates/contextforge-data-plane-lib/src/gateway/session_manager.rs @@ -1,4 +1,4 @@ -use contextforge_gateway_rs_apis::user_store::VirtualHost; +use contextforge_data_plane_apis::user_store::VirtualHost; use tracing::{debug, info}; use super::backend_transports::{BackendTransportKey, BackendTransports, ServiceHolder}; diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/session_store/local_session_store.rs b/crates/contextforge-data-plane-lib/src/gateway/session_store/local_session_store.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/session_store/local_session_store.rs rename to crates/contextforge-data-plane-lib/src/gateway/session_store/local_session_store.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/session_store/mod.rs b/crates/contextforge-data-plane-lib/src/gateway/session_store/mod.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/session_store/mod.rs rename to crates/contextforge-data-plane-lib/src/gateway/session_store/mod.rs diff --git a/crates/contextforge-gateway-rs-lib/src/gateway/session_store/redis_session_store.rs b/crates/contextforge-data-plane-lib/src/gateway/session_store/redis_session_store.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/gateway/session_store/redis_session_store.rs rename to crates/contextforge-data-plane-lib/src/gateway/session_store/redis_session_store.rs diff --git a/crates/contextforge-gateway-rs-lib/src/layers/claims_id.rs b/crates/contextforge-data-plane-lib/src/layers/claims_id.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/layers/claims_id.rs rename to crates/contextforge-data-plane-lib/src/layers/claims_id.rs index 365b8df2..23df0378 100644 --- a/crates/contextforge-gateway-rs-lib/src/layers/claims_id.rs +++ b/crates/contextforge-data-plane-lib/src/layers/claims_id.rs @@ -79,7 +79,7 @@ mod test { use async_trait::async_trait; use axum::{Router, body::Body, middleware, response::Response, routing::get}; use chrono::Duration; - use contextforge_gateway_rs_apis::{User, user_store::UserConfig}; + use contextforge_data_plane_apis::{User, user_store::UserConfig}; use http::{HeaderMap, Request, StatusCode}; use jsonwebtoken::{Algorithm, DecodingKey, EncodingKey, Header, encode}; use tower::ServiceExt; diff --git a/crates/contextforge-gateway-rs-lib/src/layers/mod.rs b/crates/contextforge-data-plane-lib/src/layers/mod.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/layers/mod.rs rename to crates/contextforge-data-plane-lib/src/layers/mod.rs diff --git a/crates/contextforge-gateway-rs-lib/src/layers/session_id.rs b/crates/contextforge-data-plane-lib/src/layers/session_id.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/layers/session_id.rs rename to crates/contextforge-data-plane-lib/src/layers/session_id.rs diff --git a/crates/contextforge-gateway-rs-lib/src/layers/user_config_store.rs b/crates/contextforge-data-plane-lib/src/layers/user_config_store.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/src/layers/user_config_store.rs rename to crates/contextforge-data-plane-lib/src/layers/user_config_store.rs index 80ba5ad2..3b586486 100644 --- a/crates/contextforge-gateway-rs-lib/src/layers/user_config_store.rs +++ b/crates/contextforge-data-plane-lib/src/layers/user_config_store.rs @@ -1,5 +1,5 @@ use axum::{body::Body, extract::State, middleware::Next, response::Response}; -use contextforge_gateway_rs_apis::User; +use contextforge_data_plane_apis::User; use http::{StatusCode, header}; //use openid::Claims; use tracing::{debug, info, warn}; diff --git a/crates/contextforge-gateway-rs-lib/src/layers/virtual_host_config.rs b/crates/contextforge-data-plane-lib/src/layers/virtual_host_config.rs similarity index 96% rename from crates/contextforge-gateway-rs-lib/src/layers/virtual_host_config.rs rename to crates/contextforge-data-plane-lib/src/layers/virtual_host_config.rs index ce1c2044..7634e58d 100644 --- a/crates/contextforge-gateway-rs-lib/src/layers/virtual_host_config.rs +++ b/crates/contextforge-data-plane-lib/src/layers/virtual_host_config.rs @@ -1,5 +1,5 @@ use axum::{body::Body, middleware::Next, response::Response}; -use contextforge_gateway_rs_apis::user_store::UserConfig; +use contextforge_data_plane_apis::user_store::UserConfig; use http::{StatusCode, header}; use tracing::debug; @@ -42,7 +42,7 @@ mod tests { use std::collections::HashMap; use axum::{Router, body::to_bytes, middleware, routing::get}; - use contextforge_gateway_rs_apis::user_store::VirtualHost; + use contextforge_data_plane_apis::user_store::VirtualHost; use http::Request; use tower::ServiceExt; diff --git a/crates/contextforge-gateway-rs-lib/src/layers/virtual_host_id.rs b/crates/contextforge-data-plane-lib/src/layers/virtual_host_id.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/layers/virtual_host_id.rs rename to crates/contextforge-data-plane-lib/src/layers/virtual_host_id.rs diff --git a/crates/contextforge-gateway-rs-lib/src/lib.rs b/crates/contextforge-data-plane-lib/src/lib.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/lib.rs rename to crates/contextforge-data-plane-lib/src/lib.rs index 07104aef..e0886800 100644 --- a/crates/contextforge-gateway-rs-lib/src/lib.rs +++ b/crates/contextforge-data-plane-lib/src/lib.rs @@ -2,7 +2,7 @@ use std::{fs, sync::Arc}; use axum::middleware; use axum_otel_metrics::HttpMetricsLayerBuilder; -use contextforge_gateway_rs_cpex::GatewayPluginRuntimeHandle; +use contextforge_data_plane_cpex::GatewayPluginRuntimeHandle; use futures::FutureExt; use jsonwebtoken::DecodingKey; use rmcp::transport::{ diff --git a/crates/contextforge-gateway-rs-lib/src/telemetry.rs b/crates/contextforge-data-plane-lib/src/telemetry.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/telemetry.rs rename to crates/contextforge-data-plane-lib/src/telemetry.rs diff --git a/crates/contextforge-gateway-rs-lib/src/tools.rs b/crates/contextforge-data-plane-lib/src/tools.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/src/tools.rs rename to crates/contextforge-data-plane-lib/src/tools.rs index 6bf71eb2..636c8706 100644 --- a/crates/contextforge-gateway-rs-lib/src/tools.rs +++ b/crates/contextforge-data-plane-lib/src/tools.rs @@ -8,7 +8,7 @@ use axum::{ routing::{Router, get, post}, }; use chrono::Duration; -use contextforge_gateway_rs_apis::{User as CFUser, user_store::UserConfig}; +use contextforge_data_plane_apis::{User as CFUser, user_store::UserConfig}; use http::{StatusCode, header}; use serde::Deserialize; use uuid::Uuid; diff --git a/crates/contextforge-gateway-rs-lib/src/transports/mod.rs b/crates/contextforge-data-plane-lib/src/transports/mod.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/transports/mod.rs rename to crates/contextforge-data-plane-lib/src/transports/mod.rs diff --git a/crates/contextforge-gateway-rs-lib/src/transports/tcp.rs b/crates/contextforge-data-plane-lib/src/transports/tcp.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/transports/tcp.rs rename to crates/contextforge-data-plane-lib/src/transports/tcp.rs diff --git a/crates/contextforge-gateway-rs-lib/src/transports/tls.rs b/crates/contextforge-data-plane-lib/src/transports/tls.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/src/transports/tls.rs rename to crates/contextforge-data-plane-lib/src/transports/tls.rs diff --git a/crates/contextforge-gateway-rs-lib/src/user_config_store/mod.rs b/crates/contextforge-data-plane-lib/src/user_config_store/mod.rs similarity index 92% rename from crates/contextforge-gateway-rs-lib/src/user_config_store/mod.rs rename to crates/contextforge-data-plane-lib/src/user_config_store/mod.rs index b7d5bc4d..647e2a88 100644 --- a/crates/contextforge-gateway-rs-lib/src/user_config_store/mod.rs +++ b/crates/contextforge-data-plane-lib/src/user_config_store/mod.rs @@ -1,6 +1,6 @@ mod redis_config_store; use async_trait::async_trait; -use contextforge_gateway_rs_apis::{User, user_store::UserConfig}; +use contextforge_data_plane_apis::{User, user_store::UserConfig}; pub use redis_config_store::RedisUserConfigStore; use serde::{Deserialize, Serialize}; diff --git a/crates/contextforge-gateway-rs-lib/src/user_config_store/redis_config_store.rs b/crates/contextforge-data-plane-lib/src/user_config_store/redis_config_store.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/src/user_config_store/redis_config_store.rs rename to crates/contextforge-data-plane-lib/src/user_config_store/redis_config_store.rs index 75491b1c..442675bb 100644 --- a/crates/contextforge-gateway-rs-lib/src/user_config_store/redis_config_store.rs +++ b/crates/contextforge-data-plane-lib/src/user_config_store/redis_config_store.rs @@ -4,7 +4,7 @@ use std::{ }; use async_trait::async_trait; -use contextforge_gateway_rs_apis::{User, user_store::UserConfig}; +use contextforge_data_plane_apis::{User, user_store::UserConfig}; use lru_time_cache::LruCache; use redis::{ AsyncCommands, RedisError, diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_completions.rs b/crates/contextforge-data-plane-lib/tests/gateway_completions.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/tests/gateway_completions.rs rename to crates/contextforge-data-plane-lib/tests/gateway_completions.rs index 3872f739..4cd2f68c 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_completions.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_completions.rs @@ -1,6 +1,6 @@ mod support; -use contextforge_gateway_rs_lib::Result; +use contextforge_data_plane_lib::Result; use tracing::info; use support::{ diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_list_tools.rs b/crates/contextforge-data-plane-lib/tests/gateway_list_tools.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/tests/gateway_list_tools.rs rename to crates/contextforge-data-plane-lib/tests/gateway_list_tools.rs index f4e3c74f..04a77859 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_list_tools.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_list_tools.rs @@ -2,7 +2,7 @@ mod support; use std::{fs::File, io::Read}; -use contextforge_gateway_rs_lib::{Config, Result, UpstreamConnectionMode}; +use contextforge_data_plane_lib::{Config, Result, UpstreamConnectionMode}; use futures::{FutureExt, future::BoxFuture}; use rustls::crypto; use tracing::{info, warn}; diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_pagination.rs b/crates/contextforge-data-plane-lib/tests/gateway_pagination.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/tests/gateway_pagination.rs rename to crates/contextforge-data-plane-lib/tests/gateway_pagination.rs index 4f4679d3..f4324ae9 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_pagination.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_pagination.rs @@ -2,11 +2,11 @@ mod support; use std::{collections::HashMap, sync::Arc}; -use contextforge_gateway_rs_apis::{ +use contextforge_data_plane_apis::{ User, user_store::{BackendMCPGateway, Transport, UserConfig, VirtualHost}, }; -use contextforge_gateway_rs_lib::{Config, Gateway, Result, UserConfigStore, UserConfigStoreType}; +use contextforge_data_plane_lib::{Config, Gateway, Result, UserConfigStore, UserConfigStoreType}; use rmcp::{ model::PaginatedRequestParams, transport::{ diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_plugins.rs b/crates/contextforge-data-plane-lib/tests/gateway_plugins.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/tests/gateway_plugins.rs rename to crates/contextforge-data-plane-lib/tests/gateway_plugins.rs index 82739372..dca7bcf1 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_plugins.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_plugins.rs @@ -2,7 +2,7 @@ mod support; use std::sync::{Arc, Mutex as StdMutex}; -use contextforge_gateway_rs_cpex::CpexRuntimeRegistry; +use contextforge_data_plane_cpex::CpexRuntimeRegistry; use cpex::cpex_core::cmf::Role; use cpex::cpex_core::config::CpexConfig; use cpex::cpex_core::hooks::types::cmf_hook_names; diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_prompts.rs b/crates/contextforge-data-plane-lib/tests/gateway_prompts.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/tests/gateway_prompts.rs rename to crates/contextforge-data-plane-lib/tests/gateway_prompts.rs index 500114e5..53b022a3 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_prompts.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_prompts.rs @@ -1,6 +1,6 @@ mod support; -use contextforge_gateway_rs_lib::{Config, Result, UpstreamConnectionMode}; +use contextforge_data_plane_lib::{Config, Result, UpstreamConnectionMode}; use rmcp::model::GetPromptRequestParams; use serde_json::json; use tracing::{info, warn}; diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_resource_templates.rs b/crates/contextforge-data-plane-lib/tests/gateway_resource_templates.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/tests/gateway_resource_templates.rs rename to crates/contextforge-data-plane-lib/tests/gateway_resource_templates.rs index 9cc9a8e4..9ae3284a 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_resource_templates.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_resource_templates.rs @@ -1,6 +1,6 @@ mod support; -use contextforge_gateway_rs_lib::{Config, Result, UpstreamConnectionMode}; +use contextforge_data_plane_lib::{Config, Result, UpstreamConnectionMode}; use rmcp::model::{ReadResourceRequestParams, ResourceContents}; use tracing::{info, warn}; diff --git a/crates/contextforge-gateway-rs-lib/tests/gateway_subscriptions.rs b/crates/contextforge-data-plane-lib/tests/gateway_subscriptions.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/tests/gateway_subscriptions.rs rename to crates/contextforge-data-plane-lib/tests/gateway_subscriptions.rs index b710baea..e7372f42 100644 --- a/crates/contextforge-gateway-rs-lib/tests/gateway_subscriptions.rs +++ b/crates/contextforge-data-plane-lib/tests/gateway_subscriptions.rs @@ -6,7 +6,7 @@ use std::{ time::Instant, }; -use contextforge_gateway_rs_lib::Result; +use contextforge_data_plane_lib::Result; use futures::future::try_join_all; use rmcp::{ ClientHandler, diff --git a/crates/contextforge-gateway-rs-lib/tests/support/auth.rs b/crates/contextforge-data-plane-lib/tests/support/auth.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/tests/support/auth.rs rename to crates/contextforge-data-plane-lib/tests/support/auth.rs diff --git a/crates/contextforge-gateway-rs-lib/tests/support/client.rs b/crates/contextforge-data-plane-lib/tests/support/client.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/tests/support/client.rs rename to crates/contextforge-data-plane-lib/tests/support/client.rs index 135e84a2..d0d7e59c 100644 --- a/crates/contextforge-gateway-rs-lib/tests/support/client.rs +++ b/crates/contextforge-data-plane-lib/tests/support/client.rs @@ -1,6 +1,6 @@ use std::time::{Duration, Instant}; -use contextforge_gateway_rs_lib::Result; +use contextforge_data_plane_lib::Result; use http::{HeaderMap, HeaderValue}; use rmcp::{ ServiceExt, diff --git a/crates/contextforge-gateway-rs-lib/tests/support/list_tools_gateway.rs b/crates/contextforge-data-plane-lib/tests/support/list_tools_gateway.rs similarity index 99% rename from crates/contextforge-gateway-rs-lib/tests/support/list_tools_gateway.rs rename to crates/contextforge-data-plane-lib/tests/support/list_tools_gateway.rs index b7062a0f..af41eb78 100644 --- a/crates/contextforge-gateway-rs-lib/tests/support/list_tools_gateway.rs +++ b/crates/contextforge-data-plane-lib/tests/support/list_tools_gateway.rs @@ -1,10 +1,10 @@ use std::{collections::HashMap, net::SocketAddr, sync::Arc}; -use contextforge_gateway_rs_apis::{ +use contextforge_data_plane_apis::{ User, user_store::{BackendMCPGateway, Transport, UserConfig, VirtualHost}, }; -use contextforge_gateway_rs_lib::{ +use contextforge_data_plane_lib::{ Config, Gateway, Result, UpstreamConnectionMode, UserConfigStore, UserConfigStoreType, }; use futures::{FutureExt, future::BoxFuture}; diff --git a/crates/contextforge-gateway-rs-lib/tests/support/mock_counter.rs b/crates/contextforge-data-plane-lib/tests/support/mock_counter.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/tests/support/mock_counter.rs rename to crates/contextforge-data-plane-lib/tests/support/mock_counter.rs diff --git a/crates/contextforge-gateway-rs-lib/tests/support/mod.rs b/crates/contextforge-data-plane-lib/tests/support/mod.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/tests/support/mod.rs rename to crates/contextforge-data-plane-lib/tests/support/mod.rs diff --git a/crates/contextforge-gateway-rs-lib/tests/support/paginating_mock.rs b/crates/contextforge-data-plane-lib/tests/support/paginating_mock.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/tests/support/paginating_mock.rs rename to crates/contextforge-data-plane-lib/tests/support/paginating_mock.rs diff --git a/crates/contextforge-gateway-rs-lib/tests/support/plugin.rs b/crates/contextforge-data-plane-lib/tests/support/plugin.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/tests/support/plugin.rs rename to crates/contextforge-data-plane-lib/tests/support/plugin.rs diff --git a/crates/contextforge-gateway-rs-lib/tests/support/plugin_gateway.rs b/crates/contextforge-data-plane-lib/tests/support/plugin_gateway.rs similarity index 98% rename from crates/contextforge-gateway-rs-lib/tests/support/plugin_gateway.rs rename to crates/contextforge-data-plane-lib/tests/support/plugin_gateway.rs index edf75a58..0bc90bdd 100644 --- a/crates/contextforge-gateway-rs-lib/tests/support/plugin_gateway.rs +++ b/crates/contextforge-data-plane-lib/tests/support/plugin_gateway.rs @@ -4,12 +4,12 @@ use std::{ time::{Duration, Instant}, }; -use contextforge_gateway_rs_apis::{ +use contextforge_data_plane_apis::{ User, user_store::{BackendMCPGateway, Transport, UserConfig, VirtualHost}, }; -use contextforge_gateway_rs_cpex::CpexRuntimeRegistry; -use contextforge_gateway_rs_lib::{Config, Gateway, UpstreamConnectionMode, UserConfigStore, UserConfigStoreType}; +use contextforge_data_plane_cpex::CpexRuntimeRegistry; +use contextforge_data_plane_lib::{Config, Gateway, UpstreamConnectionMode, UserConfigStore, UserConfigStoreType}; use futures::FutureExt; use http::{HeaderMap, HeaderValue}; use rmcp::{ @@ -159,7 +159,7 @@ pub(crate) struct RunningGateway { pub(crate) backend_state: BackendState, pub(crate) backend_name: String, gateway_url: String, - handle: Option>>>, + handle: Option>>>, } impl RunningGateway { diff --git a/crates/contextforge-gateway-rs-lib/tests/support/runtime.rs b/crates/contextforge-data-plane-lib/tests/support/runtime.rs similarity index 96% rename from crates/contextforge-gateway-rs-lib/tests/support/runtime.rs rename to crates/contextforge-data-plane-lib/tests/support/runtime.rs index 5a6f463c..83d9b3dd 100644 --- a/crates/contextforge-gateway-rs-lib/tests/support/runtime.rs +++ b/crates/contextforge-data-plane-lib/tests/support/runtime.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use contextforge_gateway_rs_cpex::CpexRuntimeRegistry; +use contextforge_data_plane_cpex::CpexRuntimeRegistry; use cpex::cpex_core::config::CpexConfig; use serde_json::json; diff --git a/crates/contextforge-gateway-rs-lib/tests/support/tool.rs b/crates/contextforge-data-plane-lib/tests/support/tool.rs similarity index 100% rename from crates/contextforge-gateway-rs-lib/tests/support/tool.rs rename to crates/contextforge-data-plane-lib/tests/support/tool.rs diff --git a/crates/contextforge-gateway-rs-lib/tests/support/user_config_store.rs b/crates/contextforge-data-plane-lib/tests/support/user_config_store.rs similarity index 84% rename from crates/contextforge-gateway-rs-lib/tests/support/user_config_store.rs rename to crates/contextforge-data-plane-lib/tests/support/user_config_store.rs index 38b499b3..eac5eeca 100644 --- a/crates/contextforge-gateway-rs-lib/tests/support/user_config_store.rs +++ b/crates/contextforge-data-plane-lib/tests/support/user_config_store.rs @@ -1,8 +1,8 @@ use std::{collections::HashMap, sync::Arc}; use async_trait::async_trait; -use contextforge_gateway_rs_apis::{User, user_store::UserConfig}; -use contextforge_gateway_rs_lib::{ConfigStoreError, UserConfigStore}; +use contextforge_data_plane_apis::{User, user_store::UserConfig}; +use contextforge_data_plane_lib::{ConfigStoreError, UserConfigStore}; use tokio::sync::Mutex; #[derive(Clone, Default)] diff --git a/crates/contextforge-gateway-rs/Cargo.toml b/crates/contextforge-data-plane/Cargo.toml similarity index 85% rename from crates/contextforge-gateway-rs/Cargo.toml rename to crates/contextforge-data-plane/Cargo.toml index 07918a47..2b015a62 100644 --- a/crates/contextforge-gateway-rs/Cargo.toml +++ b/crates/contextforge-data-plane/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "contextforge-gateway-rs" +name = "contextforge-data-plane" version.workspace = true edition.workspace = true rust-version.workspace = true @@ -8,8 +8,9 @@ keywords.workspace = true [dependencies] -contextforge-gateway-rs-cpex.workspace = true -contextforge-gateway-rs-lib = { path = "../contextforge-gateway-rs-lib" } +contextforge-data-plane-cpex.workspace = true +contextforge-data-plane-lib = { path = "../contextforge-data-plane-lib" } +# These demo plugins remain in their independently hosted legacy repository. cpex-payload-marker = { git = "https://github.com/contextforge-gateway-rs/cpex-plugins-rs", rev = "ab47801daccfbba44ea07b033034a347e7b5afdd", optional = true } cpex-text-prefixer = { git = "https://github.com/contextforge-gateway-rs/cpex-plugins-rs", rev = "ab47801daccfbba44ea07b033034a347e7b5afdd", optional = true } cpex-tool-namespace = { git = "https://github.com/contextforge-gateway-rs/cpex-plugins-rs", rev = "ab47801daccfbba44ea07b033034a347e7b5afdd", optional = true } @@ -35,7 +36,7 @@ test-plugins = ["dep:cpex-payload-marker", "dep:cpex-text-prefixer", "dep:cpex-t [dev-dependencies] axum.workspace = true -contextforge-gateway-rs-apis.workspace = true +contextforge-data-plane-apis.workspace = true http.workspace = true jsonwebtoken = { version = "10.3.0", features = ["rust_crypto"] } openport.workspace = true diff --git a/crates/contextforge-gateway-rs/src/logging.rs b/crates/contextforge-data-plane/src/logging.rs similarity index 98% rename from crates/contextforge-gateway-rs/src/logging.rs rename to crates/contextforge-data-plane/src/logging.rs index e05dfea9..a695f7f8 100644 --- a/crates/contextforge-gateway-rs/src/logging.rs +++ b/crates/contextforge-data-plane/src/logging.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use contextforge_gateway_rs_lib::{Config, LogRotation, OtlpProtocol}; +use contextforge_data_plane_lib::{Config, LogRotation, OtlpProtocol}; use opentelemetry::global; use opentelemetry::trace::TracerProvider; use opentelemetry_otlp::{MetricExporter, Protocol, SpanExporter, WithExportConfig, WithHttpConfig, WithTonicConfig}; @@ -26,7 +26,7 @@ pub struct Guard { meter_provider: Option, } -const CONTROLLER_NAME: &str = "CONTEXTFORGE-GATEWAY-RS"; +const CONTROLLER_NAME: &str = "CONTEXTFORGE-DATA-PLANE"; const DEFAULT_GRPC_TRACES_ENDPOINT: &str = "http://127.0.0.1:4317"; const DEFAULT_GRPC_METRICS_ENDPOINT: &str = "http://127.0.0.1:4317"; const DEFAULT_HTTP_TRACES_ENDPOINT: &str = "http://127.0.0.1:4318/v1/traces"; @@ -36,7 +36,7 @@ const METRICS_EXPORT_INTERVAL: std::time::Duration = std::time::Duration::from_s pub fn init_tracing_logging(configuration: &Config) -> Result> { let registry = Registry::default(); - let log_name = configuration.log_name.clone().unwrap_or("contextforge-gateway-rs.log".to_owned()); + let log_name = configuration.log_name.clone().unwrap_or("contextforge-data-plane.log".to_owned()); let file_appender = match configuration.log_rotation.clone().unwrap_or_default() { LogRotation::Minutely => tracing_appender::rolling::minutely(".", log_name), diff --git a/crates/contextforge-gateway-rs/src/main.rs b/crates/contextforge-data-plane/src/main.rs similarity index 94% rename from crates/contextforge-gateway-rs/src/main.rs rename to crates/contextforge-data-plane/src/main.rs index 30a57343..879f9442 100644 --- a/crates/contextforge-gateway-rs/src/main.rs +++ b/crates/contextforge-data-plane/src/main.rs @@ -6,8 +6,8 @@ mod test_plugins; use std::sync::Arc; use clap::Parser; -use contextforge_gateway_rs_cpex::CpexRuntimeRegistry; -use contextforge_gateway_rs_lib::{Config, Gateway, RedisClient, RedisConfig, UserConfigStoreType}; +use contextforge_data_plane_cpex::CpexRuntimeRegistry; +use contextforge_data_plane_lib::{Config, Gateway, RedisClient, RedisConfig, UserConfigStoreType}; use rmcp::transport::streamable_http_server::session::local::LocalSessionManager; use rustls::crypto; use tikv_jemallocator::Jemalloc; @@ -31,7 +31,7 @@ fn main() -> Result<(), Box> { otel_metrics_enabled = config.enable_otel_metrics.unwrap_or(false), single_runtime = config.single_runtime.unwrap_or(true), configured_cpus = ?config.number_of_cpus, - "starting contextforge-gateway-rs" + "starting contextforge-data-plane" ); let runtime = runtime::Runtime::from(&config); diff --git a/crates/contextforge-gateway-rs/src/runtime.rs b/crates/contextforge-data-plane/src/runtime.rs similarity index 91% rename from crates/contextforge-gateway-rs/src/runtime.rs rename to crates/contextforge-data-plane/src/runtime.rs index bb90386c..71e87b55 100644 --- a/crates/contextforge-gateway-rs/src/runtime.rs +++ b/crates/contextforge-data-plane/src/runtime.rs @@ -3,8 +3,8 @@ use std::{ thread, }; -use contextforge_gateway_rs_cpex::CpexRuntimeRegistry; -use contextforge_gateway_rs_lib::{Config, Gateway}; +use contextforge_data_plane_cpex::CpexRuntimeRegistry; +use contextforge_data_plane_lib::{Config, Gateway}; use tokio::runtime::{Builder, LocalOptions}; use tokio::task::JoinHandle; use tracing::{debug, error, info, warn}; @@ -38,7 +38,7 @@ impl Default for Runtime { global_queue_interval: Option::default(), event_interval: Option::default(), max_io_events_per_tick: Option::default(), - thread_name: "mcp-gateway-rs-runtime".to_owned(), + thread_name: "contextforge-data-plane-runtime".to_owned(), } } } @@ -69,7 +69,7 @@ impl Runtime { self, gateway: Gateway, cpex_runtime: Option>, - ) -> contextforge_gateway_rs_lib::Result<()> { + ) -> contextforge_data_plane_lib::Result<()> { if self.single_runtime { let mut builder = Builder::new_multi_thread(); self.configure_builder(&mut builder, self.thread_name.clone()); @@ -115,7 +115,7 @@ impl Runtime { gateway: Gateway, cpex_runtime: Option>, init_sender: Option>>, - ) -> std::io::Result>> { + ) -> std::io::Result>> { thread::Builder::new().name(thread_name.clone()).spawn(move || { let mut builder = Builder::new_current_thread(); Self::configure_single_thread_builder(&mut builder, thread_name); @@ -123,7 +123,7 @@ impl Runtime { Ok(runtime) => runtime, Err(error) => { warn!("Can't build thread {error:?}"); - return Err::<(), contextforge_gateway_rs_lib::Error>(error.into()); + return Err::<(), contextforge_data_plane_lib::Error>(error.into()); }, }; @@ -148,7 +148,7 @@ impl Runtime { async fn initialize_cpex_runtime( cpex_runtime: Option>, - ) -> contextforge_gateway_rs_lib::Result>> { + ) -> contextforge_data_plane_lib::Result>> { let Some(cpex_runtime) = cpex_runtime else { return Ok(None); }; @@ -168,7 +168,7 @@ impl Runtime { } } - async fn run_gateway(gateway: Gateway) -> contextforge_gateway_rs_lib::Result<()> { + async fn run_gateway(gateway: Gateway) -> contextforge_data_plane_lib::Result<()> { let res = gateway.run_gateway().await; if res.is_ok() { debug!("Gateway process terminated"); diff --git a/crates/contextforge-gateway-rs/src/test_plugins.rs b/crates/contextforge-data-plane/src/test_plugins.rs similarity index 90% rename from crates/contextforge-gateway-rs/src/test_plugins.rs rename to crates/contextforge-data-plane/src/test_plugins.rs index 2a39628f..ee816617 100644 --- a/crates/contextforge-gateway-rs/src/test_plugins.rs +++ b/crates/contextforge-data-plane/src/test_plugins.rs @@ -1,4 +1,4 @@ -use contextforge_gateway_rs_cpex::{CmfPluginFactory, CpexRuntimeRegistry}; +use contextforge_data_plane_cpex::{CmfPluginFactory, CpexRuntimeRegistry}; pub fn register(runtime: &mut CpexRuntimeRegistry) -> Result<(), Box> { runtime.register_factory( diff --git a/crates/contextforge-gateway-rs/tests/secrets_detection_e2e.rs b/crates/contextforge-data-plane/tests/secrets_detection_e2e.rs similarity index 98% rename from crates/contextforge-gateway-rs/tests/secrets_detection_e2e.rs rename to crates/contextforge-data-plane/tests/secrets_detection_e2e.rs index a9b35eff..46058d61 100644 --- a/crates/contextforge-gateway-rs/tests/secrets_detection_e2e.rs +++ b/crates/contextforge-data-plane/tests/secrets_detection_e2e.rs @@ -13,7 +13,7 @@ use std::{ time::{Duration, Instant, SystemTime, UNIX_EPOCH}, }; -use contextforge_gateway_rs_apis::{ +use contextforge_data_plane_apis::{ User, runtime_plugin_config::{RUNTIME_PLUGIN_CONFIG_KEY, RUNTIME_PLUGIN_CONFIG_VERSION}, user_store::{BackendMCPGateway, Transport, UserConfig, VirtualHost}, @@ -174,7 +174,7 @@ struct E2eEnvironment { } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] -#[ignore = "spawns redis-server and the contextforge-gateway-rs binary"] +#[ignore = "spawns redis-server and the contextforge-data-plane binary"] async fn binary_e2e_redacts_tool_arguments_and_results() { let backend = start_backend().await; let env = start_environment( @@ -212,7 +212,7 @@ async fn binary_e2e_redacts_tool_arguments_and_results() { } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] -#[ignore = "spawns redis-server and the contextforge-gateway-rs binary"] +#[ignore = "spawns redis-server and the contextforge-data-plane binary"] async fn binary_e2e_blocks_tool_arguments_before_backend_call() { let backend = start_backend().await; let env = start_environment( @@ -294,7 +294,7 @@ async fn start_backend() -> RunningBackend { } fn start_gateway_process(gateway_port: u16, redis_port: u16) -> ChildProcess { - let binary = env!("CARGO_BIN_EXE_contextforge-gateway-rs"); + let binary = env!("CARGO_BIN_EXE_contextforge-data-plane"); let child = Command::new(binary) .current_dir(env!("CARGO_MANIFEST_DIR")) .args([ @@ -318,8 +318,8 @@ fn start_gateway_process(gateway_port: u16, redis_port: u16) -> ChildProcess { .stdout(Stdio::null()) .stderr(Stdio::null()) .spawn() - .expect("contextforge-gateway-rs binary starts"); - ChildProcess::new("contextforge-gateway-rs", child) + .expect("contextforge-data-plane binary starts"); + ChildProcess::new("contextforge-data-plane", child) } async fn wait_for_redis(port: u16, child: &mut ChildProcess) { diff --git a/deny.toml b/deny.toml index 5fb0f97a..f3a7ef7b 100644 --- a/deny.toml +++ b/deny.toml @@ -328,7 +328,8 @@ allow-registry = ["https://github.com/rust-lang/crates.io-index"] allow-git = [] [sources.allow-org] -# github.com organizations to allow git sources for +# github.com organizations to allow git sources for. The legacy organization +# still hosts the demo CPEX plugins used by the optional test feature. github = ["contextforge-gateway-rs"] # gitlab.com organizations to allow git sources for gitlab = [] diff --git a/docker/Dockerfile b/docker/Dockerfile index db21aa63..f2885d7f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,7 +12,7 @@ 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 \ --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \ - cargo build --release --features contextforge-gateway-rs-lib/with_tools + cargo build --release --features contextforge-data-plane-lib/with_tools FROM debian:trixie-slim RUN </contextforge-gateway-rs:`, + to `main` and pushes `ghcr.io//contextforge-data-plane:`, where the tag is the Cargo package version. There is no `latest` tag — pin the version. - The reference Compose stack runs the gateway with raised limits worth diff --git a/docs/book/src/gateway-options.md b/docs/book/src/gateway-options.md index 86b5ddca..7134f262 100644 --- a/docs/book/src/gateway-options.md +++ b/docs/book/src/gateway-options.md @@ -8,7 +8,7 @@ a flag and an environment variable at the same time, the command-line flag wins. For the always-current list, ask the binary directly: ```bash -cargo run -p contextforge-gateway-rs --bin contextforge-gateway-rs -- --help +cargo run -p contextforge-data-plane --bin contextforge-data-plane -- --help ``` The sections below group the options by concern: listeners, JWT, Redis, upstream @@ -40,10 +40,10 @@ cannot pass the claims layer. | Flag | Env var | Required | Meaning | | --- | --- | --- | --- | -| `--address ` | `CONTEXTFORGE_GATEWAY_RS_ADDRESS` | No | Plain HTTP listener. Omit it when serving only TLS. | -| `--tls-address ` | `CONTEXTFORGE_GATEWAY_RS_TLS_ADDRESS` | No | TLS listener address. Requires certificate and private key. | -| `--server-certificate ` | `CONTEXTFORGE_GATEWAY_RS_TLS_SERVER_CERTIFICATE` | With `--tls-address` | PEM certificate chain for downstream TLS. | -| `--server-private-key ` | `CONTEXTFORGE_GATEWAY_RS_TLS_SERVER_PRIVATE_KEY` | With `--tls-address` | PEM private key for downstream TLS. | +| `--address ` | `CONTEXTFORGE_DATA_PLANE_ADDRESS` | No | Plain HTTP listener. Omit it when serving only TLS. | +| `--tls-address ` | `CONTEXTFORGE_DATA_PLANE_TLS_ADDRESS` | No | TLS listener address. Requires certificate and private key. | +| `--server-certificate ` | `CONTEXTFORGE_DATA_PLANE_TLS_SERVER_CERTIFICATE` | With `--tls-address` | PEM certificate chain for downstream TLS. | +| `--server-private-key ` | `CONTEXTFORGE_DATA_PLANE_TLS_SERVER_PRIVATE_KEY` | With `--tls-address` | PEM private key for downstream TLS. | `--address` and `--tls-address` may both be configured, but they must not use the same socket address. @@ -52,9 +52,9 @@ the same socket address. | Flag | Env var | Required | Meaning | | --- | --- | --- | --- | -| `--token-verification-public-key ` | `CONTEXTFORGE_GATEWAY_RS_TOKEN_VERIFICATION_PUBLIC_KEY` | For RSA tokens | RSA public key used for `RS256`, `RS384`, or `RS512` tokens. | -| `--token-verification-secret ` | `CONTEXTFORGE_GATEWAY_RS_TOKEN_SECRET` | For HMAC tokens | Shared secret used for `HS256`, `HS384`, or `HS512` tokens. | -| `--token-verification-private-key ` | `CONTEXTFORGE_GATEWAY_RS_TOKEN_VERIFICATION_PRIVATE_KEY` | Local tools only | RSA private key used by the optional local token helper. Present only when `contextforge-gateway-rs-lib/with_tools` is enabled. | +| `--token-verification-public-key ` | `CONTEXTFORGE_DATA_PLANE_TOKEN_VERIFICATION_PUBLIC_KEY` | For RSA tokens | RSA public key used for `RS256`, `RS384`, or `RS512` tokens. | +| `--token-verification-secret ` | `CONTEXTFORGE_DATA_PLANE_TOKEN_SECRET` | For HMAC tokens | Shared secret used for `HS256`, `HS384`, or `HS512` tokens. | +| `--token-verification-private-key ` | `CONTEXTFORGE_DATA_PLANE_TOKEN_VERIFICATION_PRIVATE_KEY` | Local tools only | RSA private key used by the optional local token helper. Present only when `contextforge-data-plane-lib/with_tools` is enabled. | The claims layer validates issuer, audience, and expiration: @@ -71,13 +71,13 @@ then selects one virtual host inside that config. | Flag | Env var | Required | Meaning | | --- | --- | --- | --- | -| `--redis-address ` | `CONTEXTFORGE_GATEWAY_RS_REDIS_HOSTNAME` | Yes | Redis host name or IP. | -| `--redis-port ` | `CONTEXTFORGE_GATEWAY_RS_REDIS_PORT` | Yes | Redis port. | -| `--redis-mode ` | `CONTEXTFORGE_GATEWAY_RS_REDIS_CONNECTION_MODE` | Yes | Redis connection mode: `plain-text`, `tls`, or `mtls`. | -| `--redis-tls-trust-bundle ` | `CONTEXTFORGE_GATEWAY_RS_REDIS_TLS_REDIS_TRUST_BUNDLE` | TLS and mTLS | PEM trust bundle for Redis TLS. | -| `--redis-tls-client-certificate ` | `CONTEXTFORGE_GATEWAY_RS_REDIS_TLS_REDIS_CLIENT_CERTIFICATE` | mTLS | PEM client certificate for Redis mTLS. | -| `--redis-tls-client-private-key ` | `CONTEXTFORGE_GATEWAY_RS_REDIS_TLS_REDIS_CLIENT_PRIVATE_KEY` | mTLS | PEM client private key for Redis mTLS. | -| `--user-config-cache-expiry-seconds ` | `CONTEXTFORGE_GATEWAY_RS_USER_CONFIG_CACHE_EXPIRY_SECONDS` | No, default `60` | Expiry for the in-process user config cache in front of Redis. `0` disables caching and reads Redis on every request. | +| `--redis-address ` | `CONTEXTFORGE_DATA_PLANE_REDIS_HOSTNAME` | Yes | Redis host name or IP. | +| `--redis-port ` | `CONTEXTFORGE_DATA_PLANE_REDIS_PORT` | Yes | Redis port. | +| `--redis-mode ` | `CONTEXTFORGE_DATA_PLANE_REDIS_CONNECTION_MODE` | Yes | Redis connection mode: `plain-text`, `tls`, or `mtls`. | +| `--redis-tls-trust-bundle ` | `CONTEXTFORGE_DATA_PLANE_REDIS_TLS_REDIS_TRUST_BUNDLE` | TLS and mTLS | PEM trust bundle for Redis TLS. | +| `--redis-tls-client-certificate ` | `CONTEXTFORGE_DATA_PLANE_REDIS_TLS_REDIS_CLIENT_CERTIFICATE` | mTLS | PEM client certificate for Redis mTLS. | +| `--redis-tls-client-private-key ` | `CONTEXTFORGE_DATA_PLANE_REDIS_TLS_REDIS_CLIENT_PRIVATE_KEY` | mTLS | PEM client private key for Redis mTLS. | +| `--user-config-cache-expiry-seconds ` | `CONTEXTFORGE_DATA_PLANE_USER_CONFIG_CACHE_EXPIRY_SECONDS` | No, default `60` | Expiry for the in-process user config cache in front of Redis. `0` disables caching and reads Redis on every request. | Local Compose exposes plain Redis on `127.0.0.1:6379`, so local runs normally use: @@ -95,10 +95,10 @@ for config, not the routing model itself. | Flag | Env var | Required | Meaning | | --- | --- | --- | --- | -| `--upstream-connection-mode ` | `CONTEXTFORGE_GATEWAY_RS_UPSTREAM_CONNECTION_MODE` | No | Controls whether backend MCP URLs may be HTTP, HTTPS, or mTLS. | -| `--upstream-trust-bundle ` | `CONTEXTFORGE_GATEWAY_RS_TLS_UPSTREAM_TRUST_BUNDLE` | No | Additional PEM trust bundle for HTTPS upstreams. | -| `--upstream-certificate ` | `CONTEXTFORGE_GATEWAY_RS_TLS_UPSTREAM_CERTIFICATE` | mTLS modes | PEM client certificate for upstream mTLS. | -| `--upstream-private-key ` | `CONTEXTFORGE_GATEWAY_RS_TLS_UPSTREAM_PRIVATE_KEY` | mTLS modes | PEM client private key for upstream mTLS. | +| `--upstream-connection-mode ` | `CONTEXTFORGE_DATA_PLANE_UPSTREAM_CONNECTION_MODE` | No | Controls whether backend MCP URLs may be HTTP, HTTPS, or mTLS. | +| `--upstream-trust-bundle ` | `CONTEXTFORGE_DATA_PLANE_TLS_UPSTREAM_TRUST_BUNDLE` | No | Additional PEM trust bundle for HTTPS upstreams. | +| `--upstream-certificate ` | `CONTEXTFORGE_DATA_PLANE_TLS_UPSTREAM_CERTIFICATE` | mTLS modes | PEM client certificate for upstream mTLS. | +| `--upstream-private-key ` | `CONTEXTFORGE_DATA_PLANE_TLS_UPSTREAM_PRIVATE_KEY` | mTLS modes | PEM client private key for upstream mTLS. | Connection modes: @@ -116,9 +116,9 @@ before reaching that backend because the reqwest client is HTTPS-only. | Flag | Env var | Default | Meaning | | --- | --- | --- | --- | -| `--number-of-cpus ` | `CONTEXTFORGE_GATEWAY_RS_GATEWAY_CPUS` | Host CPU count | Worker thread count for the Tokio runtime shape. | -| `--single-runtime ` | `CONTEXTFORGE_GATEWAY_RS_SINGLE_RUNTIME` | `true` | `true` uses one multi-thread runtime. `false` starts multiple current-thread runtimes. | -| `--runtime-plugins-enabled ` | `CONTEXTFORGE_GATEWAY_RS_RUNTIME_PLUGINS_ENABLED` | `false` | Enables CPEX runtime plugin execution and Redis plugin config loading. | +| `--number-of-cpus ` | `CONTEXTFORGE_DATA_PLANE_NUMBER_OF_CPUS` | Host CPU count | Worker thread count for the Tokio runtime shape. | +| `--single-runtime ` | `CONTEXTFORGE_DATA_PLANE_SINGLE_RUNTIME` | `true` | `true` uses one multi-thread runtime. `false` starts multiple current-thread runtimes. | +| `--runtime-plugins-enabled ` | `CONTEXTFORGE_DATA_PLANE_RUNTIME_PLUGINS_ENABLED` | `false` | Enables CPEX runtime plugin execution and Redis plugin config loading. | When runtime plugins are enabled, plugin config is read from Redis key `ContextForgeGatewayRuntimePluginConfig`. That key is a control-plane trust @@ -128,13 +128,13 @@ boundary because it decides which registered hooks run. | Flag | Env var | Default | Meaning | | --- | --- | --- | --- | -| `--enable-open-telemetry ` | `CONTEXTFORGE_GATEWAY_RS_ENABLE_OPEN_TELEMETRY` | `false` | Enables trace export. | -| `--enable-otel-metrics ` | `CONTEXTFORGE_GATEWAY_RS_ENABLE_OTEL_METRICS` | `false` | Enables HTTP server metric export. | -| `--otlp-protocol ` | `CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` | `grpc` or `http-protobuf`. | -| `--otlp-endpoint ` | `CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_ENDPOINT` | Protocol-specific | Trace export endpoint. | -| `--otlp-metrics-endpoint ` | `CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | Protocol-specific | Metrics export endpoint. | -| `--otlp-headers ` | `CONTEXTFORGE_GATEWAY_RS_OTEL_EXPORTER_OTLP_HEADERS` | none | Comma-separated `key=value` headers for OTLP export. | -| `--otlp-service-name ` | `CONTEXTFORGE_GATEWAY_RS_OTEL_SERVICE_NAME` | `CONTEXTFORGE-GATEWAY-RS` | OpenTelemetry `service.name`. | +| `--enable-open-telemetry ` | `CONTEXTFORGE_DATA_PLANE_ENABLE_OPEN_TELEMETRY` | `false` | Enables trace export. | +| `--enable-otel-metrics ` | `CONTEXTFORGE_DATA_PLANE_ENABLE_OTEL_METRICS` | `false` | Enables HTTP server metric export. | +| `--otlp-protocol ` | `CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` | `grpc` or `http-protobuf`. | +| `--otlp-endpoint ` | `CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_ENDPOINT` | Protocol-specific | Trace export endpoint. | +| `--otlp-metrics-endpoint ` | `CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | Protocol-specific | Metrics export endpoint. | +| `--otlp-headers ` | `CONTEXTFORGE_DATA_PLANE_OTEL_EXPORTER_OTLP_HEADERS` | none | Comma-separated `key=value` headers for OTLP export. | +| `--otlp-service-name ` | `CONTEXTFORGE_DATA_PLANE_OTEL_SERVICE_NAME` | `CONTEXTFORGE-DATA-PLANE` | OpenTelemetry `service.name`. | Default endpoints: @@ -154,8 +154,8 @@ RUST_TRACE_LOG=debug | Flag or env var | Default | Meaning | | --- | --- | --- | -| `--log-name` / `CONTEXTFORGE_GATEWAY_LOG_NAME` | `contextforge-gateway-rs.log` | File log name in the current working directory. | -| `--log-rotation` / `CONTEXTFORGE_GATEWAY_LOG_ROTATION` | `hourly` | Rotation mode: `minutely`, `hourly`, `daily`, or `never`. | +| `--log-name` / `CONTEXTFORGE_DATA_PLANE_LOG_NAME` | `contextforge-data-plane.log` | File log name in the current working directory. | +| `--log-rotation` / `CONTEXTFORGE_DATA_PLANE_LOG_ROTATION` | `hourly` | Rotation mode: `minutely`, `hourly`, `daily`, or `never`. | | `RUST_LOG` | `debug` | Console event filter. | | `RUST_FILE_LOG` | `debug` | File event filter. | | `RUST_TRACE_LOG` | `info` | OpenTelemetry span filter. | @@ -186,7 +186,7 @@ You may combine this with `--address` to expose both HTTP and HTTPS listeners. ### HMAC Token Verification ```bash ---token-verification-secret "${CONTEXTFORGE_GATEWAY_RS_TOKEN_SECRET}" +--token-verification-secret "${CONTEXTFORGE_DATA_PLANE_TOKEN_SECRET}" ``` Use this only when downstream JWTs are signed with an `HS*` algorithm. RSA diff --git a/docs/book/src/local-docker-stack.md b/docs/book/src/local-docker-stack.md index 06f9de10..7d0d11f4 100644 --- a/docs/book/src/local-docker-stack.md +++ b/docs/book/src/local-docker-stack.md @@ -13,7 +13,7 @@ make docker-prod make testing-up ``` -`make docker-prod` builds `dataplane:latest` from `docker/Dockerfile`; +`make docker-prod` builds `contextforge-data-plane:latest` from `docker/Dockerfile`; `testing-up` refuses to start if this image doesn't exist yet. `testing-up` starts: `nginx`, `control-plane`, `redis`, `postgres`, `pgbouncer`, `data-plane`, `fast_time_server`, `register_fast_time` (see `Makefile`). @@ -109,5 +109,5 @@ Stops the stack (containers/volumes kept; rerun `testing-up` to resume). | --- | --- | --- | | `403 {"detail":"Token is invalid: User is no longer a member of the associated team"}` | Hit control-plane instead of dataplane — URL missing `/contextforge-rs` prefix. | Use `/contextforge-rs/servers//mcp`. | | `400 "Problem occurred retrieving the configuration"` | Dataplane has no `UserConfig` yet for the token's subject (`register_fast_time`/publisher hasn't run or synced). | Re-check config propagation above; confirm `register_fast_time` logs completed successfully and wait out the publisher interval. | -| `tools/list` returns `{"tools": [], "resultType": "complete"}` | Dataplane resolved the `UserConfig` fine, but couldn't connect to a declared backend. | `docker compose logs data-plane \| grep -i "worker quit\|BadScheme\|backend"`. A `BadScheme` error means `CONTEXTFORGE_GATEWAY_RS_UPSTREAM_CONNECTION_MODE` isn't set to `plain-text-or-tls` for a plain-`http://` backend. | +| `tools/list` returns `{"tools": [], "resultType": "complete"}` | Dataplane resolved the `UserConfig` fine, but couldn't connect to a declared backend. | `docker compose logs data-plane \| grep -i "worker quit\|BadScheme\|backend"`. A `BadScheme` error means `CONTEXTFORGE_DATA_PLANE_UPSTREAM_CONNECTION_MODE` isn't set to `plain-text-or-tls` for a plain-`http://` backend. | | `401` on every request | Bad/expired token, or control-plane and dataplane are signing/verifying with different keys or algorithms. | Confirm both sides have matching `JWT_ALGORITHM`/key config — see [Control-Plane Integration](control-plane-integration.md). | diff --git a/docs/book/src/performance.md b/docs/book/src/performance.md index 879484fb..e9a4871e 100644 --- a/docs/book/src/performance.md +++ b/docs/book/src/performance.md @@ -1,7 +1,7 @@ # Performance > ⚡ **Two load paths:** `contextforge-load-test` measures the Rust dataplane -> alone, and the [`cf-integration`](https://github.com/contextforge-gateway-rs/cf-integration) +> alone, and the [`cf-integration`](https://github.com/contextforge-org/contextforge-dev-tools) > harness measures the full nginx-to-control-plane-to-dataplane stack with > Locust. Use the first to profile gateway changes and the second to measure > what users would see. diff --git a/docs/book/src/request-flow.md b/docs/book/src/request-flow.md index f4320b1d..de553445 100644 --- a/docs/book/src/request-flow.md +++ b/docs/book/src/request-flow.md @@ -30,7 +30,7 @@ follow [Run the Gateway Locally](running-the-gateway.md) alongside this page. ## Startup Path -Startup begins in `crates/contextforge-gateway-rs/src/main.rs`: +Startup begins in `crates/contextforge-data-plane/src/main.rs`: ```text install rustls crypto provider @@ -53,7 +53,7 @@ and then calls `gateway.run_gateway()`. ## HTTP Stack Order -`Gateway::run_gateway` builds the service stack in `crates/contextforge-gateway-rs-lib/src/lib.rs`. +`Gateway::run_gateway` builds the service stack in `crates/contextforge-data-plane-lib/src/lib.rs`. Tower layers execute from the outside in, so a normal MCP request reaches the handler in this order: diff --git a/docs/book/src/running-the-gateway.md b/docs/book/src/running-the-gateway.md index da6a639a..1efba0a5 100644 --- a/docs/book/src/running-the-gateway.md +++ b/docs/book/src/running-the-gateway.md @@ -12,10 +12,10 @@ sample backend MCP servers: | `redis` | `6379` | Runtime config store for user config. | | `gateway-one` | `5555` | Sample counter MCP backend. | | `gateway-two` | `5556` | Sample conformance MCP backend. | -| `contextforge-gateway-rs` | `8001` | Rust dataplane process you run with Cargo. | +| `contextforge-data-plane` | `8001` | Rust dataplane process you run with Cargo. | > 🧪 The token and user-config endpoints below are local bootstrap helpers. They -> are compiled with `contextforge-gateway-rs-lib/with_tools`. In a real +> are compiled with `contextforge-data-plane-lib/with_tools`. In a real > deployment, the external ContextForge control plane mints tokens and writes > config to Redis. @@ -62,9 +62,9 @@ For the local bootstrap flow, run the binary with the `with_tools` dependency feature so the admin token and config endpoints are available: ```bash -cargo run -p contextforge-gateway-rs \ - --features contextforge-gateway-rs-lib/with_tools \ - --bin contextforge-gateway-rs -- \ +cargo run -p contextforge-data-plane \ + --features contextforge-data-plane-lib/with_tools \ + --bin contextforge-data-plane -- \ --address 127.0.0.1:8001 \ --redis-address 127.0.0.1 \ --redis-port 6379 \ diff --git a/docs/book/src/runtime-configuration.md b/docs/book/src/runtime-configuration.md index 3a6592f9..b16912b3 100644 --- a/docs/book/src/runtime-configuration.md +++ b/docs/book/src/runtime-configuration.md @@ -14,7 +14,7 @@ parts of the dataplane. | Surface | Source | Loaded | Main user | | --- | --- | --- | --- | -| Process `Config` | CLI flags and `CONTEXTFORGE_GATEWAY_RS_*` env vars parsed by `clap`. | Startup. | Listener setup, JWT decoder keys, Redis connection, upstream HTTP client, telemetry, runtime shape. | +| Process `Config` | CLI flags and `CONTEXTFORGE_DATA_PLANE_*` env vars parsed by `clap`. | Startup. | Listener setup, JWT decoder keys, Redis connection, upstream HTTP client, telemetry, runtime shape. | | `UserConfig` | `UserConfigStore`, currently Redis through `RedisUserConfigStore`. | Per request after JWT validation. | Virtual host and backend selection. | | `RuntimePluginConfigDocument` | Redis key `ContextForgeGatewayRuntimePluginConfig` when runtime plugins are enabled. | Startup and watcher reload. | CPEX tool pre/post hooks. | diff --git a/docs/book/src/security-model.md b/docs/book/src/security-model.md index d1643a7a..e6dfb034 100644 --- a/docs/book/src/security-model.md +++ b/docs/book/src/security-model.md @@ -55,7 +55,7 @@ apply, but expect this to tighten as policy work lands. ## Local Bootstrap Helpers -The `contextforge-gateway-rs-lib/with_tools` feature compiles in +The `contextforge-data-plane-lib/with_tools` feature compiles in `/contextforge-rs/admin/tokens/{user}`, `/contextforge-rs/admin/userconfigs/{user}`, and `/contextforge-rs/health`. These routes are registered outside the authentication middleware, so token diff --git a/docs/book/src/system-shape.md b/docs/book/src/system-shape.md index ee0f7566..0ec75ca2 100644 --- a/docs/book/src/system-shape.md +++ b/docs/book/src/system-shape.md @@ -35,7 +35,7 @@ In text form, the same model is: ContextForge control plane -> writes runtime config and owns management workflows -contextforge-gateway-rs process +contextforge-data-plane process -> authenticates, loads config, routes, fans out, applies hooks, emits signals backend MCP servers @@ -81,7 +81,7 @@ server. Internally, it is a focused proxy, fanout, policy, and merge dataplane. ## Process Assembly -Startup begins in `crates/contextforge-gateway-rs/src/main.rs`. The binary crate +Startup begins in `crates/contextforge-data-plane/src/main.rs`. The binary crate does process-level assembly: ```text @@ -114,7 +114,7 @@ logging, trace export, and metrics export setup. ## Gateway Assembly -`crates/contextforge-gateway-rs-lib/src/lib.rs` builds the dataplane stack in +`crates/contextforge-data-plane-lib/src/lib.rs` builds the dataplane stack in `Gateway::run_gateway`: ```text @@ -146,10 +146,10 @@ The repository is a Cargo workspace with narrow responsibilities: | Crate | Responsibility | | --- | --- | -| `contextforge-gateway-rs` | Process shell: CLI config, logging, telemetry exporters, Tokio runtime, allocator, plugin registry startup, gateway construction. | -| `contextforge-gateway-rs-lib` | Dataplane library: Axum stack, request middleware, config lookup, MCP fanout/routing, backend sessions, upstream clients, downstream transports. | -| `contextforge-gateway-rs-apis` | Shared contract: `UserConfig`, `VirtualHost`, `BackendMCPGateway`, Redis user key, plugin config document, schema generation. | -| `contextforge-gateway-rs-cpex` | Plugin integration: CPEX runtime registry, Redis plugin config loading, supported tool pre/post hooks, stream event adaptation. | +| `contextforge-data-plane` | Process shell: CLI config, logging, telemetry exporters, Tokio runtime, allocator, plugin registry startup, gateway construction. | +| `contextforge-data-plane-lib` | Dataplane library: Axum stack, request middleware, config lookup, MCP fanout/routing, backend sessions, upstream clients, downstream transports. | +| `contextforge-data-plane-apis` | Shared contract: `UserConfig`, `VirtualHost`, `BackendMCPGateway`, Redis user key, plugin config document, schema generation. | +| `contextforge-data-plane-cpex` | Plugin integration: CPEX runtime registry, Redis plugin config loading, supported tool pre/post hooks, stream event adaptation. | | `contextforge-load-test` | Performance harness: end-to-end MCP traffic driver. | Keep those boundaries stable. Adding dataplane behavior to the binary crate diff --git a/docs/book/src/telemetry-and-diagnostics.md b/docs/book/src/telemetry-and-diagnostics.md index 04af6a29..73b15c87 100644 --- a/docs/book/src/telemetry-and-diagnostics.md +++ b/docs/book/src/telemetry-and-diagnostics.md @@ -18,7 +18,7 @@ All export settings are process config; see the telemetry section of the ## Logging Console and file logging are always on. The file appender writes -`contextforge-gateway-rs.log` (configurable with `--log-name`) in the current +`contextforge-data-plane.log` (configurable with `--log-name`) in the current working directory and rotates hourly by default (`--log-rotation`). Three environment filters control verbosity independently: @@ -63,7 +63,7 @@ A complete local pipeline ships under `docker/` as overlays on top of the | Component | Role | Endpoint | | --- | --- | --- | -| Langfuse | Trace backend and span viewer. | UI at `http://localhost:3100`, login `admin@example.com` / `changeme`, project `ContextForge Gateway (Rust)`. | +| Langfuse | Trace backend and span viewer. | UI at `http://localhost:3100`, login `admin@example.com` / `changeme`, project `ContextForge Data Plane`. | | OTel Collector | Receives OTLP from the gateway, fans traces and metrics out. | OTLP/HTTP on `:4318`, Prometheus exposition on `:8889`, raw dumps via `docker logs otel-collector`. | | Prometheus | Scrapes the collector for browsable PromQL. | UI at `http://localhost:9090`. | @@ -83,7 +83,7 @@ Re-run with `ps` instead of `up -d` and wait until every container is healthy. ```bash RUST_TRACE_LOG=debug \ -cargo run --release --bin contextforge-gateway-rs -- \ +cargo run --release --bin contextforge-data-plane -- \ --address 0.0.0.0:8001 \ --redis-port 6379 --redis-address 127.0.0.1 --redis-mode=plain-text \ --token-verification-public-key assets/jwt.key.pub \ @@ -95,7 +95,7 @@ cargo run --release --bin contextforge-gateway-rs -- \ --otlp-endpoint http://127.0.0.1:3100/api/public/otel/v1/traces \ --otlp-headers "Authorization=Basic cGstbGYtY29udGV4dGZvcmdlOnNrLWxmLWNvbnRleHRmb3JnZQ==" \ --otlp-metrics-endpoint http://127.0.0.1:4318/v1/metrics \ - --otlp-service-name contextforge-gateway-rs + --otlp-service-name contextforge-data-plane ``` The `Authorization` header is Basic auth for the seeded Langfuse project keys diff --git a/docs/book/src/testing.md b/docs/book/src/testing.md index 0b071fe7..4f804860 100644 --- a/docs/book/src/testing.md +++ b/docs/book/src/testing.md @@ -28,7 +28,7 @@ migration inventory and should be replaced as the modern implementation lands. ## In-Repo Integration Tests -`crates/contextforge-gateway-rs-lib/tests/` exercises the gateway against +`crates/contextforge-data-plane-lib/tests/` exercises the gateway against in-process mock MCP backends (shared helpers live in `tests/support/`): | Test file | Covers | @@ -42,7 +42,7 @@ These run in `cargo nextest run` with no Docker dependencies. ## Full-Stack Integration Harness -[`cf-integration`](https://github.com/contextforge-gateway-rs/cf-integration) +[`cf-integration`](https://github.com/contextforge-org/contextforge-dev-tools) wires the external ContextForge control plane (`cf-controlplane`) to this dataplane the way production intends: the stock upstream Compose stack, plus exactly two intentional differences — nginx routes only diff --git a/docs/book/src/what-is-contextforge-gateway.md b/docs/book/src/what-is-contextforge-data-plane.md similarity index 97% rename from docs/book/src/what-is-contextforge-gateway.md rename to docs/book/src/what-is-contextforge-data-plane.md index 1d692cb5..7404fdac 100644 --- a/docs/book/src/what-is-contextforge-gateway.md +++ b/docs/book/src/what-is-contextforge-data-plane.md @@ -1,8 +1,8 @@ -# What is ContextForge Gateway? +# What is ContextForge Data Plane? -Welcome to the ContextForge Gateway book. +Welcome to the ContextForge Data Plane book. -`contextforge-gateway-rs` is the Rust **dataplane** for ContextForge: a single +`contextforge-data-plane` is the Rust **data plane** for ContextForge: a single MCP entry point that sits in front of many backend MCP servers and makes them look like one. If you have used an API gateway or reverse proxy for HTTP APIs, this is the same idea for the Model Context Protocol (MCP). From 88c4070edf29d2a9aea0fd965523799a89c713f2 Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 11:02:34 +0100 Subject: [PATCH 02/10] Harden Docker infrastructure validation Signed-off-by: lucarlig --- .github/workflows/docker_image_ci.yaml | 15 +++++++-------- docker/Dockerfile | 8 ++++---- docker/dev.Dockerfile | 8 ++++---- docker/mcp_conformance.Dockerfile | 14 +++++++++----- docker/mcp_counter.Dockerfile | 14 +++++++++----- 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/.github/workflows/docker_image_ci.yaml b/.github/workflows/docker_image_ci.yaml index 64b654df..f5aefef2 100644 --- a/.github/workflows/docker_image_ci.yaml +++ b/.github/workflows/docker_image_ci.yaml @@ -21,17 +21,16 @@ jobs: id: set_version run: | CF_VERSION=$(grep -m 1 '^version' Cargo.toml | sed 's/version\s*=\s*"\(.*\)"/\1/') - echo "CF_VERSION=$CF_VERSION" >> $GITHUB_ENV + echo "CF_VERSION=${CF_VERSION}" >> "${GITHUB_ENV}" - name: Show version - run: echo $CF_VERSION + run: echo "${CF_VERSION}" - name: Build the Docker image - run: docker build . --file docker/Dockerfile --tag $IMAGE_NAME:latest + run: docker build . --file docker/Dockerfile --tag "${IMAGE_NAME}:latest" - name: Log in to registry - run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin - name: Push image run: | - IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME - docker tag $IMAGE_NAME:latest $IMAGE_ID:$CF_VERSION - docker push $IMAGE_ID:$CF_VERSION - + IMAGE_ID="ghcr.io/${{ github.repository_owner }}/${IMAGE_NAME}" + docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:${CF_VERSION}" + docker push "${IMAGE_ID}:${CF_VERSION}" diff --git a/docker/Dockerfile b/docker/Dockerfile index f2885d7f..bd08ecf9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -7,11 +7,11 @@ apt install -y ca-certificates protobuf-compiler EOF COPY . . -RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry \ - --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \ +RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ cargo fetch --locked -RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry \ - --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \ +RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ cargo build --release --features contextforge-data-plane-lib/with_tools FROM debian:trixie-slim diff --git a/docker/dev.Dockerfile b/docker/dev.Dockerfile index cceb8bbc..3bb36a93 100644 --- a/docker/dev.Dockerfile +++ b/docker/dev.Dockerfile @@ -13,12 +13,12 @@ COPY Cargo.toml ./Cargo.toml COPY Cargo.lock ./Cargo.lock RUN \ - --mount=type=cache,id=cargo,target=/usr/local/cargo/registry \ - --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \ + --mount=type=cache,id=cargo,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ cargo fetch --locked RUN --mount=type=cache,target=/app/target \ - --mount=type=cache,id=cargo,target=/usr/local/cargo/registry \ - --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git \ + --mount=type=cache,id=cargo,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ cargo build --release FROM debian:trixie diff --git a/docker/mcp_conformance.Dockerfile b/docker/mcp_conformance.Dockerfile index d68d57cc..31f61678 100644 --- a/docker/mcp_conformance.Dockerfile +++ b/docker/mcp_conformance.Dockerfile @@ -9,16 +9,20 @@ git config --global http.sslVerify false git clone https://github.com/contextforge-gateway-rs/mcp-rust-sdk.git rust-sdk EOF WORKDIR /tmp/rust-sdk -RUN git checkout enabling_propagation_of_new_session_id_2 +RUN < Date: Fri, 7 Aug 2026 11:13:28 +0100 Subject: [PATCH 03/10] Remove retired MCP SDK fork stack Signed-off-by: lucarlig --- README.md | 307 +++------------------- docker/docker-compose-langfuse.yaml | 14 +- docker/docker-compose-local.yaml | 109 +++----- docker/docker-compose-otel-collector.yaml | 6 +- docker/mcp_conformance.Dockerfile | 39 --- docker/mcp_counter.Dockerfile | 39 --- docs/book/src/running-the-gateway.md | 268 +++---------------- 7 files changed, 119 insertions(+), 663 deletions(-) delete mode 100644 docker/mcp_conformance.Dockerfile delete mode 100644 docker/mcp_counter.Dockerfile diff --git a/README.md b/README.md index 1d6e5456..a65a6a89 100644 --- a/README.md +++ b/README.md @@ -1,299 +1,70 @@ # ContextForge Data Plane -Architecture, configuration, and operations documentation lives in -[The ContextForge Data Plane Book](docs/book/src/SUMMARY.md) under `docs/book`. -Build it locally with `mdbook serve docs/book`; see -[docs/book/README.md](docs/book/README.md) for details. +The Rust data plane for +[ContextForge](https://github.com/IBM/mcp-context-forge). It accepts modern MCP +traffic, loads control-plane-published configuration from Redis, and routes +authorized requests to configured MCP backends. -## Running -1. Start Redis and gateways -``` -docker compose -f docker/docker-compose-local.yaml up -d -``` - -Check Redis and backend status: -```bash -docker compose -f docker/docker-compose-local.yaml ps redis gateway-one gateway-two -``` - -2. Run gateway -```bash - cargo run --bin contextforge-data-plane -- --address 0.0.0.0:8001 --redis-port 6379 --redis-address 127.0.0.1 --token-verification-public-key assets/jwt.key.pub --token-verification-private-key assets/jwt.key --number-of-cpus 16 --redis-mode=plain-text --upstream-connection-mode=plain-text-or-tls -``` - -This should spin up Redis instance and two mcp-gateways: a simple counter and a conformance test server from mcp-rust-sdk +Architecture, configuration, operations, and development documentation lives +in [The ContextForge Data Plane Book](docs/book/src/SUMMARY.md). Build it locally +with `mdbook serve docs/book`; see [docs/book/README.md](docs/book/README.md). -3. Get a test JWT token -```bash -USER_ID=11111111-1111-1111-1111-111111111111 -USER_EMAIL=admin@example.com +## Quick Start -curl --request GET \ - --url "http://127.0.0.1:8001/contextforge-rs/admin/tokens/${USER_ID}?email=${USER_EMAIL}" \ - --header 'accept: application/json' \ - --header 'content-type: application/json' -``` +Build the production image and start the supported control-plane + data-plane +test stack: -4. Use the token to add a test user to Redis ```bash -curl --request POST \ - --url "http://127.0.0.1:8001/contextforge-rs/admin/userconfigs/${USER_ID}" \ - --header 'authorization: Bearer {{token}}' \ - --header 'content-type: application/json' \ - --data '{ - "virtual_hosts": { - "c0ffee00f001f00lf00ldeadbeefdead": { - "backends": { - "gateway-one": { - "name": "gateway-one", - "url": "http://127.0.0.1:5555/mcp", - "transport": "STREAMABLEHTTP", - "passthrough_headers": [], - "allowed_tool_names": [], - "allowed_resource_names": [], - "allowed_prompt_names": [] - }, - "gateway-two": { - "name": "gateway-two", - "url": "http://127.0.0.1:5556/mcp", - "transport": "STREAMABLEHTTP", - "passthrough_headers": [], - "allowed_tool_names": [], - "allowed_resource_names": [], - "allowed_prompt_names": [] - } - } - } - } -}' +make docker-prod +make testing-up ``` -6. Spin up MCP Inspector to test the calls - - -## Runtime CPEX Plugins - -Runtime CPEX plugins are disabled by default. Enable hook execution when starting the gateway: +The stack uses the current `fast_time_server` backend and exercises config +publication through the external ContextForge control plane. Follow +[Local Docker Stack](docs/book/src/local-docker-stack.md) for the complete smoke +test, then stop it with: ```bash -cargo run --release --bin contextforge-data-plane -- \ - --address 0.0.0.0:8001 \ - --redis-port 6379 \ - --redis-address 127.0.0.1 \ - --token-verification-public-key assets/jwt.key.pub \ - --token-verification-private-key assets/jwt.key \ - --number-of-cpus 16 \ - --redis-mode=plain-text \ - --upstream-connection-mode=plain-text-or-tls \ - --runtime-plugins-enabled true +make testing-down ``` -Plugin configuration is stored in Redis at key `ContextForgeGatewayRuntimePluginConfig`. The value can be JSON or MessagePack with `version: 1` and `cpex` containing the CPEX config. When runtime plugins are enabled with Redis config, this key must exist before startup. The gateway reloads that key while running, builds a new initialized CPEX runtime, and swaps the runtime registry to the new immutable `PluginManager`. The existing `PluginManager` is not mutated after initialization. - -This integration currently passes only tool payloads. CPEX configs that enable route-based plugin selection, plugin directories, global policies/defaults, non-tool hooks, or plugin conditions are rejected in this PR. Redis write access to this key is a control-plane trust boundary because it controls which registered hooks run. - -### Payload Marker Demo - -This demo uses the `test-plugins` feature, which includes the demo plugin crates from `cpex-plugins-rs`. The plugin must be included in the gateway build before the gateway starts. Redis runtime registration activates already-registered factories; it does not load new Rust code into a running process. +## Run the Binary from Cargo -Build the gateway with the demo plugin factories: +For a lightweight host-development setup, start Redis and the current Fast Time +MCP backend: ```bash -cargo check -p contextforge-data-plane --features test-plugins -``` - -The `test-plugins` feature registers those demo plugin factories through the gateway's generic CMF factory adapter. - -Start Redis and the sample MCP backends: - -```bash -GATEWAY_CPU_LIMIT=1 \ -GATEWAY_CPU_RESERVATION=0.5 \ -GATEWAY_MEM_LIMIT=1G \ -GATEWAY_MEM_RESERVATION=512M \ docker compose -f docker/docker-compose-local.yaml up -d +docker compose -f docker/docker-compose-local.yaml ps redis fast_time_server ``` -Check Redis and backend status: -```bash -docker compose -f docker/docker-compose-local.yaml ps redis gateway-one gateway-two -``` - -Register the payload marker config in Redis before starting the enabled gateway: - -```bash -docker compose -f docker/docker-compose-local.yaml exec -T redis redis-cli SET ContextForgeGatewayRuntimePluginConfig '{ - "version": 1, - "cpex": { - "plugins": [ - { - "name": "payload-marker", - "kind": "contextforge/payload-marker", - "hooks": ["cmf.tool_post_invoke"] - } - ] - } -}' -``` - -Run only one gateway process on port `8001` at a time. Stop the current gateway with `Ctrl-C` before switching between disabled and enabled plugin runs. - -Start the gateway with runtime plugins disabled for a baseline run: - -```bash -cargo run --release --features test-plugins --bin contextforge-data-plane -- \ - --address 0.0.0.0:8001 \ - --redis-port 6379 \ - --redis-address 127.0.0.1 \ - --token-verification-public-key assets/jwt.key.pub \ - --token-verification-private-key assets/jwt.key \ - --number-of-cpus 16 \ - --redis-mode=plain-text \ - --upstream-connection-mode=plain-text-or-tls \ - --runtime-plugins-enabled false -``` - -Start the gateway with runtime plugins enabled for the marker run: +Then follow [Run the Gateway Locally](docs/book/src/running-the-gateway.md). The +lightweight stack uses the same maintained Fast Time backend as the supported +end-to-end test stack. -```bash -cargo run --release --features test-plugins --bin contextforge-data-plane -- \ - --address 0.0.0.0:8001 \ - --redis-port 6379 \ - --redis-address 127.0.0.1 \ - --token-verification-public-key assets/jwt.key.pub \ - --token-verification-private-key assets/jwt.key \ - --number-of-cpus 16 \ - --redis-mode=plain-text \ - --upstream-connection-mode=plain-text-or-tls \ - --runtime-plugins-enabled true -``` - -Get a token: - -```bash -USER_ID=11111111-1111-1111-1111-111111111111 -USER_EMAIL=admin@example.com - -TOKEN=$(curl --silent --show-error --request GET \ - --url "http://127.0.0.1:8001/contextforge-rs/admin/tokens/${USER_ID}?email=${USER_EMAIL}" \ - --header 'accept: application/json' \ - --header 'content-type: application/json') -``` - -Create the gateway user config: - -```bash -curl --silent --show-error --request POST \ - --url "http://127.0.0.1:8001/contextforge-rs/admin/userconfigs/${USER_ID}" \ - --header "authorization: Bearer ${TOKEN}" \ - --header 'content-type: application/json' \ - --data '{ - "virtual_hosts": { - "c0ffee00f001f00lf00ldeadbeefdead": { - "backends": { - "gateway-one": { - "name": "gateway-one", - "url": "http://127.0.0.1:5555/mcp", - "transport": "STREAMABLEHTTP", - "passthrough_headers": [], - "allowed_tool_names": [], - "allowed_resource_names": [], - "allowed_prompt_names": [] - } - } - } - } - }' -``` - -Open an MCP session: - -```bash -INIT_HEADERS=$(mktemp) -``` - -```bash -curl --silent --show-error \ - --dump-header "${INIT_HEADERS}" \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{ - "jsonrpc": "2.0", - "id": 0, - "method": "initialize", - "params": { - "protocolVersion": "2025-11-25", - "capabilities": {}, - "clientInfo": { "name": "curl", "version": "0.1.0" } - } - }' -``` - -```bash -SESSION_ID=$(awk 'tolower($1) == "mcp-session-id:" { gsub("\r", "", $2); print $2 }' "${INIT_HEADERS}") -``` - -```bash -curl --silent --show-error \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header "mcp-session-id: ${SESSION_ID}" \ - --header 'mcp-protocol-version: 2025-11-25' \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{"jsonrpc":"2.0","method":"notifications/initialized"}' -``` - -Send a tool request: - -```bash -curl --silent --show-error \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header "mcp-session-id: ${SESSION_ID}" \ - --header 'mcp-protocol-version: 2025-11-25' \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{ - "jsonrpc": "2.0", - "id": 1, - "method": "tools/call", - "params": { - "name": "gateway-one-say_hello", - "arguments": {} - } - }' -``` - -With `--runtime-plugins-enabled false`, the response content should include only the backend tool result: - -```text -hello -``` +## Runtime CPEX Plugins -With `--runtime-plugins-enabled true`, the response content should include the backend tool result plus an additional text part: +Runtime CPEX plugins are disabled by default. When enabled, the data plane loads +validated plugin configuration from Redis and supports the narrow hook surface +documented in [Plugins And Policy](docs/book/src/plugins-and-policy.md). -```text -[cpex:payload-marker] -``` +The optional demo plugin crates still come from their independently hosted +`cpex-plugins-rs` repository; they are unrelated to the retired MCP SDK fork. -## Tracing & Metrics +## Tracing and Metrics -The gateway exports OTLP traces and metrics -(issue [#4721](https://github.com/IBM/mcp-context-forge/issues/4721)), and a -local verification stack (Langfuse + OTel Collector + Prometheus) ships as -compose overlays under `docker/`. The full walkthrough — flags, stack setup, -starter PromQL queries, and a debugging checklist — lives in the book: +The data plane exports OTLP traces and metrics. The local Langfuse, +OpenTelemetry Collector, and Prometheus overlays are documented in [Telemetry And Diagnostics](docs/book/src/telemetry-and-diagnostics.md). ## Performance Tests -As above and then run: -```bash -cargo run --release --bin contextforge-load-test -- --host 'http://127.0.0.1:8001' -r 40 -u 120 --run-time 120s --report-file report.html +With a configured data plane running on port `8001`: +```bash +cargo run --release --bin contextforge-load-test -- \ + --host http://127.0.0.1:8001 \ + -r 40 -u 120 --run-time 120s --report-file report.html ``` -[Performance reports](./reports) +Existing benchmark results are under [reports](reports). diff --git a/docker/docker-compose-langfuse.yaml b/docker/docker-compose-langfuse.yaml index 3f7535d3..1727a0fe 100644 --- a/docker/docker-compose-langfuse.yaml +++ b/docker/docker-compose-langfuse.yaml @@ -19,7 +19,7 @@ # this repo: # * No `gateway:` overrides (Rust gateway runs on the host, not in compose). # * No fast-test / a2a sidecar overrides. -# * Reuses `gateways-net` already declared by docker-compose-local.yaml. +# * Reuses `contextforge-data-plane-net` from docker-compose-local.yaml. # # All credentials below are local-only development defaults and may be # overridden via environment variables before `docker compose up`. @@ -53,7 +53,7 @@ services: langfuse-web: image: docker.io/langfuse/langfuse:3 restart: unless-stopped - networks: [gateways-net] + networks: [contextforge-data-plane-net] depends_on: langfuse-db: condition: service_healthy @@ -135,7 +135,7 @@ services: langfuse-worker: image: docker.io/langfuse/langfuse-worker:3 restart: unless-stopped - networks: [gateways-net] + networks: [contextforge-data-plane-net] depends_on: langfuse-db: condition: service_healthy @@ -162,7 +162,7 @@ services: langfuse-db: image: docker.io/postgres:${LANGFUSE_POSTGRES_VERSION:-17} restart: unless-stopped - networks: [gateways-net] + networks: [contextforge-data-plane-net] environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: ${LANGFUSE_POSTGRES_PASSWORD:-langfuse} @@ -191,7 +191,7 @@ services: langfuse-clickhouse: image: docker.io/clickhouse/clickhouse-server restart: unless-stopped - networks: [gateways-net] + networks: [contextforge-data-plane-net] user: "101:101" environment: CLICKHOUSE_DB: default @@ -221,7 +221,7 @@ services: langfuse-minio: image: cgr.dev/chainguard/minio restart: unless-stopped - networks: [gateways-net] + networks: [contextforge-data-plane-net] entrypoint: sh command: -c 'mkdir -p /data/langfuse && minio server --address ":9000" --console-address ":9001" /data' environment: @@ -250,7 +250,7 @@ services: langfuse-cache: image: docker.io/redis:7 restart: unless-stopped - networks: [gateways-net] + networks: [contextforge-data-plane-net] command: > --requirepass ${LANGFUSE_REDIS_AUTH:-langfuse-redis-secret} --maxmemory-policy noeviction diff --git a/docker/docker-compose-local.yaml b/docker/docker-compose-local.yaml index 33736793..a35793ae 100644 --- a/docker/docker-compose-local.yaml +++ b/docker/docker-compose-local.yaml @@ -1,89 +1,38 @@ -#version: "3.9" # Supported by both podman-compose and Docker Compose v2+ -name: mcp-gatewys - +# Lightweight dependencies for running the dataplane binary from Cargo. +name: contextforge-data-plane-local networks: - gateways-net: # Single user-defined bridge network keeps traffic private + contextforge-data-plane-net: driver: bridge -############################################################################### -# CORE SERVICE - ContextForge -############################################################################### services: - gateway-one: - image: mcp_counter - build: - dockerfile: mcp_counter.Dockerfile - - networks: [gateways-net] - ports: [5555:5555] - - environment: - - RUST_LOG=warn - - MCP_SERVER_BIND_ADDRESS=0.0.0.0:5555 - - MCP_SERVER_ALLOWED_HOSTS=127.0.0.1,9.85.219.104,192.168.1.14 - - sysctls: - - net.ipv4.tcp_fin_timeout=15 - - net.ipv4.ip_local_port_range=1024 65535 - ulimits: - nofile: - soft: 65535 - hard: 65535 - - depends_on: - redis: - condition: service_started - - deploy: - resources: - limits: - cpus: '${GATEWAY_CPU_LIMIT:-8}' - memory: ${GATEWAY_MEM_LIMIT:-8G} - reservations: - cpus: '${GATEWAY_CPU_RESERVATION:-4}' - memory: ${GATEWAY_MEM_RESERVATION:-4G} - - gateway-two: - image: mcp_conformance - build: - dockerfile: mcp_conformance.Dockerfile - networks: [gateways-net] - ports: [5556:5556] - + fast_time_server: + image: ghcr.io/ibm/cfex-mcp-fast-time-server:latest + restart: unless-stopped + networks: [contextforge-data-plane-net] + ports: + - "8880:8880" environment: - - RUST_LOG=warn - - PORT=5556 - + - BIND_ADDRESS=0.0.0.0:8880 + - RUST_LOG=info sysctls: - net.ipv4.tcp_fin_timeout=15 - net.ipv4.ip_local_port_range=1024 65535 + - net.core.somaxconn=65535 ulimits: nofile: soft: 65535 hard: 65535 + nproc: + soft: 5000 + hard: 5000 + healthcheck: + test: ["CMD", "curl", "-sf", "http://localhost:8880/health"] + interval: 5s + timeout: 3s + retries: 10 + start_period: 10s - depends_on: - redis: - condition: service_started - - deploy: - resources: - limits: - cpus: '${GATEWAY_CPU_LIMIT:-8}' - memory: ${GATEWAY_MEM_LIMIT:-8G} - reservations: - cpus: '${GATEWAY_CPU_RESERVATION:-4}' - memory: ${GATEWAY_MEM_RESERVATION:-4G} - - - - - - -############################################################################### -# CACHE -############################################################################### redis: image: redis:latest ulimits: @@ -117,14 +66,19 @@ services: - "no" # - "--tls-ca-cert-file" # - "/tls_config/contextforge.intermediate.cert.pem" + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 5s + timeout: 3s + retries: 10 + start_period: 5s ports: - - "6379:6379" # expose only if you want host access - - "16379:16379" # expose only if you want host access - volumes: + - "6379:6379" + - "16379:16379" + volumes: - ../assets/contextforgeCA/:/tls_config:z - - networks: [gateways-net] + networks: [contextforge-data-plane-net] deploy: resources: limits: @@ -133,4 +87,3 @@ services: reservations: cpus: '1' memory: 1G - diff --git a/docker/docker-compose-otel-collector.yaml b/docker/docker-compose-otel-collector.yaml index 774cd737..098538bd 100644 --- a/docker/docker-compose-otel-collector.yaml +++ b/docker/docker-compose-otel-collector.yaml @@ -26,7 +26,7 @@ # Inspect: # docker logs otel-collector --tail 200 # -# Reuses `gateways-net` already declared by docker-compose-local.yaml. +# Reuses `contextforge-data-plane-net` from docker-compose-local.yaml. services: otel-collector: @@ -42,7 +42,7 @@ services: # Prometheus-text endpoint exposed by the `prometheus` exporter, # scraped by the prometheus service below. - "8889:8889" - networks: [gateways-net] + networks: [contextforge-data-plane-net] prometheus: image: docker.io/prom/prometheus:v2.55.0 @@ -58,4 +58,4 @@ services: - "9090:9090" depends_on: - otel-collector - networks: [gateways-net] + networks: [contextforge-data-plane-net] diff --git a/docker/mcp_conformance.Dockerfile b/docker/mcp_conformance.Dockerfile deleted file mode 100644 index 31f61678..00000000 --- a/docker/mcp_conformance.Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM rust:1.96.1 AS builder -WORKDIR /tmp/ - -RUN < 🧪 The token and user-config endpoints below are local bootstrap helpers. They -> are compiled with `contextforge-data-plane-lib/with_tools`. In a real -> deployment, the external ContextForge control plane mints tokens and writes -> config to Redis. - -Run the numbered steps in order, in the same terminal. Later steps reuse shell -variables such as `${TOKEN}` and `${SESSION_ID}` that earlier steps set, so a -fresh shell will not have them. - -## Prerequisites +The supported smoke environment includes the external ContextForge control +plane, Redis, PostgreSQL, PgBouncer, the Rust data plane, and +`fast_time_server`: -- Rust toolchain matching the workspace `rust-version`. -- Docker Compose. -- Free local ports: `6379`, `16379`, `5555`, `5556`, and `8001`. The Compose - stack maps both plain (`6379`) and TLS (`16379`) Redis ports. -- Test keys under `assets/`: `jwt.key` and `jwt.key.pub`. +```bash +make docker-prod +make testing-up +``` -## 1. Start Redis and Backend MCP Servers +Confirm the services and one-shot registration job: ```bash -docker compose -f docker/docker-compose-local.yaml up -d +docker compose -f docker/docker-compose.yml ps -a +docker compose -f docker/docker-compose.yml logs register_fast_time ``` -The sample backends default to a CPU limit of `8` and a reservation of `4`, -which Docker rejects on hosts with fewer CPUs -(`range of CPUs is from 0.01 to ...`). On smaller machines, override the -sizing knobs: +Continue with [Local Docker Stack](local-docker-stack.md) for token creation, +config propagation, and an MCP smoke test through the complete control-plane to +data-plane path. + +Stop the stack without deleting its containers or volumes: ```bash -GATEWAY_CPU_LIMIT=2 GATEWAY_CPU_RESERVATION=0.5 \ - docker compose -f docker/docker-compose-local.yaml up -d +make testing-down ``` -Check that the local dependencies are running: +## Run the Rust Binary from Cargo + +For debugger, profiler, or rapid host-development loops, start only Redis and +the current test backend: ```bash -docker compose -f docker/docker-compose-local.yaml ps redis gateway-one gateway-two +docker compose -f docker/docker-compose-local.yaml up -d +docker compose -f docker/docker-compose-local.yaml ps redis fast_time_server ``` -The backends listen on the host so the gateway can reach them at -`http://127.0.0.1:5555/mcp` and `http://127.0.0.1:5556/mcp`. +The services are available at: -## 2. Start the Gateway +| Service | Local endpoint | Role | +| --- | --- | --- | +| `redis` | `127.0.0.1:6379` | Runtime configuration store. | +| `fast_time_server` | `http://127.0.0.1:8880/mcp` | Current sample MCP backend. | -For the local bootstrap flow, run the binary with the `with_tools` dependency -feature so the admin token and config endpoints are available: +Run the binary with the local bootstrap helpers when direct token/config setup +is needed during development: ```bash cargo run -p contextforge-data-plane \ @@ -75,199 +65,19 @@ cargo run -p contextforge-data-plane \ --number-of-cpus 4 ``` -Keep this process running. The gateway exposes MCP traffic under: +The client-facing route is: ```text http://127.0.0.1:8001/contextforge-rs/servers/{virtual_host_id}/mcp ``` -The local command uses `--upstream-connection-mode plain-text-or-tls` because -the sample backend URLs are plain HTTP. Without that option, the default -upstream client is HTTPS-only. - -## 3. Mint a Test Token - -In another terminal, request a JWT for the test subject: - -```bash -USER_ID=11111111-1111-1111-1111-111111111111 -USER_EMAIL=admin@example.com - -TOKEN=$(curl --silent --show-error \ - --url "http://127.0.0.1:8001/contextforge-rs/admin/tokens/${USER_ID}?email=${USER_EMAIL}") - -printf '%s\n' "${TOKEN}" -``` - -The token's `sub` claim is the UUID in `USER_ID`. The gateway uses that subject -as the Redis user-config key; email metadata, when present, is not used for MCP -routing. - -## 4. Write User Config - -Seed Redis with one virtual host and two backend MCP servers: - -```bash -curl --silent --show-error --request POST \ - --url "http://127.0.0.1:8001/contextforge-rs/admin/userconfigs/${USER_ID}" \ - --header 'content-type: application/json' \ - --data '{ - "virtual_hosts": { - "c0ffee00f001f00lf00ldeadbeefdead": { - "backends": { - "gateway-one": { - "name": "gateway-one", - "url": "http://127.0.0.1:5555/mcp", - "transport": "STREAMABLEHTTP", - "passthrough_headers": [], - "allowed_tool_names": [], - "allowed_resource_names": [], - "allowed_prompt_names": [] - }, - "gateway-two": { - "name": "gateway-two", - "url": "http://127.0.0.1:5556/mcp", - "transport": "STREAMABLEHTTP", - "passthrough_headers": [], - "allowed_tool_names": [], - "allowed_resource_names": [], - "allowed_prompt_names": [] - } - } - } - } - }' -``` - -The important relationship is: - -```text -JWT subject 11111111-1111-1111-1111-111111111111 - -> Redis user config - -> virtual host c0ffee00f001f00lf00ldeadbeefdead - -> backend MCP URLs -``` - -## 5. Temporary Legacy Smoke Flow - -> This section exercises the current migration-era implementation. It is not -> the supported downstream client contract. New clients must target MCP -> `2026-07-28` over Streamable HTTP with `server/discover` and per-request -> client context. Legacy clients and SSE remain on control-plane routes and do -> not use this dataplane endpoint; this smoke flow will be replaced as the -> dataplane migration lands. - -Open a streamable HTTP MCP session and save the returned `mcp-session-id` -header: - -```bash -INIT_HEADERS=$(mktemp) - -curl --silent --show-error \ - --dump-header "${INIT_HEADERS}" \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{ - "jsonrpc": "2.0", - "id": 0, - "method": "initialize", - "params": { - "protocolVersion": "2025-11-25", - "capabilities": {}, - "clientInfo": { "name": "curl", "version": "0.1.0" } - } - }' - -SESSION_ID=$(awk 'tolower($1) == "mcp-session-id:" { gsub("\r", "", $2); print $2 }' "${INIT_HEADERS}") -printf '%s\n' "${SESSION_ID}" -``` - -During `initialize`, the gateway opens upstream MCP client sessions to the -configured backends and stores them under the downstream session id. - -Send the MCP initialized notification: - -```bash -curl --silent --show-error \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header "mcp-session-id: ${SESSION_ID}" \ - --header 'mcp-protocol-version: 2025-11-25' \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{"jsonrpc":"2.0","method":"notifications/initialized"}' -``` - -## 6. List Tools - -```bash -curl --silent --show-error \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header "mcp-session-id: ${SESSION_ID}" \ - --header 'mcp-protocol-version: 2025-11-25' \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' -``` - -The response should contain tool names prefixed with their backend name, such as -`gateway-one-increment`. That prefix is the routing contract for later -`tools/call` requests. - -## 7. Call a Tool - -```bash -curl --silent --show-error \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header "mcp-session-id: ${SESSION_ID}" \ - --header 'mcp-protocol-version: 2025-11-25' \ - --header 'content-type: application/json' \ - --header 'accept: application/json, text/event-stream' \ - --data '{ - "jsonrpc": "2.0", - "id": 2, - "method": "tools/call", - "params": { - "name": "gateway-one-increment", - "arguments": {} - } - }' -``` - -The gateway strips `gateway-one-`, forwards `increment` to the `gateway-one` -backend session, and returns the backend result to the client. - -## 8. End the Session - -```bash -curl --silent --show-error --request DELETE \ - --url http://127.0.0.1:8001/contextforge-rs/servers/c0ffee00f001f00lf00ldeadbeefdead/mcp \ - --header "authorization: Bearer ${TOKEN}" \ - --header "mcp-session-id: ${SESSION_ID}" -``` - -The gateway removes local session state and backend transports for that user -and MCP session id. - -## Troubleshooting - -| Symptom | Likely boundary | -| --- | --- | -| `401 Unauthorized` | Missing bearer token, invalid signature, expired token, wrong issuer, wrong audience, or no configured decoder key. | -| `400 Problem occurred retrieving the configuration` | Redis has no config for the JWT subject, or the Redis lookup returned no data. | -| `500 Problem occurred retrieving the configuration` | The stored config could not be decoded, the Redis key could not be encoded, or another non-missing config-store error occurred. | -| `404` with `{"detail":"Server not found"}` | The path virtual host id is not present in that user's config. | -| MCP session id is empty | The `initialize` call failed before RMCP created a downstream session. | -| Backend calls fail | Backend URL is wrong, backend process is down, or `--upstream-connection-mode` rejects the URL scheme. | -| Calls fail after gateway restart | Backend MCP session state is local process state today. Re-run `initialize`. | - -## Tear Down +The target downstream contract is MCP `2026-07-28` over Streamable HTTP using +`server/discover` and per-request client metadata. Older protocol versions, +legacy session initialization, and SSE remain control-plane responsibilities; +see [MCP Behavior](mcp-behavior.md) and +[Control-Plane Integration](control-plane-integration.md). -Stop the gateway with `Ctrl-C`, then stop local dependencies: +Stop the host process with `Ctrl-C`, then remove the lightweight dependencies: ```bash docker compose -f docker/docker-compose-local.yaml down From 7dc56dc1cd696d02d376cace54108cfcf92aa5ff Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 11:28:20 +0100 Subject: [PATCH 04/10] Restore MCP test fixtures from official SDK Signed-off-by: lucarlig --- README.md | 11 ++++--- docker/docker-compose-local.yaml | 46 ++++++++++++++++++---------- docker/mcp_conformance.Dockerfile | 45 +++++++++++++++++++++++++++ docker/mcp_counter.Dockerfile | 45 +++++++++++++++++++++++++++ docs/book/src/running-the-gateway.md | 17 ++++++---- 5 files changed, 137 insertions(+), 27 deletions(-) create mode 100644 docker/mcp_conformance.Dockerfile create mode 100644 docker/mcp_counter.Dockerfile diff --git a/README.md b/README.md index a65a6a89..3ba20f71 100644 --- a/README.md +++ b/README.md @@ -30,17 +30,18 @@ make testing-down ## Run the Binary from Cargo -For a lightweight host-development setup, start Redis and the current Fast Time -MCP backend: +For a lightweight host-development setup, start Redis and the MCP Rust SDK +counter and conformance fixtures: ```bash docker compose -f docker/docker-compose-local.yaml up -d -docker compose -f docker/docker-compose-local.yaml ps redis fast_time_server +docker compose -f docker/docker-compose-local.yaml ps redis gateway-one gateway-two ``` Then follow [Run the Gateway Locally](docs/book/src/running-the-gateway.md). The -lightweight stack uses the same maintained Fast Time backend as the supported -end-to-end test stack. +fixtures build from a pinned revision of the official +[`modelcontextprotocol/rust-sdk`](https://github.com/modelcontextprotocol/rust-sdk) +repository; they do not use the retired SDK fork. ## Runtime CPEX Plugins diff --git a/docker/docker-compose-local.yaml b/docker/docker-compose-local.yaml index a35793ae..5f13cfab 100644 --- a/docker/docker-compose-local.yaml +++ b/docker/docker-compose-local.yaml @@ -6,32 +6,46 @@ networks: driver: bridge services: - fast_time_server: - image: ghcr.io/ibm/cfex-mcp-fast-time-server:latest - restart: unless-stopped + gateway-one: + image: mcp_counter + build: + dockerfile: mcp_counter.Dockerfile networks: [contextforge-data-plane-net] ports: - - "8880:8880" + - "5555:5555" environment: - - BIND_ADDRESS=0.0.0.0:8880 - - RUST_LOG=info + - RUST_LOG=warn sysctls: - net.ipv4.tcp_fin_timeout=15 - net.ipv4.ip_local_port_range=1024 65535 - - net.core.somaxconn=65535 ulimits: nofile: soft: 65535 hard: 65535 - nproc: - soft: 5000 - hard: 5000 - healthcheck: - test: ["CMD", "curl", "-sf", "http://localhost:8880/health"] - interval: 5s - timeout: 3s - retries: 10 - start_period: 10s + depends_on: + redis: + condition: service_healthy + + gateway-two: + image: mcp_conformance + build: + dockerfile: mcp_conformance.Dockerfile + networks: [contextforge-data-plane-net] + ports: + - "5556:5556" + environment: + - RUST_LOG=warn + - PORT=5556 + sysctls: + - net.ipv4.tcp_fin_timeout=15 + - net.ipv4.ip_local_port_range=1024 65535 + ulimits: + nofile: + soft: 65535 + hard: 65535 + depends_on: + redis: + condition: service_healthy redis: image: redis:latest diff --git a/docker/mcp_conformance.Dockerfile b/docker/mcp_conformance.Dockerfile new file mode 100644 index 00000000..2d791d63 --- /dev/null +++ b/docker/mcp_conformance.Dockerfile @@ -0,0 +1,45 @@ +FROM rust:1.96.1 AS builder + +ARG MCP_RUST_SDK_REV=baac607e52b9788ec20902e2c7143ba4f4786f4b + +WORKDIR /tmp/rust-sdk +# Package versions follow the pinned Rust base image's Debian snapshot. +# hadolint ignore=DL3008 +RUN < Date: Fri, 7 Aug 2026 11:55:14 +0100 Subject: [PATCH 05/10] Address rename review findings Signed-off-by: lucarlig --- .../contextforge-data-plane-apis/Cargo.toml | 3 + .../contextforge-data-plane-cpex/Cargo.toml | 3 + crates/contextforge-data-plane-lib/Cargo.toml | 3 + .../contextforge-data-plane-lib/src/common.rs | 2 +- .../src/layers/claims_id.rs | 14 +- .../src/layers/user_config_store.rs | 4 +- crates/contextforge-data-plane-lib/src/lib.rs | 4 +- .../contextforge-data-plane-lib/src/tools.rs | 8 +- crates/contextforge-data-plane/Cargo.toml | 3 + docker/mcp-rust-sdk.Cargo.lock | 3493 +++++++++++++++++ docker/mcp_conformance.Dockerfile | 6 +- docker/mcp_counter.Dockerfile | 6 +- docker/nginx.conf | 6 +- docs/book/src/architectural-choices.md | 2 +- docs/book/src/assets/gateway-overview.svg | 6 +- docs/book/src/assets/request-flow.svg | 2 +- docs/book/src/assets/system-shape.svg | 2 +- docs/book/src/plugins-and-policy.md | 55 + docs/book/src/running-the-gateway.md | 117 + docs/book/src/system-shape.md | 4 +- 20 files changed, 3714 insertions(+), 29 deletions(-) create mode 100644 docker/mcp-rust-sdk.Cargo.lock diff --git a/crates/contextforge-data-plane-apis/Cargo.toml b/crates/contextforge-data-plane-apis/Cargo.toml index 9ddfc1a6..4440f6cf 100644 --- a/crates/contextforge-data-plane-apis/Cargo.toml +++ b/crates/contextforge-data-plane-apis/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true rust-version.workspace = true license.workspace = true keywords.workspace = true +homepage.workspace = true +readme.workspace = true +repository.workspace = true [dependencies] diff --git a/crates/contextforge-data-plane-cpex/Cargo.toml b/crates/contextforge-data-plane-cpex/Cargo.toml index f273f902..d74d69bd 100644 --- a/crates/contextforge-data-plane-cpex/Cargo.toml +++ b/crates/contextforge-data-plane-cpex/Cargo.toml @@ -5,6 +5,9 @@ edition.workspace = true rust-version.workspace = true license.workspace = true keywords.workspace = true +homepage.workspace = true +readme.workspace = true +repository.workspace = true [lib] doctest = false diff --git a/crates/contextforge-data-plane-lib/Cargo.toml b/crates/contextforge-data-plane-lib/Cargo.toml index ffaa23a0..931beaaf 100644 --- a/crates/contextforge-data-plane-lib/Cargo.toml +++ b/crates/contextforge-data-plane-lib/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true rust-version.workspace = true license.workspace = true keywords.workspace = true +homepage.workspace = true +readme.workspace = true +repository.workspace = true [dependencies] diff --git a/crates/contextforge-data-plane-lib/src/common.rs b/crates/contextforge-data-plane-lib/src/common.rs index ac08060a..0ee8b324 100644 --- a/crates/contextforge-data-plane-lib/src/common.rs +++ b/crates/contextforge-data-plane-lib/src/common.rs @@ -26,7 +26,7 @@ pub struct JwtTokenDecoders { #[allow(unused)] #[derive(Clone)] -pub struct ContextForgeGatewayAppState { +pub struct ContextForgeDataPlaneAppState { pub(crate) jwt_token_decoding_keys: JwtTokenDecoders, pub(crate) config_store: Arc, pub(crate) config: Config, diff --git a/crates/contextforge-data-plane-lib/src/layers/claims_id.rs b/crates/contextforge-data-plane-lib/src/layers/claims_id.rs index 23df0378..02ff0488 100644 --- a/crates/contextforge-data-plane-lib/src/layers/claims_id.rs +++ b/crates/contextforge-data-plane-lib/src/layers/claims_id.rs @@ -8,7 +8,7 @@ use http::{StatusCode, header}; use jsonwebtoken::Validation; use crate::{ - common::{ContextForgeClaims, ContextForgeGatewayAppState}, + common::{ContextForgeClaims, ContextForgeDataPlaneAppState}, const_values::{CONTEXT_FORGE_GATEWAY_AUDIENCE, CONTEXT_FORGE_GATEWAY_ISSUER}, }; @@ -21,7 +21,7 @@ fn unauthorized_response() -> Response { } pub async fn claims_layer( - State(state): State, + State(state): State, request: http::Request, next: Next, ) -> Response { @@ -87,7 +87,7 @@ mod test { use crate::{ Config, - common::{self, ContextForgeClaims, ContextForgeGatewayAppState, JwtTokenDecoders, Scopes}, + common::{self, ContextForgeClaims, ContextForgeDataPlaneAppState, JwtTokenDecoders, Scopes}, const_values::{CONTEXT_FORGE_GATEWAY_AUDIENCE, CONTEXT_FORGE_GATEWAY_ISSUER}, layers::claims_id::claims_layer, user_config_store::{ConfigStoreError, UserConfigStore}, @@ -165,7 +165,7 @@ mod test { let decoding_key = DecodingKey::from_secret(HMAC_SECRET); - let state = ContextForgeGatewayAppState { + let state = ContextForgeDataPlaneAppState { jwt_token_decoding_keys: JwtTokenDecoders { rs: None, hmac_sha: Some(decoding_key) }, config_store: Arc::new(MockedUserConfigStore {}), config: Config::default(), @@ -200,7 +200,7 @@ mod test { let decoding_key = DecodingKey::from_secret(HMAC_SECRET); - let state = ContextForgeGatewayAppState { + let state = ContextForgeDataPlaneAppState { jwt_token_decoding_keys: JwtTokenDecoders { rs: None, hmac_sha: Some(decoding_key) }, config_store: Arc::new(MockedUserConfigStore {}), config: Config::default(), @@ -242,7 +242,7 @@ mod test { let decoding_key = DecodingKey::from_secret(HMAC_SECRET); - let state = ContextForgeGatewayAppState { + let state = ContextForgeDataPlaneAppState { jwt_token_decoding_keys: JwtTokenDecoders { rs: None, hmac_sha: Some(decoding_key) }, config_store: Arc::new(MockedUserConfigStore {}), config: Config::default(), @@ -277,7 +277,7 @@ mod test { let decoding_key = DecodingKey::from_secret(HMAC_SECRET); - let state = ContextForgeGatewayAppState { + let state = ContextForgeDataPlaneAppState { jwt_token_decoding_keys: JwtTokenDecoders { rs: None, hmac_sha: Some(decoding_key) }, config_store: Arc::new(MockedUserConfigStore {}), config: Config::default(), diff --git a/crates/contextforge-data-plane-lib/src/layers/user_config_store.rs b/crates/contextforge-data-plane-lib/src/layers/user_config_store.rs index 3b586486..4d5804c2 100644 --- a/crates/contextforge-data-plane-lib/src/layers/user_config_store.rs +++ b/crates/contextforge-data-plane-lib/src/layers/user_config_store.rs @@ -5,12 +5,12 @@ use http::{StatusCode, header}; use tracing::{debug, info, warn}; use crate::{ - common::{ContextForgeClaims, ContextForgeGatewayAppState}, + common::{ContextForgeClaims, ContextForgeDataPlaneAppState}, user_config_store::ConfigStoreError, }; pub async fn user_config_store_layer( - State(state): State, + State(state): State, mut request: http::Request, next: Next, ) -> Response { diff --git a/crates/contextforge-data-plane-lib/src/lib.rs b/crates/contextforge-data-plane-lib/src/lib.rs index e0886800..3f71ef6a 100644 --- a/crates/contextforge-data-plane-lib/src/lib.rs +++ b/crates/contextforge-data-plane-lib/src/lib.rs @@ -36,7 +36,7 @@ pub type Error = Box; pub type Result = std::result::Result; use crate::{ - common::{ContextForgeGatewayAppState, JwtTokenDecoders}, + common::{ContextForgeDataPlaneAppState, JwtTokenDecoders}, gateway::LocalUserSessionStore, layers::{ claims_id::claims_layer, @@ -115,7 +115,7 @@ impl Gateway { Ok(key) }); - let mcp_add_state: ContextForgeGatewayAppState = ContextForgeGatewayAppState { + let mcp_add_state: ContextForgeDataPlaneAppState = ContextForgeDataPlaneAppState { jwt_token_decoding_keys: JwtTokenDecoders { rs: rs_decoding_key.transpose()?, hmac_sha: config diff --git a/crates/contextforge-data-plane-lib/src/tools.rs b/crates/contextforge-data-plane-lib/src/tools.rs index 636c8706..87ab7f41 100644 --- a/crates/contextforge-data-plane-lib/src/tools.rs +++ b/crates/contextforge-data-plane-lib/src/tools.rs @@ -15,7 +15,7 @@ use uuid::Uuid; //use tracing::debug; use crate::{ - common::{ContextForgeClaims, ContextForgeGatewayAppState, Scopes, User}, + common::{ContextForgeClaims, ContextForgeDataPlaneAppState, Scopes, User}, const_values::{CONTEXT_FORGE_GATEWAY_AUDIENCE, CONTEXT_FORGE_GATEWAY_ISSUER}, }; @@ -58,7 +58,7 @@ impl ContextForgeClaims { } } -pub fn add_tools(router: Router) -> Router { +pub fn add_tools(router: Router) -> Router { router .route("/admin/tokens/{user_id}", get(get_token)) .route("/admin/userconfigs/{user_id}", post(configure_user)) @@ -74,7 +74,7 @@ pub async fn health() -> Response { } pub async fn get_token( - State(state): State, + State(state): State, Path(user_id): Path, Query(query): Query, ) -> Response { @@ -95,7 +95,7 @@ pub async fn get_token( //#[debug_handler] pub async fn configure_user( Path(user_id): Path, - State(state): State, + State(state): State, Json(user_config): Json, ) -> Response { if state.config_store.set_config(&CFUser::new(&user_id), &user_config).await.is_ok() { diff --git a/crates/contextforge-data-plane/Cargo.toml b/crates/contextforge-data-plane/Cargo.toml index 2b015a62..74cc3a87 100644 --- a/crates/contextforge-data-plane/Cargo.toml +++ b/crates/contextforge-data-plane/Cargo.toml @@ -5,6 +5,9 @@ edition.workspace = true rust-version.workspace = true license.workspace = true keywords.workspace = true +homepage.workspace = true +readme.workspace = true +repository.workspace = true [dependencies] diff --git a/docker/mcp-rust-sdk.Cargo.lock b/docker/mcp-rust-sdk.Cargo.lock new file mode 100644 index 00000000..6ba4dccf --- /dev/null +++ b/docker/mcp-rust-sdk.Cargo.lock @@ -0,0 +1,3493 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "askama" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf825125edd887a019d0a3a837dcc5499a68b0d034cc3eb594070c3e18addc" +dependencies = [ + "askama_macros", + "itoa", + "percent-encoding", + "serde", + "serde_json", +] + +[[package]] +name = "askama_derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1c7065972a130eafa84215f21352ae15b4a7393da48c1f5e103904490736738" +dependencies = [ + "askama_parser", + "basic-toml", + "glob", + "memchr", + "proc-macro2", + "quote", + "rustc-hash", + "serde", + "serde_derive", + "syn 2.0.119", +] + +[[package]] +name = "askama_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e23b1d2c4bd39a41971f6124cef4cc6fd0540913ecb90919b69ab3bbe44ae1a" +dependencies = [ + "askama_derive", +] + +[[package]] +name = "askama_parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db09fde9143e7ac4513358fb32ee32847125b63b18ea715afd487956da715da" +dependencies = [ + "rustc-hash", + "serde", + "serde_derive", + "unicode-ident", + "winnow", +] + +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "aws-lc-rs" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" +dependencies = [ + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", +] + +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "axum-macros", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "darling" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88490bf1b990d87eaaa7ac8aa887f629a08e7359765b4911faf63c3763347d23" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084e274f91c482280130e1e34e0b8d6e66776a060d7b6de7b84289ca778868c4" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.3", +] + +[[package]] +name = "darling_macro" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f5792fa0d41cd2325ce0ffa64f0a340eaebd4971a3a0c5e1ffd2cc488a355e" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "data-encoding" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", + "ctutils", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-timer" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "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 = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "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", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[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 = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.19", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881733cbc631fc9e472e24447ce32a64bedf2da498d6d8570b08edc87de71f65" +dependencies = [ + "aws-lc-rs", + "base64 0.22.1", + "getrandom 0.2.17", + "js-sys", + "pem", + "serde", + "serde_json", + "signature", + "simple_asn1", + "zeroize", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "mcp-client-examples" +version = "0.1.5" +dependencies = [ + "anyhow", + "axum", + "clap", + "futures", + "rand 0.10.2", + "reqwest", + "rmcp", + "serde", + "serde_json", + "tokio", + "tower", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "mcp-conformance" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "reqwest", + "rmcp", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", + "tracing-subscriber", + "url", + "urlencoding", +] + +[[package]] +name = "mcp-server-examples" +version = "0.1.5" +dependencies = [ + "anyhow", + "askama", + "axum", + "chrono", + "futures", + "hyper", + "hyper-util", + "rand 0.10.2", + "reqwest", + "rmcp", + "schemars", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-stream", + "tokio-util", + "tower-http 0.7.0", + "tracing", + "tracing-subscriber", + "url", + "uuid", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[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 = "oauth2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" +dependencies = [ + "base64 0.22.1", + "chrono", + "getrandom 0.2.17", + "http", + "rand 0.8.7", + "serde", + "serde_json", + "serde_path_to_error", + "sha2 0.10.9", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "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 2.0.119", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "process-wrap" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" +dependencies = [ + "futures", + "indexmap", + "nix", + "tokio", + "tracing", + "windows", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.19", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.19", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[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_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http 0.6.11", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[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.17", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmcp" +version = "3.1.1" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "base64 0.23.1", + "bytes", + "chrono", + "futures", + "hmac", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "jsonwebtoken", + "oauth2", + "pastey", + "pin-project-lite", + "process-wrap", + "rand 0.10.2", + "reqwest", + "rmcp-macros", + "rstest", + "schemars", + "serde", + "serde_json", + "sha2 0.11.0", + "sse-stream", + "thiserror 2.0.19", + "tokio", + "tokio-stream", + "tokio-util", + "tower-service", + "tracing", + "tracing-subscriber", + "url", + "uuid", + "which", +] + +[[package]] +name = "rmcp-macros" +version = "3.1.1" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde_json", + "syn 3.0.3", +] + +[[package]] +name = "rstest" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" +dependencies = [ + "futures-timer", + "futures-util", + "rstest_macros", +] + +[[package]] +name = "rstest_macros" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" +dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.119", + "unicode-ident", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[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 = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "aws-lc-rs", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "chrono", + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.3", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple-chat-client" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "clap", + "futures", + "reqwest", + "rmcp", + "serde", + "serde_json", + "thiserror 2.0.19", + "tokio", + "toml", +] + +[[package]] +name = "simple_asn1" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.19", + "time", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "sse-stream" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c123f296ade4ec4b8b0f6162116e6629f5146922ca5ab40ca9d3c2e73ab4761e" +dependencies = [ + "bytes", + "futures-util", + "http-body", + "http-body-util", + "pin-project-lite", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +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.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[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 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +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 = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17a073bfed563fa236697a068031408a93cd9522e08abf9933ead3e73411bd71" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-http" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" +dependencies = [ + "bitflags", + "bytes", + "http", + "percent-encoding", + "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-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "transport" +version = "3.1.1" +dependencies = [ + "anyhow", + "futures", + "hyper", + "hyper-util", + "pin-project-lite", + "rand 0.10.2", + "reqwest", + "rmcp", + "schemars", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48ac77174b19c110a50ab2128b24215ac9cb40e0e12e093fb602d175c569d22" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.10.2", + "sha1", + "thiserror 2.0.19", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[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.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[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 = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasi-mcp-example" +version = "3.1.1" +dependencies = [ + "rmcp", + "serde", + "tokio", + "tracing", + "tracing-subscriber", + "wasi 0.14.7+wasi-0.2.4", +] + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "8.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" +dependencies = [ + "libc", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +dependencies = [ + "bitflags", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docker/mcp_conformance.Dockerfile b/docker/mcp_conformance.Dockerfile index 2d791d63..22d8852c 100644 --- a/docker/mcp_conformance.Dockerfile +++ b/docker/mcp_conformance.Dockerfile @@ -17,11 +17,15 @@ git checkout --detach FETCH_HEAD sed -i 's/127\.0\.0\.1/0.0.0.0/' conformance/src/bin/server.rs EOF +# The official SDK does not commit a workspace lockfile. Keep its dependency +# graph reproducible while building the pinned revision. +COPY mcp-rust-sdk.Cargo.lock /tmp/rust-sdk/Cargo.lock + WORKDIR /tmp/rust-sdk/conformance RUN \ --mount=type=cache,id=cargo,target=/usr/local/cargo/registry,sharing=locked \ --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ - cargo fetch + cargo fetch --locked # Keep dependency fetching in its own cacheable layer. # hadolint ignore=DL3059 RUN \ diff --git a/docker/mcp_counter.Dockerfile b/docker/mcp_counter.Dockerfile index a49af37f..0e2f1648 100644 --- a/docker/mcp_counter.Dockerfile +++ b/docker/mcp_counter.Dockerfile @@ -17,11 +17,15 @@ git checkout --detach FETCH_HEAD sed -i 's/127\.0\.0\.1:8000/0.0.0.0:5555/' examples/servers/src/counter_streamhttp.rs EOF +# The official SDK does not commit a workspace lockfile. Keep its dependency +# graph reproducible while building the pinned revision. +COPY mcp-rust-sdk.Cargo.lock /tmp/rust-sdk/Cargo.lock + WORKDIR /tmp/rust-sdk/examples/servers RUN \ --mount=type=cache,id=cargo,target=/usr/local/cargo/registry,sharing=locked \ --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git,sharing=locked \ - cargo fetch + cargo fetch --locked # Keep dependency fetching in its own cacheable layer. # hadolint ignore=DL3059 RUN \ diff --git a/docker/nginx.conf b/docker/nginx.conf index 1f00bb59..a48ac408 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -158,7 +158,7 @@ http { # Dynamic backend URLs. Using variables keeps Docker DNS re-resolution active # across gateway container churn. - map "" $contextforge_gateway_backend_url { + map "" $contextforge_data_plane_backend_url { default "http://data-plane:4445"; } @@ -259,7 +259,7 @@ http { limit_req zone=api_limit burst=20000 nodelay; limit_conn conn_limit 20000; - proxy_pass $contextforge_gateway_backend_url; + proxy_pass $contextforge_data_plane_backend_url; proxy_cache off; @@ -318,7 +318,7 @@ http { # Health Check - No rate limiting (for monitoring during load tests) # ============================================================ location = /health { - proxy_pass $contextforge_gateway_backend_url/contextforge-rs/health; + proxy_pass $contextforge_data_plane_backend_url/contextforge-rs/health; proxy_set_header Host $http_host; proxy_set_header Connection ""; proxy_http_version 1.1; diff --git a/docs/book/src/architectural-choices.md b/docs/book/src/architectural-choices.md index 55a0307f..ae804b3a 100644 --- a/docs/book/src/architectural-choices.md +++ b/docs/book/src/architectural-choices.md @@ -111,7 +111,7 @@ The downstream client should reason about one MCP server: ```text client - -> ContextForge Gateway + -> ContextForge Data Plane -> merged tools/resources/prompts ``` diff --git a/docs/book/src/assets/gateway-overview.svg b/docs/book/src/assets/gateway-overview.svg index b7c523c1..3bb1ec1f 100644 --- a/docs/book/src/assets/gateway-overview.svg +++ b/docs/book/src/assets/gateway-overview.svg @@ -1,6 +1,6 @@ - ContextForge Gateway request and response path - An MCP client sends streamable HTTP traffic to the ContextForge Gateway. The gateway validates the caller, loads runtime configuration, calls backend MCP servers, receives backend responses, merges them, and returns one MCP response or stream to the client. + ContextForge Data Plane request and response path + An MCP client sends streamable HTTP traffic to the ContextForge Data Plane. The data plane validates the caller, loads runtime configuration, calls backend MCP servers, receives backend responses, merges them, and returns one MCP response or stream to the client. @@ -38,7 +38,7 @@ - ContextForge Gateway + ContextForge Data Plane validate caller diff --git a/docs/book/src/assets/request-flow.svg b/docs/book/src/assets/request-flow.svg index 71c0bc32..573ed4d9 100644 --- a/docs/book/src/assets/request-flow.svg +++ b/docs/book/src/assets/request-flow.svg @@ -1,5 +1,5 @@ - ContextForge Gateway request flow + ContextForge Data Plane request flow A normal MCP HTTP request enters the TCP or TLS listener, passes through metrics, tracing, the contextforge nested router, CORS, virtual host extraction, claims validation, session extraction, user config lookup, a virtual host config check, and RMCP. RMCP then follows either initialize handling or authorized MCP method handling, calls backend MCP servers as needed, and returns the response through the same stack. diff --git a/docs/book/src/assets/system-shape.svg b/docs/book/src/assets/system-shape.svg index 8daebed6..f783a1c6 100644 --- a/docs/book/src/assets/system-shape.svg +++ b/docs/book/src/assets/system-shape.svg @@ -1,5 +1,5 @@ - ContextForge Gateway system shape + ContextForge Data Plane system shape The ContextForge control plane writes runtime config into Redis. MCP clients call the Rust gateway dataplane. The gateway loads config, validates identity, calls backend MCP servers, receives backend responses, merges them, and returns one downstream response. diff --git a/docs/book/src/plugins-and-policy.md b/docs/book/src/plugins-and-policy.md index 9ca71fec..33d1c4f2 100644 --- a/docs/book/src/plugins-and-policy.md +++ b/docs/book/src/plugins-and-policy.md @@ -17,6 +17,61 @@ ContextForgeGatewayRuntimePluginConfig The runtime registry builds an initialized immutable plugin manager from that configuration. Reloading swaps the manager instead of mutating a live one. +## Built-In Demo Factories + +The optional `test-plugins` feature compiles three demo factories from the +independently hosted `cpex-plugins-rs` repository. Redis configuration activates +factories already present in the binary; it never loads new Rust code into a +running process. + +Start the lightweight dependencies: + +```bash +docker compose -f docker/docker-compose-local.yaml up -d redis gateway-one gateway-two +``` + +Register the payload-marker configuration before starting the data plane: + +```bash +docker compose -f docker/docker-compose-local.yaml exec -T redis \ + redis-cli SET ContextForgeGatewayRuntimePluginConfig '{ + "version": 1, + "cpex": { + "plugins": [ + { + "name": "payload-marker", + "kind": "contextforge/payload-marker", + "hooks": ["cmf.tool_post_invoke"] + } + ] + } + }' +``` + +Build and run with the demo factories and runtime execution enabled: + +```bash +cargo run -p contextforge-data-plane \ + --features 'contextforge-data-plane-lib/with_tools,test-plugins' \ + --bin contextforge-data-plane -- \ + --address 127.0.0.1:8001 \ + --redis-address 127.0.0.1 \ + --redis-port 6379 \ + --redis-mode plain-text \ + --token-verification-public-key assets/jwt.key.pub \ + --token-verification-private-key assets/jwt.key \ + --upstream-connection-mode plain-text-or-tls \ + --runtime-plugins-enabled true +``` + +Startup should log successful CPEX initialization. The payload marker appends +`[cpex:payload-marker]` to successful tool results. The supported hook path is +also covered by: + +```bash +cargo nextest run --locked -p contextforge-data-plane-lib --test gateway_plugins +``` + ## Supported Hooks The supported surface is deliberately narrow: diff --git a/docs/book/src/running-the-gateway.md b/docs/book/src/running-the-gateway.md index 804967c7..2f2c628a 100644 --- a/docs/book/src/running-the-gateway.md +++ b/docs/book/src/running-the-gateway.md @@ -4,6 +4,13 @@ Use one of the two local workflows below. The end-to-end stack uses the current Fast Time MCP backend, while the lightweight stack uses official MCP Rust SDK test fixtures. +## Prerequisites + +- Docker Compose. +- A Rust toolchain matching the workspace `rust-version` for the host workflow. +- Test keys at `assets/jwt.key` and `assets/jwt.key.pub` for the host workflow. +- Free local ports `6379`, `16379`, `5555`, `5556`, and `8001`. + ## Recommended End-to-End Stack The supported smoke environment includes the external ContextForge control @@ -76,12 +83,122 @@ The client-facing route is: http://127.0.0.1:8001/contextforge-rs/servers/{virtual_host_id}/mcp ``` +Keep the data-plane process running. Use another terminal for the remaining +steps. + +### Mint a Local Test Token + +The local token helper signs an RS256 token with `assets/jwt.key`. Its `sub` +claim becomes the Redis user-config key. + +```bash +USER_ID=11111111-1111-1111-1111-111111111111 +USER_EMAIL=admin@example.com + +TOKEN=$(curl --silent --show-error \ + --url "http://127.0.0.1:8001/contextforge-rs/admin/tokens/${USER_ID}?email=${USER_EMAIL}") +``` + +### Seed Local Runtime Configuration + +Create a virtual host that points at both lightweight MCP fixtures: + +```bash +VIRTUAL_HOST_ID=c0ffee00f001f00df00ddeadbeefdead + +curl --silent --show-error --request POST \ + --url "http://127.0.0.1:8001/contextforge-rs/admin/userconfigs/${USER_ID}" \ + --header 'content-type: application/json' \ + --data '{ + "virtual_hosts": { + "c0ffee00f001f00df00ddeadbeefdead": { + "backends": { + "gateway-one": { + "name": "gateway-one", + "url": "http://127.0.0.1:5555/mcp", + "transport": "STREAMABLEHTTP", + "passthrough_headers": [], + "allowed_tool_names": [], + "allowed_resource_names": [], + "allowed_prompt_names": [] + }, + "gateway-two": { + "name": "gateway-two", + "url": "http://127.0.0.1:5556/mcp", + "transport": "STREAMABLEHTTP", + "passthrough_headers": [], + "allowed_tool_names": [], + "allowed_resource_names": [], + "allowed_prompt_names": [] + } + } + } + } + }' +``` + +The identity and routing relationship is: + +```text +JWT subject + -> Redis UserConfig + -> virtual host id + -> configured backend MCP URLs +``` + +### Verify Modern Protocol Discovery + +Probe the client-facing route with MCP `2026-07-28`. Modern requests carry the +protocol version, client identity, and client capabilities in `_meta` on every +request: + +```bash +curl --silent --show-error \ + --url "http://127.0.0.1:8001/contextforge-rs/servers/${VIRTUAL_HOST_ID}/mcp" \ + --header "authorization: Bearer ${TOKEN}" \ + --header 'content-type: application/json' \ + --header 'accept: application/json, text/event-stream' \ + --header 'mcp-protocol-version: 2026-07-28' \ + --header 'mcp-method: server/discover' \ + --data '{ + "jsonrpc": "2.0", + "id": 1, + "method": "server/discover", + "params": { + "_meta": { + "io.modelcontextprotocol/protocolVersion": "2026-07-28", + "io.modelcontextprotocol/clientInfo": { + "name": "curl", + "version": "0.1.0" + }, + "io.modelcontextprotocol/clientCapabilities": {} + } + } + }' +``` + +The response should advertise `2026-07-28` in `supportedVersions`. This probe +validates the modern HTTP envelope plus authentication, user-config lookup, and +virtual-host selection. Use the [recommended end-to-end stack](local-docker-stack.md) +for the complete backend tool-call smoke test. + The target downstream contract is MCP `2026-07-28` over Streamable HTTP using `server/discover` and per-request client metadata. Older protocol versions, legacy session initialization, and SSE remain control-plane responsibilities; see [MCP Behavior](mcp-behavior.md) and [Control-Plane Integration](control-plane-integration.md). +## Troubleshooting + +| Symptom | Likely cause | +| --- | --- | +| `401 Unauthorized` | Missing bearer token, invalid signature, expired token, or mismatched issuer/audience. | +| `400 Problem occurred retrieving the configuration` | Redis has no `UserConfig` for the token subject. Re-run the config POST with the same `USER_ID`. | +| `500 Problem occurred retrieving the configuration` | Redis access or stored config decoding failed; inspect data-plane and Redis logs. | +| `404` with `{"detail":"Server not found"}` | The URL virtual-host id does not exist in that user's config. | +| `400` mentioning request metadata | The MCP protocol header and `_meta` version differ, or required per-request client metadata is missing. | +| Backend calls fail | A backend URL is wrong, a fixture is down, or `--upstream-connection-mode` rejects plain HTTP. | + Stop the host process with `Ctrl-C`, then remove the lightweight dependencies: ```bash diff --git a/docs/book/src/system-shape.md b/docs/book/src/system-shape.md index 0ec75ca2..717dcfe1 100644 --- a/docs/book/src/system-shape.md +++ b/docs/book/src/system-shape.md @@ -10,7 +10,7 @@ ![System shape](assets/system-shape.svg) -The ContextForge Gateway is the Rust dataplane process for MCP traffic. It is +The ContextForge Data Plane is the Rust dataplane process for MCP traffic. It is not a second ContextForge application. It accepts downstream streamable HTTP MCP requests, builds request context, loads runtime config, opens or reuses backend MCP client sessions, and returns one merged MCP server view to the caller. @@ -219,7 +219,7 @@ state in separate ownership scopes. The current ownership model is: | State | Owner | Lifetime | | --- | --- | --- | | CLI `Config` | Binary startup and `Gateway` | Process lifetime. | -| JWT decoders | `ContextForgeGatewayAppState` | Process lifetime. | +| JWT decoders | `ContextForgeDataPlaneAppState` | Process lifetime. | | User config | `UserConfigStore`, currently Redis plus in-process LRU | Control-plane authored, request-path consumed. | | Request identity | Request extensions | One HTTP request. | | Virtual host id | Request extensions | One HTTP request. | From 4f64de20563ae770a921db72ca6fb80b38765262 Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 12:04:59 +0100 Subject: [PATCH 06/10] Distinguish full-stack Docker network Signed-off-by: lucarlig --- docker/docker-compose.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 726b75bd..918e3aaf 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,7 +2,7 @@ name: contextforge-data-plane networks: - contextforge-data-plane-net: + contextforge-stack-net: # Single user-defined bridge network keeps traffic private driver: bridge @@ -25,7 +25,7 @@ services: ports: - "8080:80" - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] dns: - 127.0.0.11 command: [nginx, '-g', 'daemon off;'] @@ -66,7 +66,7 @@ services: labels: name: contextforge-data-plane image: ${IMAGE_LOCAL:-contextforge-data-plane:latest} - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] environment: - CONTEXTFORGE_DATA_PLANE_ADDRESS=0.0.0.0:4445 @@ -132,7 +132,7 @@ services: contextforge-data-plane-one: image: ${IMAGE_LOCAL:-contextforge-data-plane:latest} container_name: contextforge-data-plane-one - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ports: [5551:4445] environment: @@ -176,7 +176,7 @@ services: contextforge-data-plane-two: image: ${IMAGE_LOCAL:-contextforge-data-plane:latest} container_name: contextforge-data-plane-two - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ports: [5552:4445] environment: @@ -220,7 +220,7 @@ services: mcp-counter-tool-one: image: ghcr.io/mcp-counter-tool:latest container_name: mcp-counter-tool-one - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ports: [5601:5555] environment: @@ -250,7 +250,7 @@ services: mcp-counter-tool-two: image: ghcr.io/mcp-counter-tool:latest container_name: mcp-counter-tool-two - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ports: [5602:5555] environment: @@ -310,7 +310,7 @@ services: start_period: 10s ports: - "6379:6379" # expose only if you want host access - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] deploy: resources: limits: @@ -342,7 +342,7 @@ services: depends_on: postgres: condition: service_healthy - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] restart: "no" ############################################################################### @@ -354,7 +354,7 @@ services: image: ghcr.io/ibm/mcp-context-forge:d24df05e7985787bfa3264ab45cee411e308a111 container_name: control-plane restart: unless-stopped - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ports: - "4444:4444" environment: @@ -461,7 +461,7 @@ services: - POSTGRES_DB=mcp volumes: - pgdata:/var/lib/postgresql - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER"] interval: 30s @@ -481,7 +481,7 @@ services: image: edoburu/pgbouncer:latest container_name: pgbouncer restart: unless-stopped - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ulimits: nofile: soft: 65536 @@ -535,7 +535,7 @@ services: image: ghcr.io/ibm/cfex-mcp-fast-time-server:latest container_name: fast_time_server restart: unless-stopped - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] ports: - "8880:8880" environment: @@ -574,7 +574,7 @@ services: register_fast_time: image: ghcr.io/ibm/mcp-context-forge:d24df05e7985787bfa3264ab45cee411e308a111 container_name: register_fast_time - networks: [contextforge-data-plane-net] + networks: [contextforge-stack-net] depends_on: control-plane: condition: service_healthy From 36916866b85ae31939cff02886c9067c33ebbb1c Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 12:19:18 +0100 Subject: [PATCH 07/10] Keep MCP fixtures outside rename scope Signed-off-by: lucarlig --- README.md | 5 +- docker/docker-compose-local.yaml | 67 +- docker/mcp-rust-sdk.Cargo.lock | 3493 -------------------------- docker/mcp_conformance.Dockerfile | 55 +- docker/mcp_counter.Dockerfile | 55 +- docs/book/src/running-the-gateway.md | 5 +- 6 files changed, 92 insertions(+), 3588 deletions(-) delete mode 100644 docker/mcp-rust-sdk.Cargo.lock diff --git a/README.md b/README.md index 3ba20f71..76b1bef2 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,7 @@ docker compose -f docker/docker-compose-local.yaml up -d docker compose -f docker/docker-compose-local.yaml ps redis gateway-one gateway-two ``` -Then follow [Run the Gateway Locally](docs/book/src/running-the-gateway.md). The -fixtures build from a pinned revision of the official -[`modelcontextprotocol/rust-sdk`](https://github.com/modelcontextprotocol/rust-sdk) -repository; they do not use the retired SDK fork. +Then follow [Run the Gateway Locally](docs/book/src/running-the-gateway.md). ## Runtime CPEX Plugins diff --git a/docker/docker-compose-local.yaml b/docker/docker-compose-local.yaml index 5f13cfab..a8b60ded 100644 --- a/docker/docker-compose-local.yaml +++ b/docker/docker-compose-local.yaml @@ -1,20 +1,28 @@ -# Lightweight dependencies for running the dataplane binary from Cargo. +#version: "3.9" # Supported by both podman-compose and Docker Compose v2+ name: contextforge-data-plane-local + networks: - contextforge-data-plane-net: + contextforge-data-plane-net: # Single user-defined bridge network keeps traffic private driver: bridge +############################################################################### +# CORE SERVICE - ContextForge +############################################################################### services: gateway-one: image: mcp_counter build: dockerfile: mcp_counter.Dockerfile + networks: [contextforge-data-plane-net] - ports: - - "5555:5555" + ports: [5555:5555] + environment: - RUST_LOG=warn + - MCP_SERVER_BIND_ADDRESS=0.0.0.0:5555 + - MCP_SERVER_ALLOWED_HOSTS=127.0.0.1,9.85.219.104,192.168.1.14 + sysctls: - net.ipv4.tcp_fin_timeout=15 - net.ipv4.ip_local_port_range=1024 65535 @@ -22,20 +30,31 @@ services: nofile: soft: 65535 hard: 65535 + depends_on: redis: - condition: service_healthy + condition: service_started + + deploy: + resources: + limits: + cpus: '${GATEWAY_CPU_LIMIT:-8}' + memory: ${GATEWAY_MEM_LIMIT:-8G} + reservations: + cpus: '${GATEWAY_CPU_RESERVATION:-4}' + memory: ${GATEWAY_MEM_RESERVATION:-4G} gateway-two: image: mcp_conformance build: dockerfile: mcp_conformance.Dockerfile networks: [contextforge-data-plane-net] - ports: - - "5556:5556" + ports: [5556:5556] + environment: - RUST_LOG=warn - PORT=5556 + sysctls: - net.ipv4.tcp_fin_timeout=15 - net.ipv4.ip_local_port_range=1024 65535 @@ -43,10 +62,28 @@ services: nofile: soft: 65535 hard: 65535 + depends_on: redis: - condition: service_healthy + condition: service_started + + deploy: + resources: + limits: + cpus: '${GATEWAY_CPU_LIMIT:-8}' + memory: ${GATEWAY_MEM_LIMIT:-8G} + reservations: + cpus: '${GATEWAY_CPU_RESERVATION:-4}' + memory: ${GATEWAY_MEM_RESERVATION:-4G} + + + + + +############################################################################### +# CACHE +############################################################################### redis: image: redis:latest ulimits: @@ -80,17 +117,12 @@ services: - "no" # - "--tls-ca-cert-file" # - "/tls_config/contextforge.intermediate.cert.pem" - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 5s - timeout: 3s - retries: 10 - start_period: 5s ports: - - "6379:6379" - - "16379:16379" - volumes: + - "6379:6379" # expose only if you want host access + - "16379:16379" # expose only if you want host access + volumes: - ../assets/contextforgeCA/:/tls_config:z + networks: [contextforge-data-plane-net] deploy: @@ -101,3 +133,4 @@ services: reservations: cpus: '1' memory: 1G + diff --git a/docker/mcp-rust-sdk.Cargo.lock b/docker/mcp-rust-sdk.Cargo.lock deleted file mode 100644 index 6ba4dccf..00000000 --- a/docker/mcp-rust-sdk.Cargo.lock +++ /dev/null @@ -1,3493 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "askama" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf825125edd887a019d0a3a837dcc5499a68b0d034cc3eb594070c3e18addc" -dependencies = [ - "askama_macros", - "itoa", - "percent-encoding", - "serde", - "serde_json", -] - -[[package]] -name = "askama_derive" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1c7065972a130eafa84215f21352ae15b4a7393da48c1f5e103904490736738" -dependencies = [ - "askama_parser", - "basic-toml", - "glob", - "memchr", - "proc-macro2", - "quote", - "rustc-hash", - "serde", - "serde_derive", - "syn 2.0.119", -] - -[[package]] -name = "askama_macros" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e23b1d2c4bd39a41971f6124cef4cc6fd0540913ecb90919b69ab3bbe44ae1a" -dependencies = [ - "askama_derive", -] - -[[package]] -name = "askama_parser" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db09fde9143e7ac4513358fb32ee32847125b63b18ea715afd487956da715da" -dependencies = [ - "rustc-hash", - "serde", - "serde_derive", - "unicode-ident", - "winnow", -] - -[[package]] -name = "async-trait" -version = "0.1.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[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.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "aws-lc-rs" -version = "1.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" -dependencies = [ - "aws-lc-sys", - "untrusted 0.7.1", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", - "pkg-config", -] - -[[package]] -name = "axum" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" -dependencies = [ - "axum-core", - "axum-macros", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-macros" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" - -[[package]] -name = "basic-toml" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "2.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "cc" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" - -[[package]] -name = "chacha20" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", -] - -[[package]] -name = "chrono" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "clap" -version = "4.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "clap_lex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" - -[[package]] -name = "cmake" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" -dependencies = [ - "cc", -] - -[[package]] -name = "cmov" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" - -[[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "const-oid" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "crypto-common" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "ctutils" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" -dependencies = [ - "cmov", -] - -[[package]] -name = "darling" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88490bf1b990d87eaaa7ac8aa887f629a08e7359765b4911faf63c3763347d23" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084e274f91c482280130e1e34e0b8d6e66776a060d7b6de7b84289ca778868c4" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 3.0.3", -] - -[[package]] -name = "darling_macro" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5792fa0d41cd2325ce0ffa64f0a340eaebd4971a3a0c5e1ffd2cc488a355e" -dependencies = [ - "darling_core", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "data-encoding" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", -] - -[[package]] -name = "digest" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" -dependencies = [ - "block-buffer 0.12.1", - "const-oid", - "crypto-common 0.2.2", - "ctutils", -] - -[[package]] -name = "displaydoc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" - -[[package]] -name = "futures-executor" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" - -[[package]] -name = "futures-macro" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "futures-sink" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" - -[[package]] -name = "futures-task" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" - -[[package]] -name = "futures-timer" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" - -[[package]] -name = "futures-util" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "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.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "rand_core 0.10.1", - "wasm-bindgen", -] - -[[package]] -name = "glob" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" - -[[package]] -name = "h2" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hmac" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" -dependencies = [ - "digest 0.11.3", -] - -[[package]] -name = "http" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "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 = "hybrid-array" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" -dependencies = [ - "typenum", -] - -[[package]] -name = "hyper" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "tokio", - "tokio-rustls", - "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", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[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 = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "jni" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys", - "log", - "simd_cesu8", - "thiserror 2.0.19", - "walkdir", - "windows-link", -] - -[[package]] -name = "jni-macros" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.119", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "jobserver" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" -dependencies = [ - "getrandom 0.4.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "11.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881733cbc631fc9e472e24447ce32a64bedf2da498d6d8570b08edc87de71f65" -dependencies = [ - "aws-lc-rs", - "base64 0.22.1", - "getrandom 0.2.17", - "js-sys", - "pem", - "serde", - "serde_json", - "signature", - "simple_asn1", - "zeroize", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "mcp-client-examples" -version = "0.1.5" -dependencies = [ - "anyhow", - "axum", - "clap", - "futures", - "rand 0.10.2", - "reqwest", - "rmcp", - "serde", - "serde_json", - "tokio", - "tower", - "tracing", - "tracing-subscriber", - "url", -] - -[[package]] -name = "mcp-conformance" -version = "0.1.0" -dependencies = [ - "anyhow", - "axum", - "reqwest", - "rmcp", - "serde", - "serde_json", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "url", - "urlencoding", -] - -[[package]] -name = "mcp-server-examples" -version = "0.1.5" -dependencies = [ - "anyhow", - "askama", - "axum", - "chrono", - "futures", - "hyper", - "hyper-util", - "rand 0.10.2", - "reqwest", - "rmcp", - "schemars", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-util", - "tower-http 0.7.0", - "tracing", - "tracing-subscriber", - "url", - "uuid", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mio" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nix" -version = "0.31.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num-bigint" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[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 = "oauth2" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" -dependencies = [ - "base64 0.22.1", - "chrono", - "getrandom 0.2.17", - "http", - "rand 0.8.7", - "serde", - "serde_json", - "serde_path_to_error", - "sha2 0.10.9", - "thiserror 1.0.69", - "url", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "openssl" -version = "0.10.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "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 2.0.119", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "pastey" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64 0.22.1", - "serde_core", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pkg-config" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "process-wrap" -version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" -dependencies = [ - "futures", - "indexmap", - "nix", - "tokio", - "tracing", - "windows", -] - -[[package]] -name = "quinn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.19", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" -dependencies = [ - "aws-lc-rs", - "bytes", - "getrandom 0.4.3", - "lru-slab", - "rand 0.10.2", - "rand_pcg", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.19", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.61.2", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "rand" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" -dependencies = [ - "libc", - "rand_chacha", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" -dependencies = [ - "chacha20", - "getrandom 0.4.3", - "rand_core 0.10.1", -] - -[[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_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[package]] -name = "rand_pcg" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" -dependencies = [ - "rand_core 0.10.1", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "ref-cast" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "regex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - -[[package]] -name = "reqwest" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier", - "serde", - "serde_json", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower", - "tower-http 0.6.11", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[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.17", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "rmcp" -version = "3.1.1" -dependencies = [ - "anyhow", - "async-trait", - "axum", - "base64 0.23.1", - "bytes", - "chrono", - "futures", - "hmac", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "jsonwebtoken", - "oauth2", - "pastey", - "pin-project-lite", - "process-wrap", - "rand 0.10.2", - "reqwest", - "rmcp-macros", - "rstest", - "schemars", - "serde", - "serde_json", - "sha2 0.11.0", - "sse-stream", - "thiserror 2.0.19", - "tokio", - "tokio-stream", - "tokio-util", - "tower-service", - "tracing", - "tracing-subscriber", - "url", - "uuid", - "which", -] - -[[package]] -name = "rmcp-macros" -version = "3.1.1" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "serde_json", - "syn 3.0.3", -] - -[[package]] -name = "rstest" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" -dependencies = [ - "futures-timer", - "futures-util", - "rstest_macros", -] - -[[package]] -name = "rstest_macros" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" -dependencies = [ - "cfg-if", - "glob", - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version", - "syn 2.0.119", - "unicode-ident", -] - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[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 = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" -dependencies = [ - "aws-lc-rs", - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pki-types" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-platform-verifier" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", - "security-framework-sys", - "webpki-root-certs", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls-platform-verifier-android" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" - -[[package]] -name = "rustls-webpki" -version = "0.103.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" -dependencies = [ - "chrono", - "dyn-clone", - "ref-cast", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 3.0.3", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "serde_derive_internals" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "serde_json" -version = "1.0.151" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_spanned" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "simd_cesu8" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" -dependencies = [ - "rustc_version", - "simdutf8", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "simple-chat-client" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "clap", - "futures", - "reqwest", - "rmcp", - "serde", - "serde_json", - "thiserror 2.0.19", - "tokio", - "toml", -] - -[[package]] -name = "simple_asn1" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.19", - "time", -] - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[package]] -name = "socket2" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "sse-stream" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c123f296ade4ec4b8b0f6162116e6629f5146922ca5ab40ca9d3c2e73ab4761e" -dependencies = [ - "bytes", - "futures-util", - "http-body", - "http-body-util", - "pin-project-lite", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[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.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" -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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -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.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.3", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[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.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" -dependencies = [ - "thiserror-impl 2.0.19", -] - -[[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 2.0.119", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "thread_local" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" -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 = "tokio" -version = "1.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[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.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17a073bfed563fa236697a068031408a93cd9522e08abf9933ead3e73411bd71" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite", -] - -[[package]] -name = "tokio-util" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "1.1.4+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned", - "toml_datetime", - "toml_parser", - "toml_writer", - "winnow", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.25.13+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" -dependencies = [ - "indexmap", - "toml_datetime", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.1.3+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_writer" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", - "url", -] - -[[package]] -name = "tower-http" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" -dependencies = [ - "bitflags", - "bytes", - "http", - "percent-encoding", - "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-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "transport" -version = "3.1.1" -dependencies = [ - "anyhow", - "futures", - "hyper", - "hyper-util", - "pin-project-lite", - "rand 0.10.2", - "reqwest", - "rmcp", - "schemars", - "serde", - "serde_json", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48ac77174b19c110a50ab2128b24215ac9cb40e0e12e093fb602d175c569d22" -dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.10.2", - "sha1", - "thiserror 2.0.19", -] - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[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.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" -dependencies = [ - "getrandom 0.4.3", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[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 = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - -[[package]] -name = "wasi-mcp-example" -version = "3.1.1" -dependencies = [ - "rmcp", - "serde", - "tokio", - "tracing", - "tracing-subscriber", - "wasi 0.14.7+wasi-0.2.4", -] - -[[package]] -name = "wasip2" -version = "1.0.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "8.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" -dependencies = [ - "libc", -] - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core", - "windows-link", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core", - "windows-link", -] - -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -dependencies = [ - "bitflags", -] - -[[package]] -name = "writeable" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" - -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerotrie" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/docker/mcp_conformance.Dockerfile b/docker/mcp_conformance.Dockerfile index 22d8852c..a53d268c 100644 --- a/docker/mcp_conformance.Dockerfile +++ b/docker/mcp_conformance.Dockerfile @@ -1,49 +1,34 @@ FROM rust:1.96.1 AS builder +WORKDIR /tmp/ -ARG MCP_RUST_SDK_REV=baac607e52b9788ec20902e2c7143ba4f4786f4b - -WORKDIR /tmp/rust-sdk -# Package versions follow the pinned Rust base image's Debian snapshot. -# hadolint ignore=DL3008 RUN < Date: Fri, 7 Aug 2026 16:06:59 +0100 Subject: [PATCH 08/10] Tag Docker image with v-prefixed version Signed-off-by: lucarlig --- .github/workflows/docker_image_ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker_image_ci.yaml b/.github/workflows/docker_image_ci.yaml index f5aefef2..23f67f66 100644 --- a/.github/workflows/docker_image_ci.yaml +++ b/.github/workflows/docker_image_ci.yaml @@ -31,6 +31,6 @@ jobs: - name: Push image run: | IMAGE_ID="ghcr.io/${{ github.repository_owner }}/${IMAGE_NAME}" - docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:${CF_VERSION}" - docker push "${IMAGE_ID}:${CF_VERSION}" + docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:v${CF_VERSION}" + docker push "${IMAGE_ID}:v${CF_VERSION}" From 1a5aa13a77cef59f7eb28b1f6d83625c17dd9592 Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 16:20:29 +0100 Subject: [PATCH 09/10] Publish compatible Docker version tags Signed-off-by: lucarlig --- .github/workflows/docker_image_ci.yaml | 2 ++ docs/book/src/deployment-notes.md | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker_image_ci.yaml b/.github/workflows/docker_image_ci.yaml index 23f67f66..9f1e66ba 100644 --- a/.github/workflows/docker_image_ci.yaml +++ b/.github/workflows/docker_image_ci.yaml @@ -31,6 +31,8 @@ jobs: - name: Push image run: | IMAGE_ID="ghcr.io/${{ github.repository_owner }}/${IMAGE_NAME}" + docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:${CF_VERSION}" docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:v${CF_VERSION}" + docker push "${IMAGE_ID}:${CF_VERSION}" docker push "${IMAGE_ID}:v${CF_VERSION}" diff --git a/docs/book/src/deployment-notes.md b/docs/book/src/deployment-notes.md index 539fdcc8..e9fac2d3 100644 --- a/docs/book/src/deployment-notes.md +++ b/docs/book/src/deployment-notes.md @@ -64,9 +64,11 @@ returns `400` until Redis returns. ## Images And Sizing - CI builds `docker/Dockerfile` (a `rust:1.96.1` builder stage) on every push - to `main` and pushes `ghcr.io//contextforge-data-plane:`, - where the tag is the Cargo package version. There is no `latest` tag — - pin the version. + to `main` and pushes both + `ghcr.io//contextforge-data-plane:v` and + `ghcr.io//contextforge-data-plane:`, where `` is + the Cargo package version. The `v`-prefixed tag is canonical; the unprefixed + tag is retained for compatibility. There is no `latest` tag — pin a version. - The reference Compose stack runs the gateway with raised limits worth copying to real deployments: `nofile` 65535 and TCP tuning (`tcp_fin_timeout=15`, widened local port range) for high connection churn. From bbd1191717629f02eff16baea42b61a904b0079d Mon Sep 17 00:00:00 2001 From: lucarlig Date: Fri, 7 Aug 2026 16:23:21 +0100 Subject: [PATCH 10/10] Publish versioned and latest Docker tags Signed-off-by: lucarlig --- .github/workflows/docker_image_ci.yaml | 4 ++-- docs/book/src/deployment-notes.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker_image_ci.yaml b/.github/workflows/docker_image_ci.yaml index 9f1e66ba..62b15ef9 100644 --- a/.github/workflows/docker_image_ci.yaml +++ b/.github/workflows/docker_image_ci.yaml @@ -31,8 +31,8 @@ jobs: - name: Push image run: | IMAGE_ID="ghcr.io/${{ github.repository_owner }}/${IMAGE_NAME}" - docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:${CF_VERSION}" docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:v${CF_VERSION}" - docker push "${IMAGE_ID}:${CF_VERSION}" + docker tag "${IMAGE_NAME}:latest" "${IMAGE_ID}:latest" docker push "${IMAGE_ID}:v${CF_VERSION}" + docker push "${IMAGE_ID}:latest" diff --git a/docs/book/src/deployment-notes.md b/docs/book/src/deployment-notes.md index e9fac2d3..7105ff34 100644 --- a/docs/book/src/deployment-notes.md +++ b/docs/book/src/deployment-notes.md @@ -66,9 +66,9 @@ returns `400` until Redis returns. - CI builds `docker/Dockerfile` (a `rust:1.96.1` builder stage) on every push to `main` and pushes both `ghcr.io//contextforge-data-plane:v` and - `ghcr.io//contextforge-data-plane:`, where `` is - the Cargo package version. The `v`-prefixed tag is canonical; the unprefixed - tag is retained for compatibility. There is no `latest` tag — pin a version. + `ghcr.io//contextforge-data-plane:latest`, where `` is the + Cargo package version. There is no unprefixed version tag. Pin the + `v`-prefixed tag for reproducible deployments; `latest` tracks `main`. - The reference Compose stack runs the gateway with raised limits worth copying to real deployments: `nofile` 65535 and TCP tuning (`tcp_fin_timeout=15`, widened local port range) for high connection churn.