From 79ad209ce6cade1089cdbe4dbda8835731d5af15 Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 7 May 2026 17:02:46 -0700 Subject: [PATCH] [codex] Remove remote thread store implementation (#21596) Remove the remote thread-store backend and checked-in protobuf artifacts. We've moved these into another crate that link against this one. Also remove the config settings for thread store backend selection, since we'll instead pass an instantiated thread store into the core-api crate's main entrypoint. --- MODULE.bazel.lock | 10 - codex-rs/Cargo.lock | 123 -- .../tests/suite/conversation_summary.rs | 33 - .../tests/suite/v2/remote_thread_store.rs | 5 +- .../app-server/tests/suite/v2/thread_fork.rs | 60 - .../tests/suite/v2/thread_resume.rs | 62 - codex-rs/config/src/config_toml.rs | 12 +- codex-rs/core/config.schema.json | 22 - codex-rs/core/src/agent/control.rs | 6 +- codex-rs/core/src/config/config_tests.rs | 21 + codex-rs/core/src/config/mod.rs | 24 +- codex-rs/core/src/thread_manager.rs | 2 - codex-rs/thread-store/Cargo.toml | 10 - .../thread-store/examples/generate-proto.rs | 19 - .../thread-store/scripts/generate-proto.sh | 38 - codex-rs/thread-store/src/lib.rs | 2 - codex-rs/thread-store/src/remote/AGENTS.md | 13 - codex-rs/thread-store/src/remote/helpers.rs | 457 ------- .../thread-store/src/remote/list_threads.rs | 282 ----- codex-rs/thread-store/src/remote/mod.rs | 410 ------ .../remote/proto/codex.thread_store.v1.proto | 210 --- .../src/remote/proto/codex.thread_store.v1.rs | 1122 ----------------- 22 files changed, 42 insertions(+), 2901 deletions(-) delete mode 100644 codex-rs/thread-store/examples/generate-proto.rs delete mode 100755 codex-rs/thread-store/scripts/generate-proto.sh delete mode 100644 codex-rs/thread-store/src/remote/AGENTS.md delete mode 100644 codex-rs/thread-store/src/remote/helpers.rs delete mode 100644 codex-rs/thread-store/src/remote/list_threads.rs delete mode 100644 codex-rs/thread-store/src/remote/mod.rs delete mode 100644 codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.proto delete mode 100644 codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.rs diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index e079e3af0..56d2b3a04 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -686,7 +686,6 @@ "axum_0.7.9": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0\"},{\"name\":\"async-trait\",\"req\":\"^0.1.67\"},{\"name\":\"axum-core\",\"req\":\"^0.4.5\"},{\"name\":\"axum-macros\",\"optional\":true,\"req\":\"^0.4.2\"},{\"features\":[\"__private\"],\"kind\":\"dev\",\"name\":\"axum-macros\",\"req\":\"^0.4.1\"},{\"name\":\"base64\",\"optional\":true,\"req\":\"^0.22.1\"},{\"name\":\"bytes\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"futures-util\",\"req\":\"^0.3\"},{\"name\":\"http\",\"req\":\"^1.0.0\"},{\"name\":\"http-body\",\"req\":\"^1.0.0\"},{\"name\":\"http-body-util\",\"req\":\"^0.1.0\"},{\"name\":\"hyper\",\"optional\":true,\"req\":\"^1.1.0\"},{\"features\":[\"tokio\",\"server\",\"service\"],\"name\":\"hyper-util\",\"optional\":true,\"req\":\"^0.1.3\"},{\"name\":\"itoa\",\"req\":\"^1.0.5\"},{\"name\":\"matchit\",\"req\":\"^0.7\"},{\"name\":\"memchr\",\"req\":\"^2.4.1\"},{\"name\":\"mime\",\"req\":\"^0.3.16\"},{\"name\":\"multer\",\"optional\":true,\"req\":\"^3.0.0\"},{\"name\":\"percent-encoding\",\"req\":\"^2.1\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2.7\"},{\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"quickcheck_macros\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"json\",\"stream\",\"multipart\"],\"kind\":\"dev\",\"name\":\"reqwest\",\"req\":\"^0.12\"},{\"name\":\"rustversion\",\"req\":\"^1.0.9\"},{\"name\":\"serde\",\"req\":\"^1.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0\"},{\"features\":[\"raw_value\"],\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0\"},{\"features\":[\"raw_value\"],\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"name\":\"serde_path_to_error\",\"optional\":true,\"req\":\"^0.1.8\"},{\"name\":\"serde_urlencoded\",\"optional\":true,\"req\":\"^0.7\"},{\"name\":\"sha1\",\"optional\":true,\"req\":\"^0.10\"},{\"name\":\"sync_wrapper\",\"req\":\"^1.0.0\"},{\"features\":[\"serde-human-readable\"],\"kind\":\"dev\",\"name\":\"time\",\"req\":\"^0.3\"},{\"features\":[\"time\"],\"name\":\"tokio\",\"optional\":true,\"package\":\"tokio\",\"req\":\"^1.25.0\"},{\"features\":[\"macros\",\"rt\",\"rt-multi-thread\",\"net\",\"test-util\"],\"kind\":\"dev\",\"name\":\"tokio\",\"package\":\"tokio\",\"req\":\"^1.25.0\"},{\"kind\":\"dev\",\"name\":\"tokio-stream\",\"req\":\"^0.1\"},{\"name\":\"tokio-tungstenite\",\"optional\":true,\"req\":\"^0.24.0\"},{\"kind\":\"dev\",\"name\":\"tokio-tungstenite\",\"req\":\"^0.24.0\"},{\"default_features\":false,\"features\":[\"util\"],\"name\":\"tower\",\"req\":\"^0.5.1\"},{\"features\":[\"util\",\"timeout\",\"limit\",\"load-shed\",\"steer\",\"filter\"],\"kind\":\"dev\",\"name\":\"tower\",\"package\":\"tower\",\"req\":\"^0.5.1\"},{\"features\":[\"add-extension\",\"auth\",\"catch-panic\",\"compression-br\",\"compression-deflate\",\"compression-gzip\",\"cors\",\"decompression-br\",\"decompression-deflate\",\"decompression-gzip\",\"follow-redirect\",\"fs\",\"limit\",\"map-request-body\",\"map-response-body\",\"metrics\",\"normalize-path\",\"propagate-header\",\"redirect\",\"request-id\",\"sensitive-headers\",\"set-header\",\"set-status\",\"timeout\",\"trace\",\"util\",\"validate-request\"],\"name\":\"tower-http\",\"optional\":true,\"req\":\"^0.6.0\"},{\"features\":[\"add-extension\",\"auth\",\"catch-panic\",\"compression-br\",\"compression-deflate\",\"compression-gzip\",\"cors\",\"decompression-br\",\"decompression-deflate\",\"decompression-gzip\",\"follow-redirect\",\"fs\",\"limit\",\"map-request-body\",\"map-response-body\",\"metrics\",\"normalize-path\",\"propagate-header\",\"redirect\",\"request-id\",\"sensitive-headers\",\"set-header\",\"set-status\",\"timeout\",\"trace\",\"util\",\"validate-request\"],\"kind\":\"dev\",\"name\":\"tower-http\",\"req\":\"^0.6.0\"},{\"name\":\"tower-layer\",\"req\":\"^0.3.2\"},{\"name\":\"tower-service\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"tracing\",\"optional\":true,\"req\":\"^0.1\"},{\"kind\":\"dev\",\"name\":\"tracing\",\"req\":\"^0.1\"},{\"features\":[\"json\"],\"kind\":\"dev\",\"name\":\"tracing-subscriber\",\"req\":\"^0.3\"},{\"features\":[\"serde\",\"v4\"],\"kind\":\"dev\",\"name\":\"uuid\",\"req\":\"^1.0\"}],\"features\":{\"__private_docs\":[\"axum-core/__private_docs\",\"tower/full\",\"dep:tower-http\"],\"default\":[\"form\",\"http1\",\"json\",\"matched-path\",\"original-uri\",\"query\",\"tokio\",\"tower-log\",\"tracing\"],\"form\":[\"dep:serde_urlencoded\"],\"http1\":[\"dep:hyper\",\"hyper?/http1\",\"hyper-util?/http1\"],\"http2\":[\"dep:hyper\",\"hyper?/http2\",\"hyper-util?/http2\"],\"json\":[\"dep:serde_json\",\"dep:serde_path_to_error\"],\"macros\":[\"dep:axum-macros\"],\"matched-path\":[],\"multipart\":[\"dep:multer\"],\"original-uri\":[],\"query\":[\"dep:serde_urlencoded\"],\"tokio\":[\"dep:hyper-util\",\"dep:tokio\",\"tokio/net\",\"tokio/rt\",\"tower/make\",\"tokio/macros\"],\"tower-log\":[\"tower/log\"],\"tracing\":[\"dep:tracing\",\"axum-core/tracing\"],\"ws\":[\"dep:hyper\",\"tokio\",\"dep:tokio-tungstenite\",\"dep:sha1\",\"dep:base64\"]}}", "axum_0.8.8": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0\"},{\"name\":\"axum-core\",\"req\":\"^0.5.5\"},{\"name\":\"axum-macros\",\"optional\":true,\"req\":\"^0.5.0\"},{\"name\":\"base64\",\"optional\":true,\"req\":\"^0.22.1\"},{\"name\":\"bytes\",\"req\":\"^1.0\"},{\"name\":\"form_urlencoded\",\"optional\":true,\"req\":\"^1.1.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"futures-util\",\"req\":\"^0.3\"},{\"name\":\"http\",\"req\":\"^1.0.0\"},{\"name\":\"http-body\",\"req\":\"^1.0.0\"},{\"name\":\"http-body-util\",\"req\":\"^0.1.0\"},{\"name\":\"hyper\",\"optional\":true,\"req\":\"^1.1.0\"},{\"features\":[\"client\"],\"kind\":\"dev\",\"name\":\"hyper\",\"req\":\"^1.1.0\"},{\"features\":[\"tokio\",\"server\",\"service\"],\"name\":\"hyper-util\",\"optional\":true,\"req\":\"^0.1.3\"},{\"name\":\"itoa\",\"req\":\"^1.0.5\"},{\"name\":\"matchit\",\"req\":\"=0.8.4\"},{\"name\":\"memchr\",\"req\":\"^2.4.1\"},{\"name\":\"mime\",\"req\":\"^0.3.16\"},{\"name\":\"multer\",\"optional\":true,\"req\":\"^3.0.0\"},{\"name\":\"percent-encoding\",\"req\":\"^2.1\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2.7\"},{\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"quickcheck_macros\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"json\",\"stream\",\"multipart\"],\"name\":\"reqwest\",\"optional\":true,\"req\":\"^0.12\"},{\"default_features\":false,\"features\":[\"json\",\"stream\",\"multipart\"],\"kind\":\"dev\",\"name\":\"reqwest\",\"req\":\"^0.12\"},{\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.211\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.221\"},{\"name\":\"serde_core\",\"req\":\"^1.0.221\"},{\"features\":[\"raw_value\"],\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0\"},{\"features\":[\"raw_value\"],\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"name\":\"serde_path_to_error\",\"optional\":true,\"req\":\"^0.1.8\"},{\"name\":\"serde_urlencoded\",\"optional\":true,\"req\":\"^0.7\"},{\"name\":\"sha1\",\"optional\":true,\"req\":\"^0.10\"},{\"name\":\"sync_wrapper\",\"req\":\"^1.0.0\"},{\"features\":[\"serde-human-readable\"],\"kind\":\"dev\",\"name\":\"time\",\"req\":\"^0.3\"},{\"features\":[\"time\"],\"name\":\"tokio\",\"optional\":true,\"package\":\"tokio\",\"req\":\"^1.44\"},{\"features\":[\"macros\",\"rt\",\"rt-multi-thread\",\"net\",\"test-util\"],\"kind\":\"dev\",\"name\":\"tokio\",\"package\":\"tokio\",\"req\":\"^1.44.2\"},{\"kind\":\"dev\",\"name\":\"tokio-stream\",\"req\":\"^0.1\"},{\"name\":\"tokio-tungstenite\",\"optional\":true,\"req\":\"^0.28.0\"},{\"kind\":\"dev\",\"name\":\"tokio-tungstenite\",\"req\":\"^0.28.0\"},{\"default_features\":false,\"features\":[\"util\"],\"name\":\"tower\",\"req\":\"^0.5.2\"},{\"features\":[\"util\",\"timeout\",\"limit\",\"load-shed\",\"steer\",\"filter\"],\"kind\":\"dev\",\"name\":\"tower\",\"package\":\"tower\",\"req\":\"^0.5.2\"},{\"features\":[\"add-extension\",\"auth\",\"catch-panic\",\"compression-br\",\"compression-deflate\",\"compression-gzip\",\"cors\",\"decompression-br\",\"decompression-deflate\",\"decompression-gzip\",\"follow-redirect\",\"fs\",\"limit\",\"map-request-body\",\"map-response-body\",\"metrics\",\"normalize-path\",\"propagate-header\",\"redirect\",\"request-id\",\"sensitive-headers\",\"set-header\",\"set-status\",\"timeout\",\"trace\",\"util\",\"validate-request\"],\"name\":\"tower-http\",\"optional\":true,\"req\":\"^0.6.0\"},{\"features\":[\"add-extension\",\"auth\",\"catch-panic\",\"compression-br\",\"compression-deflate\",\"compression-gzip\",\"cors\",\"decompression-br\",\"decompression-deflate\",\"decompression-gzip\",\"follow-redirect\",\"fs\",\"limit\",\"map-request-body\",\"map-response-body\",\"metrics\",\"normalize-path\",\"propagate-header\",\"redirect\",\"request-id\",\"sensitive-headers\",\"set-header\",\"set-status\",\"timeout\",\"trace\",\"util\",\"validate-request\"],\"kind\":\"dev\",\"name\":\"tower-http\",\"req\":\"^0.6.0\"},{\"name\":\"tower-layer\",\"req\":\"^0.3.2\"},{\"name\":\"tower-service\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"tracing\",\"optional\":true,\"req\":\"^0.1\"},{\"kind\":\"dev\",\"name\":\"tracing\",\"req\":\"^0.1\"},{\"features\":[\"json\"],\"kind\":\"dev\",\"name\":\"tracing-subscriber\",\"req\":\"^0.3\"},{\"features\":[\"serde\",\"v4\"],\"kind\":\"dev\",\"name\":\"uuid\",\"req\":\"^1.0\"}],\"features\":{\"__private\":[\"tokio\",\"http1\",\"dep:reqwest\"],\"__private_docs\":[\"axum-core/__private_docs\",\"tower/full\",\"dep:serde\",\"dep:tower-http\"],\"default\":[\"form\",\"http1\",\"json\",\"matched-path\",\"original-uri\",\"query\",\"tokio\",\"tower-log\",\"tracing\"],\"form\":[\"dep:form_urlencoded\",\"dep:serde_urlencoded\",\"dep:serde_path_to_error\"],\"http1\":[\"dep:hyper\",\"hyper?/http1\",\"hyper-util?/http1\"],\"http2\":[\"dep:hyper\",\"hyper?/http2\",\"hyper-util?/http2\"],\"json\":[\"dep:serde_json\",\"dep:serde_path_to_error\"],\"macros\":[\"dep:axum-macros\"],\"matched-path\":[],\"multipart\":[\"dep:multer\"],\"original-uri\":[],\"query\":[\"dep:form_urlencoded\",\"dep:serde_urlencoded\",\"dep:serde_path_to_error\"],\"tokio\":[\"dep:hyper-util\",\"dep:tokio\",\"tokio/net\",\"tokio/rt\",\"tower/make\",\"tokio/macros\"],\"tower-log\":[\"tower/log\"],\"tracing\":[\"dep:tracing\",\"axum-core/tracing\"],\"ws\":[\"dep:hyper\",\"tokio\",\"dep:tokio-tungstenite\",\"dep:sha1\",\"dep:base64\"]}}", "backtrace_0.3.76": "{\"dependencies\":[{\"default_features\":false,\"name\":\"addr2line\",\"req\":\"^0.25.0\",\"target\":\"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\"},{\"name\":\"cfg-if\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"cpp_demangle\",\"optional\":true,\"req\":\"^0.5.0\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.156\",\"target\":\"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\"},{\"kind\":\"dev\",\"name\":\"libloading\",\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"miniz_oxide\",\"req\":\"^0.8\",\"target\":\"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\"},{\"default_features\":false,\"features\":[\"read_core\",\"elf\",\"macho\",\"pe\",\"xcoff\",\"unaligned\",\"archive\"],\"name\":\"object\",\"req\":\"^0.37.0\",\"target\":\"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\"},{\"name\":\"rustc-demangle\",\"req\":\"^0.1.24\"},{\"default_features\":false,\"name\":\"ruzstd\",\"optional\":true,\"req\":\"^0.8.1\",\"target\":\"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"name\":\"windows-link\",\"req\":\"^0.2\",\"target\":\"cfg(any(windows, target_os = \\\"cygwin\\\"))\"}],\"features\":{\"coresymbolication\":[],\"dbghelp\":[],\"default\":[\"std\"],\"dl_iterate_phdr\":[],\"dladdr\":[],\"kernel32\":[],\"libunwind\":[],\"ruzstd\":[\"dep:ruzstd\"],\"serialize-serde\":[\"serde\"],\"std\":[],\"unix-backtrace\":[]}}", - "base16ct_0.2.0": "{\"dependencies\":[],\"features\":{\"alloc\":[],\"std\":[\"alloc\"]}}", "base64-simd_0.8.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"base64\",\"req\":\"^0.20.0\"},{\"kind\":\"dev\",\"name\":\"const-str\",\"req\":\"^0.5.3\"},{\"features\":[\"js\"],\"kind\":\"dev\",\"name\":\"getrandom\",\"req\":\"^0.2.8\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"outref\",\"req\":\"^0.5.0\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.5\"},{\"name\":\"vsimd\",\"req\":\"^0.8.0\"},{\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3.33\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"}],\"features\":{\"alloc\":[\"vsimd/alloc\"],\"default\":[\"std\",\"detect\"],\"detect\":[\"vsimd/detect\"],\"std\":[\"alloc\",\"vsimd/std\"],\"unstable\":[\"vsimd/unstable\"]}}", "base64_0.21.7": "{\"dependencies\":[{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"clap\",\"req\":\"^3.2.25\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.4.0\"},{\"kind\":\"dev\",\"name\":\"once_cell\",\"req\":\"^1\"},{\"features\":[\"small_rng\"],\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.5\"},{\"kind\":\"dev\",\"name\":\"rstest\",\"req\":\"^0.13.0\"},{\"kind\":\"dev\",\"name\":\"rstest_reuse\",\"req\":\"^0.6.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"strum\",\"req\":\"^0.25\"}],\"features\":{\"alloc\":[],\"default\":[\"std\"],\"std\":[\"alloc\"]}}", "base64_0.22.1": "{\"dependencies\":[{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"clap\",\"req\":\"^3.2.25\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.4.0\"},{\"kind\":\"dev\",\"name\":\"once_cell\",\"req\":\"^1\"},{\"features\":[\"small_rng\"],\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.5\"},{\"kind\":\"dev\",\"name\":\"rstest\",\"req\":\"^0.13.0\"},{\"kind\":\"dev\",\"name\":\"rstest_reuse\",\"req\":\"^0.6.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"strum\",\"req\":\"^0.25\"}],\"features\":{\"alloc\":[],\"default\":[\"std\"],\"std\":[\"alloc\"]}}", @@ -798,7 +797,6 @@ "crossbeam-utils_0.8.21": "{\"dependencies\":[{\"name\":\"loom\",\"optional\":true,\"req\":\"^0.7.1\",\"target\":\"cfg(crossbeam_loom)\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8\"}],\"features\":{\"default\":[\"std\"],\"nightly\":[],\"std\":[]}}", "crossterm_winapi_0.9.1": "{\"dependencies\":[{\"features\":[\"winbase\",\"consoleapi\",\"processenv\",\"handleapi\",\"synchapi\",\"impl-default\"],\"name\":\"winapi\",\"req\":\"^0.3.8\",\"target\":\"cfg(windows)\"}],\"features\":{}}", "crunchy_0.2.4": "{\"dependencies\":[],\"features\":{\"default\":[\"limit_128\"],\"limit_1024\":[],\"limit_128\":[],\"limit_2048\":[],\"limit_256\":[],\"limit_512\":[],\"limit_64\":[],\"std\":[]}}", - "crypto-bigint_0.5.5": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1\"},{\"features\":[\"html_reports\"],\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5\"},{\"default_features\":false,\"name\":\"der\",\"optional\":true,\"req\":\"^0.7\"},{\"name\":\"generic-array\",\"optional\":true,\"req\":\"^0.14\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"num-bigint\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"num-integer\",\"req\":\"^0.1\"},{\"kind\":\"dev\",\"name\":\"num-traits\",\"req\":\"^0.2\"},{\"kind\":\"dev\",\"name\":\"proptest\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"rand_chacha\",\"req\":\"^0.3\"},{\"name\":\"rand_core\",\"optional\":true,\"req\":\"^0.6.4\"},{\"features\":[\"std\"],\"kind\":\"dev\",\"name\":\"rand_core\",\"req\":\"^0.6\"},{\"default_features\":false,\"name\":\"rlp\",\"optional\":true,\"req\":\"^0.5\"},{\"default_features\":false,\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2.4\"},{\"default_features\":false,\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"alloc\":[\"serdect?/alloc\"],\"default\":[\"rand\"],\"extra-sizes\":[],\"rand\":[\"rand_core/std\"],\"serde\":[\"dep:serdect\"]}}", "crypto-common_0.1.7": "{\"dependencies\":[{\"features\":[\"more_lengths\"],\"name\":\"generic-array\",\"req\":\"=0.14.7\"},{\"name\":\"rand_core\",\"optional\":true,\"req\":\"^0.6\"},{\"name\":\"typenum\",\"req\":\"^1.14\"}],\"features\":{\"getrandom\":[\"rand_core/getrandom\"],\"std\":[]}}", "crypto_box_0.9.1": "{\"dependencies\":[{\"default_features\":false,\"name\":\"aead\",\"req\":\"^0.5.2\"},{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"blake2\",\"optional\":true,\"req\":\"^0.10\"},{\"name\":\"chacha20\",\"optional\":true,\"req\":\"^0.9\"},{\"default_features\":false,\"name\":\"crypto_secretbox\",\"req\":\"^0.1.1\"},{\"default_features\":false,\"features\":[\"zeroize\"],\"name\":\"curve25519-dalek\",\"req\":\"^4\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8\"},{\"kind\":\"dev\",\"name\":\"rmp-serde\",\"req\":\"^1\"},{\"name\":\"salsa20\",\"optional\":true,\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"zeroize\",\"req\":\"^1\"}],\"features\":{\"alloc\":[\"aead/alloc\"],\"chacha20\":[\"dep:chacha20\",\"crypto_secretbox/chacha20\"],\"default\":[\"alloc\",\"getrandom\",\"salsa20\"],\"getrandom\":[\"aead/getrandom\",\"rand_core\"],\"heapless\":[\"aead/heapless\"],\"rand_core\":[\"aead/rand_core\"],\"salsa20\":[\"dep:salsa20\",\"crypto_secretbox/salsa20\"],\"seal\":[\"dep:blake2\",\"alloc\"],\"serde\":[\"dep:serdect\"],\"std\":[\"aead/std\"]}}", "crypto_secretbox_0.1.1": "{\"dependencies\":[{\"default_features\":false,\"name\":\"aead\",\"req\":\"^0.5\"},{\"features\":[\"zeroize\"],\"name\":\"chacha20\",\"optional\":true,\"req\":\"^0.9\"},{\"default_features\":false,\"name\":\"cipher\",\"req\":\"^0.4\"},{\"default_features\":false,\"features\":[\"zeroize\"],\"name\":\"generic-array\",\"req\":\"^0.14.7\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"name\":\"poly1305\",\"req\":\"^0.8\"},{\"features\":[\"zeroize\"],\"name\":\"salsa20\",\"optional\":true,\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"zeroize\",\"req\":\"^1\"}],\"features\":{\"alloc\":[\"aead/alloc\"],\"default\":[\"alloc\",\"getrandom\",\"salsa20\"],\"getrandom\":[\"aead/getrandom\",\"rand_core\"],\"heapless\":[\"aead/heapless\"],\"rand_core\":[\"aead/rand_core\"],\"std\":[\"aead/std\",\"alloc\"],\"stream\":[\"aead/stream\"]}}", @@ -872,11 +870,9 @@ "dylint_linting_5.0.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"assert_cmd\",\"req\":\"^2.0\"},{\"name\":\"cargo_metadata\",\"req\":\"^0.23\"},{\"features\":[\"config\"],\"name\":\"dylint_internal\",\"req\":\"=5.0.0\"},{\"name\":\"paste\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"rustc_version\",\"req\":\"^0.4\"},{\"name\":\"rustversion\",\"req\":\"^1.0\"},{\"name\":\"serde\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.23\"},{\"name\":\"thiserror\",\"req\":\"^2.0\"},{\"name\":\"toml\",\"req\":\"^0.9\"},{\"kind\":\"build\",\"name\":\"toml\",\"req\":\"^0.9\"}],\"features\":{\"constituent\":[]}}", "dylint_testing_5.0.0": "{\"dependencies\":[{\"name\":\"anyhow\",\"req\":\"^1.0\"},{\"name\":\"cargo_metadata\",\"req\":\"^0.23\"},{\"name\":\"compiletest_rs\",\"req\":\"^0.11\"},{\"name\":\"dylint\",\"req\":\"=5.0.0\"},{\"name\":\"dylint_internal\",\"req\":\"=5.0.0\"},{\"name\":\"env_logger\",\"req\":\"^0.11\"},{\"name\":\"once_cell\",\"req\":\"^1.21\"},{\"name\":\"regex\",\"req\":\"^1.11\"},{\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"name\":\"tempfile\",\"req\":\"^3.23\"}],\"features\":{\"default\":[],\"deny_warnings\":[]}}", "dyn-clone_1.0.20": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"rustversion\",\"req\":\"^1.0\"},{\"features\":[\"diff\"],\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.66\"}],\"features\":{}}", - "ecdsa_0.16.9": "{\"dependencies\":[{\"name\":\"der\",\"optional\":true,\"req\":\"^0.7\"},{\"default_features\":false,\"features\":[\"oid\"],\"name\":\"digest\",\"optional\":true,\"req\":\"^0.10.7\"},{\"default_features\":false,\"features\":[\"digest\",\"sec1\"],\"name\":\"elliptic-curve\",\"req\":\"^0.13.6\"},{\"default_features\":false,\"features\":[\"dev\"],\"kind\":\"dev\",\"name\":\"elliptic-curve\",\"req\":\"^0.13\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"name\":\"rfc6979\",\"optional\":true,\"req\":\"^0.4\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"features\":[\"oid\"],\"name\":\"sha2\",\"optional\":true,\"req\":\"^0.10\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"sha2\",\"req\":\"^0.10\"},{\"default_features\":false,\"features\":[\"rand_core\"],\"name\":\"signature\",\"req\":\"^2.0, <2.3\"},{\"default_features\":false,\"name\":\"spki\",\"optional\":true,\"req\":\"^0.7.2\"}],\"features\":{\"alloc\":[\"elliptic-curve/alloc\",\"signature/alloc\",\"spki/alloc\"],\"arithmetic\":[\"elliptic-curve/arithmetic\"],\"default\":[\"digest\"],\"dev\":[\"arithmetic\",\"digest\",\"elliptic-curve/dev\",\"hazmat\"],\"digest\":[\"dep:digest\",\"signature/digest\"],\"hazmat\":[],\"pem\":[\"elliptic-curve/pem\",\"pkcs8\"],\"pkcs8\":[\"digest\",\"elliptic-curve/pkcs8\",\"der\"],\"serde\":[\"elliptic-curve/serde\",\"serdect\"],\"signing\":[\"arithmetic\",\"digest\",\"hazmat\",\"rfc6979\"],\"std\":[\"alloc\",\"elliptic-curve/std\",\"signature/std\"],\"verifying\":[\"arithmetic\",\"digest\",\"hazmat\"]}}", "ed25519-dalek_2.2.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"blake2\",\"req\":\"^0.10\"},{\"features\":[\"html_reports\"],\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.5\"},{\"default_features\":false,\"features\":[\"digest\"],\"name\":\"curve25519-dalek\",\"req\":\"^4\"},{\"default_features\":false,\"features\":[\"digest\",\"rand_core\"],\"kind\":\"dev\",\"name\":\"curve25519-dalek\",\"req\":\"^4\"},{\"default_features\":false,\"name\":\"ed25519\",\"req\":\">=2.2, <2.3\"},{\"kind\":\"dev\",\"name\":\"hex\",\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"default_features\":false,\"name\":\"merlin\",\"optional\":true,\"req\":\"^3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"rand_core\",\"optional\":true,\"req\":\"^0.6.4\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"rand_core\",\"req\":\"^0.6.4\"},{\"default_features\":false,\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"default_features\":false,\"name\":\"sha2\",\"req\":\"^0.10\"},{\"kind\":\"dev\",\"name\":\"sha3\",\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"signature\",\"optional\":true,\"req\":\">=2.0, <2.3\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2.3.0\"},{\"kind\":\"dev\",\"name\":\"toml\",\"req\":\"^0.7\"},{\"default_features\":false,\"features\":[\"static_secrets\"],\"kind\":\"dev\",\"name\":\"x25519-dalek\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1.5\"}],\"features\":{\"alloc\":[\"curve25519-dalek/alloc\",\"ed25519/alloc\",\"serde?/alloc\",\"zeroize/alloc\"],\"asm\":[\"sha2/asm\"],\"batch\":[\"alloc\",\"merlin\",\"rand_core\"],\"default\":[\"fast\",\"std\",\"zeroize\"],\"digest\":[\"signature/digest\"],\"fast\":[\"curve25519-dalek/precomputed-tables\"],\"hazmat\":[],\"legacy_compatibility\":[\"curve25519-dalek/legacy_compatibility\"],\"pem\":[\"alloc\",\"ed25519/pem\",\"pkcs8\"],\"pkcs8\":[\"ed25519/pkcs8\"],\"rand_core\":[\"dep:rand_core\"],\"serde\":[\"dep:serde\",\"ed25519/serde\"],\"std\":[\"alloc\",\"ed25519/std\",\"serde?/std\",\"sha2/std\"],\"zeroize\":[\"dep:zeroize\",\"curve25519-dalek/zeroize\"]}}", "ed25519_2.2.3": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1\"},{\"features\":[\"rand_core\"],\"kind\":\"dev\",\"name\":\"ed25519-dalek\",\"req\":\"^2\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"name\":\"pkcs8\",\"optional\":true,\"req\":\"^0.10\"},{\"features\":[\"std\"],\"kind\":\"dev\",\"name\":\"rand_core\",\"req\":\"^0.6\"},{\"default_features\":false,\"features\":[\"signature\"],\"kind\":\"dev\",\"name\":\"ring-compat\",\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"serde\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"serde_bytes\",\"optional\":true,\"req\":\"^0.11\"},{\"default_features\":false,\"name\":\"signature\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"alloc\":[\"pkcs8?/alloc\"],\"default\":[\"std\"],\"pem\":[\"alloc\",\"pkcs8/pem\"],\"serde_bytes\":[\"serde\",\"dep:serde_bytes\"],\"std\":[\"pkcs8?/std\",\"signature/std\"]}}", "either_1.15.0": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"alloc\",\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.95\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.0\"}],\"features\":{\"default\":[\"std\"],\"std\":[],\"use_std\":[\"std\"]}}", - "elliptic-curve_0.13.8": "{\"dependencies\":[{\"name\":\"base16ct\",\"req\":\"^0.2\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"base64ct\",\"optional\":true,\"req\":\"^1\"},{\"default_features\":false,\"features\":[\"rand_core\",\"generic-array\",\"zeroize\"],\"name\":\"crypto-bigint\",\"req\":\"^0.5\"},{\"name\":\"digest\",\"optional\":true,\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"ff\",\"optional\":true,\"req\":\"^0.13\"},{\"default_features\":false,\"features\":[\"zeroize\"],\"name\":\"generic-array\",\"req\":\"^0.14.6\"},{\"default_features\":false,\"name\":\"group\",\"optional\":true,\"req\":\"^0.13\"},{\"name\":\"hex-literal\",\"optional\":true,\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"default_features\":false,\"name\":\"hkdf\",\"optional\":true,\"req\":\"^0.12.1\"},{\"features\":[\"alloc\"],\"name\":\"pem-rfc7468\",\"optional\":true,\"req\":\"^0.7\"},{\"default_features\":false,\"name\":\"pkcs8\",\"optional\":true,\"req\":\"^0.10.2\"},{\"default_features\":false,\"name\":\"rand_core\",\"req\":\"^0.6.4\"},{\"features\":[\"subtle\",\"zeroize\"],\"name\":\"sec1\",\"optional\":true,\"req\":\"^0.7.1\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0.47\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"},{\"kind\":\"dev\",\"name\":\"sha2\",\"req\":\"^0.10\"},{\"kind\":\"dev\",\"name\":\"sha3\",\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"tap\",\"optional\":true,\"req\":\"^1.0.1\"},{\"default_features\":false,\"name\":\"zeroize\",\"req\":\"^1.7\"}],\"features\":{\"alloc\":[\"base16ct/alloc\",\"ff?/alloc\",\"group?/alloc\",\"pkcs8?/alloc\",\"sec1?/alloc\",\"zeroize/alloc\"],\"arithmetic\":[\"group\"],\"bits\":[\"arithmetic\",\"ff/bits\",\"dep:tap\"],\"default\":[\"arithmetic\"],\"dev\":[\"arithmetic\",\"dep:hex-literal\",\"pem\",\"pkcs8\"],\"ecdh\":[\"arithmetic\",\"digest\",\"dep:hkdf\"],\"group\":[\"dep:group\",\"ff\"],\"hash2curve\":[\"arithmetic\",\"digest\"],\"hazmat\":[],\"jwk\":[\"dep:base64ct\",\"dep:serde_json\",\"alloc\",\"serde\",\"zeroize/alloc\"],\"pem\":[\"dep:pem-rfc7468\",\"alloc\",\"arithmetic\",\"pkcs8\",\"sec1/pem\"],\"pkcs8\":[\"dep:pkcs8\",\"sec1\"],\"serde\":[\"dep:serdect\",\"alloc\",\"pkcs8\",\"sec1/serde\"],\"std\":[\"alloc\",\"rand_core/std\",\"pkcs8?/std\",\"sec1?/std\"],\"voprf\":[\"digest\"]}}", "ena_0.14.3": "{\"dependencies\":[{\"name\":\"dogged\",\"optional\":true,\"req\":\"^0.2.0\"},{\"name\":\"log\",\"req\":\"^0.4\"}],\"features\":{\"bench\":[],\"persistent\":[\"dogged\"]}}", "encode_unicode_1.0.0": "{\"dependencies\":[{\"default_features\":false,\"name\":\"ascii\",\"optional\":true,\"req\":\"^1.0.0\"},{\"kind\":\"dev\",\"name\":\"lazy_static\",\"req\":\"^1.0\",\"target\":\"cfg(unix)\"},{\"features\":[\"https-native\"],\"kind\":\"dev\",\"name\":\"minreq\",\"req\":\"^2.6\"}],\"features\":{\"default\":[\"std\"],\"std\":[]}}", "encoding_rs_0.8.35": "{\"dependencies\":[{\"name\":\"any_all_workaround\",\"optional\":true,\"req\":\"^0.1.0\"},{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.0\"},{\"name\":\"cfg-if\",\"req\":\"^1.0\"},{\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_derive\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0\"}],\"features\":{\"alloc\":[],\"default\":[\"alloc\"],\"fast-big5-hanzi-encode\":[],\"fast-gb-hanzi-encode\":[],\"fast-hangul-encode\":[],\"fast-hanja-encode\":[],\"fast-kanji-encode\":[],\"fast-legacy-encode\":[\"fast-hangul-encode\",\"fast-hanja-encode\",\"fast-kanji-encode\",\"fast-gb-hanzi-encode\",\"fast-big5-hanzi-encode\"],\"less-slow-big5-hanzi-encode\":[],\"less-slow-gb-hanzi-encode\":[],\"less-slow-kanji-encode\":[],\"simd-accel\":[\"any_all_workaround\"]}}", @@ -907,7 +903,6 @@ "fax_derive_0.2.0": "{\"dependencies\":[{\"name\":\"proc-macro2\",\"req\":\"^1.0\"},{\"name\":\"quote\",\"req\":\"^1.0\"},{\"name\":\"syn\",\"req\":\"^2.0\"}],\"features\":{}}", "fd-lock_4.0.4": "{\"dependencies\":[{\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"features\":[\"fs\"],\"name\":\"rustix\",\"req\":\"^1.0.0\",\"target\":\"cfg(unix)\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3.0.8\"},{\"features\":[\"Win32_Foundation\",\"Win32_Storage_FileSystem\",\"Win32_System_IO\"],\"name\":\"windows-sys\",\"req\":\">=0.52.0, <0.60.0\",\"target\":\"cfg(windows)\"}],\"features\":{}}", "fdeflate_0.3.7": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"miniz_oxide\",\"req\":\"^0.7.1\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.5\"},{\"name\":\"simd-adler32\",\"req\":\"^0.3.4\"}],\"features\":{}}", - "ff_0.13.1": "{\"dependencies\":[{\"default_features\":false,\"name\":\"bitvec\",\"optional\":true,\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"blake2b_simd\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"byteorder\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"ff_derive\",\"optional\":true,\"req\":\"^0.13.1\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"rand_core\",\"req\":\"^0.6\"},{\"default_features\":false,\"features\":[\"i128\"],\"name\":\"subtle\",\"req\":\"^2.2.1\"}],\"features\":{\"alloc\":[],\"bits\":[\"bitvec\"],\"default\":[\"bits\",\"std\"],\"derive\":[\"byteorder\",\"ff_derive\"],\"derive_bits\":[\"bits\",\"ff_derive/bits\"],\"std\":[\"alloc\"]}}", "fiat-crypto_0.2.9": "{\"dependencies\":[],\"features\":{\"default\":[\"std\"],\"std\":[]}}", "filedescriptor_0.8.3": "{\"dependencies\":[{\"name\":\"libc\",\"req\":\"^0.2\"},{\"name\":\"thiserror\",\"req\":\"^1.0\"},{\"features\":[\"winuser\",\"handleapi\",\"fileapi\",\"namedpipeapi\",\"processthreadsapi\",\"winsock2\",\"processenv\"],\"name\":\"winapi\",\"req\":\"^0.3\",\"target\":\"cfg(windows)\"}],\"features\":{}}", "filetime_0.2.27": "{\"dependencies\":[{\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"name\":\"libc\",\"req\":\"^0.2.27\",\"target\":\"cfg(unix)\"},{\"name\":\"libredox\",\"req\":\"^0.1.0\",\"target\":\"cfg(target_os = \\\"redox\\\")\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3\"}],\"features\":{}}", @@ -1035,7 +1030,6 @@ "glob_0.3.3": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"tempdir\",\"req\":\"^0.3\"}],\"features\":{}}", "globset_0.4.18": "{\"dependencies\":[{\"name\":\"aho-corasick\",\"req\":\"^1.1.1\"},{\"features\":[\"derive\"],\"name\":\"arbitrary\",\"optional\":true,\"req\":\"^1.3.2\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"bstr\",\"req\":\"^1.6.2\"},{\"kind\":\"dev\",\"name\":\"glob\",\"req\":\"^0.3.1\"},{\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.20\"},{\"default_features\":false,\"features\":[\"std\",\"perf\",\"syntax\",\"meta\",\"nfa\",\"hybrid\"],\"name\":\"regex-automata\",\"req\":\"^0.4.0\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"regex-syntax\",\"req\":\"^0.8.0\"},{\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.188\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.107\"}],\"features\":{\"arbitrary\":[\"dep:arbitrary\"],\"default\":[\"log\"],\"serde1\":[\"serde\"],\"simd-accel\":[]}}", "gobject-sys_0.21.5": "{\"dependencies\":[{\"name\":\"glib-sys\",\"req\":\"^0.21\"},{\"name\":\"libc\",\"req\":\"^0.2\"},{\"kind\":\"dev\",\"name\":\"shell-words\",\"req\":\"^1.0.0\"},{\"kind\":\"build\",\"name\":\"system-deps\",\"req\":\"^7\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3\"}],\"features\":{\"v2_58\":[],\"v2_62\":[\"v2_58\"],\"v2_66\":[\"v2_62\"],\"v2_68\":[\"v2_66\"],\"v2_70\":[\"v2_68\"],\"v2_72\":[\"v2_70\"],\"v2_74\":[\"v2_72\"],\"v2_76\":[\"v2_74\"],\"v2_78\":[\"v2_74\"],\"v2_80\":[\"v2_78\"],\"v2_82\":[\"v2_80\"],\"v2_84\":[\"v2_82\"],\"v2_86\":[\"v2_84\"]}}", - "group_0.13.0": "{\"dependencies\":[{\"default_features\":false,\"name\":\"ff\",\"req\":\"^0.13\"},{\"name\":\"memuse\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"rand\",\"optional\":true,\"req\":\"^0.8\"},{\"default_features\":false,\"name\":\"rand_core\",\"req\":\"^0.6\"},{\"name\":\"rand_xorshift\",\"optional\":true,\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2.2.1\"}],\"features\":{\"alloc\":[],\"default\":[\"alloc\"],\"tests\":[\"alloc\",\"rand\",\"rand_xorshift\"],\"wnaf-memuse\":[\"alloc\",\"memuse\"]}}", "gzip-header_1.0.0": "{\"dependencies\":[{\"name\":\"crc32fast\",\"req\":\"^1.2.1\"}],\"features\":{}}", "h2_0.4.13": "{\"dependencies\":[{\"name\":\"atomic-waker\",\"req\":\"^1.0.0\"},{\"name\":\"bytes\",\"req\":\"^1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.10\"},{\"name\":\"fnv\",\"req\":\"^1.0.5\"},{\"default_features\":false,\"name\":\"futures-core\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"futures-sink\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"hex\",\"req\":\"^0.4.3\"},{\"name\":\"http\",\"req\":\"^1\"},{\"features\":[\"std\"],\"name\":\"indexmap\",\"req\":\"^2\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0.3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.4\"},{\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.0\"},{\"name\":\"slab\",\"req\":\"^0.4.2\"},{\"features\":[\"io-util\"],\"name\":\"tokio\",\"req\":\"^1\"},{\"features\":[\"rt-multi-thread\",\"macros\",\"sync\",\"net\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"tokio-rustls\",\"req\":\"^0.26\"},{\"features\":[\"codec\",\"io\"],\"name\":\"tokio-util\",\"req\":\"^0.7.1\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"tracing\",\"req\":\"^0.1.35\"},{\"kind\":\"dev\",\"name\":\"walkdir\",\"req\":\"^2.3.2\"},{\"kind\":\"dev\",\"name\":\"webpki-roots\",\"req\":\"^1\"}],\"features\":{\"stream\":[],\"unstable\":[]}}", "h2_0.4.6": "{\"dependencies\":[{\"name\":\"atomic-waker\",\"req\":\"^1.0.0\"},{\"name\":\"bytes\",\"req\":\"^1\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.10\"},{\"name\":\"fnv\",\"req\":\"^1.0.5\"},{\"default_features\":false,\"name\":\"futures-core\",\"req\":\"^0.3\"},{\"default_features\":false,\"name\":\"futures-sink\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"hex\",\"req\":\"^0.4.3\"},{\"name\":\"http\",\"req\":\"^1\"},{\"features\":[\"std\"],\"name\":\"indexmap\",\"req\":\"^2\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quickcheck\",\"req\":\"^1.0.3\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.4\"},{\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0.0\"},{\"kind\":\"dev\",\"name\":\"serde_json\",\"req\":\"^1.0.0\"},{\"name\":\"slab\",\"req\":\"^0.4.2\"},{\"features\":[\"io-util\"],\"name\":\"tokio\",\"req\":\"^1\"},{\"features\":[\"rt-multi-thread\",\"macros\",\"sync\",\"net\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"kind\":\"dev\",\"name\":\"tokio-rustls\",\"req\":\"^0.26\"},{\"features\":[\"codec\",\"io\"],\"name\":\"tokio-util\",\"req\":\"^0.7.1\"},{\"default_features\":false,\"features\":[\"std\"],\"name\":\"tracing\",\"req\":\"^0.1.35\"},{\"kind\":\"dev\",\"name\":\"walkdir\",\"req\":\"^2.3.2\"},{\"kind\":\"dev\",\"name\":\"webpki-roots\",\"req\":\"^0.26\"}],\"features\":{\"stream\":[],\"unstable\":[]}}", @@ -1282,7 +1276,6 @@ "os_pipe_1.2.3": "{\"dependencies\":[{\"name\":\"libc\",\"req\":\"^0.2.62\",\"target\":\"cfg(not(windows))\"},{\"features\":[\"Win32_Foundation\",\"Win32_System_Pipes\",\"Win32_Security\"],\"name\":\"windows-sys\",\"req\":\">=0.28, <=0.61\",\"target\":\"cfg(windows)\"}],\"features\":{\"io_safety\":[]}}", "outref_0.5.2": "{\"dependencies\":[],\"features\":{}}", "owo-colors_4.3.0": "{\"dependencies\":[{\"name\":\"supports-color\",\"optional\":true,\"req\":\"^3.0.0\"},{\"name\":\"supports-color-2\",\"optional\":true,\"package\":\"supports-color\",\"req\":\"^2.0\"}],\"features\":{\"alloc\":[],\"supports-colors\":[\"dep:supports-color-2\",\"supports-color\"]}}", - "p256_0.13.2": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"blobby\",\"req\":\"^0.3\"},{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.4\"},{\"default_features\":false,\"features\":[\"der\"],\"name\":\"ecdsa-core\",\"optional\":true,\"package\":\"ecdsa\",\"req\":\"^0.16\"},{\"default_features\":false,\"features\":[\"dev\"],\"kind\":\"dev\",\"name\":\"ecdsa-core\",\"package\":\"ecdsa\",\"req\":\"^0.16\"},{\"default_features\":false,\"features\":[\"hazmat\",\"sec1\"],\"name\":\"elliptic-curve\",\"req\":\"^0.13.1\"},{\"name\":\"hex-literal\",\"optional\":true,\"req\":\"^0.4\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"name\":\"primeorder\",\"optional\":true,\"req\":\"^0.13\"},{\"features\":[\"dev\"],\"kind\":\"dev\",\"name\":\"primeorder\",\"req\":\"^0.13\"},{\"kind\":\"dev\",\"name\":\"proptest\",\"req\":\"^1\"},{\"features\":[\"getrandom\"],\"kind\":\"dev\",\"name\":\"rand_core\",\"req\":\"^0.6\"},{\"default_features\":false,\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"sha2\",\"optional\":true,\"req\":\"^0.10\"}],\"features\":{\"alloc\":[\"ecdsa-core?/alloc\",\"elliptic-curve/alloc\"],\"arithmetic\":[\"dep:primeorder\",\"elliptic-curve/arithmetic\"],\"bits\":[\"arithmetic\",\"elliptic-curve/bits\"],\"default\":[\"arithmetic\",\"ecdsa\",\"pem\",\"std\"],\"digest\":[\"ecdsa-core/digest\",\"ecdsa-core/hazmat\"],\"ecdh\":[\"arithmetic\",\"elliptic-curve/ecdh\"],\"ecdsa\":[\"arithmetic\",\"ecdsa-core/signing\",\"ecdsa-core/verifying\",\"sha256\"],\"expose-field\":[\"arithmetic\"],\"hash2curve\":[\"arithmetic\",\"elliptic-curve/hash2curve\"],\"jwk\":[\"elliptic-curve/jwk\"],\"pem\":[\"elliptic-curve/pem\",\"ecdsa-core/pem\",\"pkcs8\"],\"pkcs8\":[\"ecdsa-core?/pkcs8\",\"elliptic-curve/pkcs8\"],\"serde\":[\"ecdsa-core?/serde\",\"elliptic-curve/serde\",\"primeorder?/serde\",\"serdect\"],\"sha256\":[\"digest\",\"sha2\"],\"std\":[\"alloc\",\"ecdsa-core?/std\",\"elliptic-curve/std\"],\"test-vectors\":[\"dep:hex-literal\"],\"voprf\":[\"elliptic-curve/voprf\",\"sha2\"]}}", "parking_2.2.1": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"easy-parallel\",\"req\":\"^3.0.0\"},{\"name\":\"loom\",\"optional\":true,\"req\":\"^0.7\",\"target\":\"cfg(loom)\"}],\"features\":{}}", "parking_lot_0.12.5": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"bincode\",\"req\":\"^1.3.3\"},{\"name\":\"lock_api\",\"req\":\"^0.4.14\"},{\"name\":\"parking_lot_core\",\"req\":\"^0.9.12\"},{\"kind\":\"dev\",\"name\":\"rand\",\"req\":\"^0.8.3\"}],\"features\":{\"arc_lock\":[\"lock_api/arc_lock\"],\"deadlock_detection\":[\"parking_lot_core/deadlock_detection\"],\"default\":[],\"hardware-lock-elision\":[],\"nightly\":[\"parking_lot_core/nightly\",\"lock_api/nightly\"],\"owning_ref\":[\"lock_api/owning_ref\"],\"send_guard\":[],\"serde\":[\"lock_api/serde\"]}}", "parking_lot_core_0.9.12": "{\"dependencies\":[{\"name\":\"backtrace\",\"optional\":true,\"req\":\"^0.3.60\"},{\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"name\":\"libc\",\"req\":\"^0.2.95\",\"target\":\"cfg(unix)\"},{\"name\":\"petgraph\",\"optional\":true,\"req\":\"^0.6.0\"},{\"name\":\"redox_syscall\",\"req\":\"^0.5\",\"target\":\"cfg(target_os = \\\"redox\\\")\"},{\"name\":\"smallvec\",\"req\":\"^1.6.1\"},{\"name\":\"windows-link\",\"req\":\"^0.2.0\",\"target\":\"cfg(windows)\"}],\"features\":{\"deadlock_detection\":[\"petgraph\",\"backtrace\"],\"nightly\":[]}}", @@ -1332,7 +1325,6 @@ "predicates_3.1.3": "{\"dependencies\":[{\"name\":\"anstyle\",\"req\":\"^1.0.0\"},{\"name\":\"difflib\",\"optional\":true,\"req\":\"^0.4\"},{\"name\":\"float-cmp\",\"optional\":true,\"req\":\"^0.10\"},{\"name\":\"normalize-line-endings\",\"optional\":true,\"req\":\"^0.3.0\"},{\"name\":\"predicates-core\",\"req\":\"^1.0\"},{\"kind\":\"dev\",\"name\":\"predicates-tree\",\"req\":\"^1.0\"},{\"name\":\"regex\",\"optional\":true,\"req\":\"^1.0\"}],\"features\":{\"color\":[],\"default\":[\"diff\",\"regex\",\"float-cmp\",\"normalize-line-endings\",\"color\"],\"diff\":[\"dep:difflib\"],\"unstable\":[]}}", "pretty_assertions_1.4.1": "{\"dependencies\":[{\"name\":\"diff\",\"req\":\"^0.1.12\"},{\"name\":\"yansi\",\"req\":\"^1.0.1\"}],\"features\":{\"alloc\":[],\"default\":[\"std\"],\"std\":[],\"unstable\":[]}}", "prettyplease_0.2.37": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"indoc\",\"req\":\"^2\"},{\"default_features\":false,\"name\":\"proc-macro2\",\"req\":\"^1.0.80\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"proc-macro2\",\"req\":\"^1.0.80\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"quote\",\"req\":\"^1.0.35\"},{\"default_features\":false,\"features\":[\"full\"],\"name\":\"syn\",\"req\":\"^2.0.105\"},{\"default_features\":false,\"features\":[\"clone-impls\",\"extra-traits\",\"parsing\",\"printing\",\"visit-mut\"],\"kind\":\"dev\",\"name\":\"syn\",\"req\":\"^2.0.105\"}],\"features\":{\"verbatim\":[\"syn/parsing\"]}}", - "primeorder_0.13.6": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"arithmetic\",\"sec1\"],\"name\":\"elliptic-curve\",\"req\":\"^0.13.7\"},{\"default_features\":false,\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"}],\"features\":{\"alloc\":[\"elliptic-curve/alloc\"],\"dev\":[],\"serde\":[\"elliptic-curve/serde\",\"serdect\"],\"std\":[\"alloc\",\"elliptic-curve/std\"]}}", "proc-macro-crate_3.4.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"proc-macro2\",\"req\":\"^1.0.94\"},{\"kind\":\"dev\",\"name\":\"quote\",\"req\":\"^1.0.39\"},{\"kind\":\"dev\",\"name\":\"syn\",\"req\":\"^2.0.99\"},{\"default_features\":false,\"features\":[\"parse\"],\"name\":\"toml_edit\",\"req\":\"^0.23.2\"}],\"features\":{}}", "proc-macro-error-attr2_2.0.0": "{\"dependencies\":[{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"}],\"features\":{}}", "proc-macro-error2_2.0.1": "{\"dependencies\":[{\"name\":\"proc-macro-error-attr2\",\"req\":\"=2.0.0\"},{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"syn\",\"optional\":true,\"req\":\"^2\"},{\"features\":[\"full\"],\"kind\":\"dev\",\"name\":\"syn\",\"req\":\"^2\"},{\"features\":[\"diff\"],\"kind\":\"dev\",\"name\":\"trybuild\",\"req\":\"^1.0.99\"}],\"features\":{\"default\":[\"syn-error\"],\"nightly\":[],\"syn-error\":[\"dep:syn\"]}}", @@ -1415,7 +1407,6 @@ "reqwest_0.12.28": "{\"dependencies\":[{\"name\":\"base64\",\"req\":\"^0.22\"},{\"kind\":\"dev\",\"name\":\"brotli_crate\",\"package\":\"brotli\",\"req\":\"^8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"bytes\",\"req\":\"^1.2\"},{\"name\":\"cookie_crate\",\"optional\":true,\"package\":\"cookie\",\"req\":\"^0.18.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"cookie_store\",\"optional\":true,\"req\":\"^0.22.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"doc-comment\",\"req\":\"^0.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"encoding_rs\",\"optional\":true,\"req\":\"^0.8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"env_logger\",\"req\":\"^0.10\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"flate2\",\"req\":\"^1.0.13\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"futures-channel\",\"optional\":true,\"req\":\"^0.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"futures-core\",\"req\":\"^0.3.28\"},{\"default_features\":false,\"name\":\"futures-util\",\"optional\":true,\"req\":\"^0.3.28\"},{\"default_features\":false,\"features\":[\"std\",\"alloc\"],\"kind\":\"dev\",\"name\":\"futures-util\",\"req\":\"^0.3.28\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"h2\",\"optional\":true,\"req\":\"^0.4\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"h3\",\"optional\":true,\"req\":\"^0.0.8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"h3-quinn\",\"optional\":true,\"req\":\"^0.0.10\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"tokio\"],\"name\":\"hickory-resolver\",\"optional\":true,\"req\":\"^0.25\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"http\",\"req\":\"^1.1\"},{\"name\":\"http-body\",\"req\":\"^1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"http-body-util\",\"req\":\"^0.1.2\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"http1\",\"client\"],\"name\":\"hyper\",\"req\":\"^1.1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"http1\",\"http2\",\"client\",\"server\"],\"kind\":\"dev\",\"name\":\"hyper\",\"req\":\"^1.1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"http1\",\"tls12\"],\"name\":\"hyper-rustls\",\"optional\":true,\"req\":\"^0.27.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"hyper-tls\",\"optional\":true,\"req\":\"^0.6\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"http1\",\"client\",\"client-legacy\",\"client-proxy\",\"tokio\"],\"name\":\"hyper-util\",\"req\":\"^0.1.12\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"http1\",\"http2\",\"client\",\"client-legacy\",\"server-auto\",\"server-graceful\",\"tokio\"],\"kind\":\"dev\",\"name\":\"hyper-util\",\"req\":\"^0.1.12\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"js-sys\",\"req\":\"^0.3.77\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"kind\":\"dev\",\"name\":\"libc\",\"req\":\"^0\"},{\"name\":\"log\",\"req\":\"^0.4.17\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"mime\",\"optional\":true,\"req\":\"^0.3.16\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"name\":\"mime_guess\",\"optional\":true,\"req\":\"^2.0\"},{\"name\":\"native-tls-crate\",\"optional\":true,\"package\":\"native-tls\",\"req\":\"^0.2.10\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"num_cpus\",\"req\":\"^1.0\"},{\"name\":\"once_cell\",\"optional\":true,\"req\":\"^1.18\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"percent-encoding\",\"req\":\"^2.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2.11\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"rustls\",\"runtime-tokio\"],\"name\":\"quinn\",\"optional\":true,\"req\":\"^0.11.1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"std\",\"tls12\"],\"name\":\"rustls\",\"optional\":true,\"req\":\"^0.23.4\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"rustls-native-certs\",\"optional\":true,\"req\":\"^0.8.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"features\":[\"std\"],\"name\":\"rustls-pki-types\",\"optional\":true,\"req\":\"^1.9.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"serde\",\"req\":\"^1.0\"},{\"features\":[\"derive\"],\"kind\":\"dev\",\"name\":\"serde\",\"req\":\"^1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"serde_json\",\"req\":\"^1.0\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0\"},{\"name\":\"serde_urlencoded\",\"req\":\"^0.7.1\"},{\"features\":[\"futures\"],\"name\":\"sync_wrapper\",\"req\":\"^1.0\"},{\"default_features\":false,\"features\":[\"net\",\"time\"],\"name\":\"tokio\",\"req\":\"^1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"macros\",\"rt-multi-thread\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"tokio-native-tls\",\"optional\":true,\"req\":\"^0.3.0\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"tls12\"],\"name\":\"tokio-rustls\",\"optional\":true,\"req\":\"^0.26\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"io\"],\"name\":\"tokio-util\",\"optional\":true,\"req\":\"^0.7.9\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"retry\",\"timeout\",\"util\"],\"name\":\"tower\",\"req\":\"^0.5.2\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"default_features\":false,\"features\":[\"limit\"],\"kind\":\"dev\",\"name\":\"tower\",\"req\":\"^0.5.2\"},{\"default_features\":false,\"features\":[\"follow-redirect\"],\"name\":\"tower-http\",\"req\":\"^0.6.8\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"tower-service\",\"req\":\"^0.3\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"name\":\"url\",\"req\":\"^2.4\"},{\"name\":\"wasm-bindgen\",\"req\":\"^0.2.89\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"features\":[\"serde-serialize\"],\"kind\":\"dev\",\"name\":\"wasm-bindgen\",\"req\":\"^0.2.89\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"wasm-bindgen-futures\",\"req\":\"^0.4.18\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"wasm-streams\",\"optional\":true,\"req\":\"^0.4\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"features\":[\"AbortController\",\"AbortSignal\",\"Headers\",\"Request\",\"RequestInit\",\"RequestMode\",\"Response\",\"Window\",\"FormData\",\"Blob\",\"BlobPropertyBag\",\"ServiceWorkerGlobalScope\",\"RequestCredentials\",\"File\",\"ReadableStream\",\"RequestCache\"],\"name\":\"web-sys\",\"req\":\"^0.3.28\",\"target\":\"cfg(target_arch = \\\"wasm32\\\")\"},{\"name\":\"webpki-roots\",\"optional\":true,\"req\":\"^1\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"},{\"kind\":\"dev\",\"name\":\"zstd_crate\",\"package\":\"zstd\",\"req\":\"^0.13\",\"target\":\"cfg(not(target_arch = \\\"wasm32\\\"))\"}],\"features\":{\"__rustls\":[\"dep:hyper-rustls\",\"dep:tokio-rustls\",\"dep:rustls\",\"__tls\"],\"__rustls-ring\":[\"hyper-rustls?/ring\",\"tokio-rustls?/ring\",\"rustls?/ring\",\"quinn?/ring\"],\"__tls\":[\"dep:rustls-pki-types\",\"tokio/io-util\"],\"blocking\":[\"dep:futures-channel\",\"futures-channel?/sink\",\"dep:futures-util\",\"futures-util?/io\",\"futures-util?/sink\",\"tokio/sync\"],\"brotli\":[\"tower-http/decompression-br\"],\"charset\":[\"dep:encoding_rs\",\"dep:mime\"],\"cookies\":[\"dep:cookie_crate\",\"dep:cookie_store\"],\"default\":[\"default-tls\",\"charset\",\"http2\",\"system-proxy\"],\"default-tls\":[\"dep:hyper-tls\",\"dep:native-tls-crate\",\"__tls\",\"dep:tokio-native-tls\"],\"deflate\":[\"tower-http/decompression-deflate\"],\"gzip\":[\"tower-http/decompression-gzip\"],\"hickory-dns\":[\"dep:hickory-resolver\",\"dep:once_cell\"],\"http2\":[\"h2\",\"hyper/http2\",\"hyper-util/http2\",\"hyper-rustls?/http2\"],\"http3\":[\"rustls-tls-manual-roots\",\"dep:h3\",\"dep:h3-quinn\",\"dep:quinn\",\"tokio/macros\"],\"json\":[\"dep:serde_json\"],\"macos-system-configuration\":[\"system-proxy\"],\"multipart\":[\"dep:mime_guess\",\"dep:futures-util\"],\"native-tls\":[\"default-tls\"],\"native-tls-alpn\":[\"native-tls\",\"native-tls-crate?/alpn\",\"hyper-tls?/alpn\"],\"native-tls-vendored\":[\"native-tls\",\"native-tls-crate?/vendored\"],\"rustls-tls\":[\"rustls-tls-webpki-roots\"],\"rustls-tls-manual-roots\":[\"rustls-tls-manual-roots-no-provider\",\"__rustls-ring\"],\"rustls-tls-manual-roots-no-provider\":[\"__rustls\"],\"rustls-tls-native-roots\":[\"rustls-tls-native-roots-no-provider\",\"__rustls-ring\"],\"rustls-tls-native-roots-no-provider\":[\"dep:rustls-native-certs\",\"hyper-rustls?/native-tokio\",\"__rustls\"],\"rustls-tls-no-provider\":[\"rustls-tls-manual-roots-no-provider\"],\"rustls-tls-webpki-roots\":[\"rustls-tls-webpki-roots-no-provider\",\"__rustls-ring\"],\"rustls-tls-webpki-roots-no-provider\":[\"dep:webpki-roots\",\"hyper-rustls?/webpki-tokio\",\"__rustls\"],\"socks\":[],\"stream\":[\"tokio/fs\",\"dep:futures-util\",\"dep:tokio-util\",\"dep:wasm-streams\"],\"system-proxy\":[\"hyper-util/client-proxy-system\"],\"trust-dns\":[],\"zstd\":[\"tower-http/decompression-zstd\"]}}", "resb_0.1.1": "{\"dependencies\":[{\"name\":\"indexmap\",\"optional\":true,\"req\":\"^2.0.0\"},{\"default_features\":false,\"name\":\"log\",\"optional\":true,\"req\":\"^0.4.17\"},{\"name\":\"nom\",\"optional\":true,\"req\":\"^7.0.0\"},{\"default_features\":false,\"name\":\"potential_utf\",\"req\":\"^0.1.3\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serde_core\",\"req\":\"^1.0.220\"}],\"features\":{\"default\":[],\"logging\":[\"dep:log\"],\"serialize\":[\"std\"],\"std\":[],\"text\":[\"dep:indexmap\",\"dep:nom\",\"std\"]}}", "resolv-conf_0.7.6": "{\"dependencies\":[],\"features\":{\"system\":[]}}", - "rfc6979_0.4.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.3\"},{\"default_features\":false,\"features\":[\"reset\"],\"name\":\"hmac\",\"req\":\"^0.12\"},{\"kind\":\"dev\",\"name\":\"sha2\",\"req\":\"^0.10\"},{\"default_features\":false,\"name\":\"subtle\",\"req\":\"^2\"}],\"features\":{}}", "ring_0.17.14": "{\"dependencies\":[{\"default_features\":false,\"kind\":\"build\",\"name\":\"cc\",\"req\":\"^1.2.8\"},{\"default_features\":false,\"name\":\"cfg-if\",\"req\":\"^1.0.0\"},{\"name\":\"getrandom\",\"req\":\"^0.2.10\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.148\",\"target\":\"cfg(all(any(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), all(target_arch = \\\"arm\\\", target_endian = \\\"little\\\")), any(target_os = \\\"android\\\", target_os = \\\"linux\\\")))\"},{\"default_features\":false,\"name\":\"libc\",\"req\":\"^0.2.155\",\"target\":\"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_vendor = \\\"apple\\\", any(target_os = \\\"ios\\\", target_os = \\\"macos\\\", target_os = \\\"tvos\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\")))\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"libc\",\"req\":\"^0.2.148\",\"target\":\"cfg(any(unix, windows, target_os = \\\"wasi\\\"))\"},{\"name\":\"untrusted\",\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"std\"],\"kind\":\"dev\",\"name\":\"wasm-bindgen-test\",\"req\":\"^0.3.37\",\"target\":\"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"unknown\\\"))\"},{\"features\":[\"Win32_Foundation\",\"Win32_System_Threading\"],\"name\":\"windows-sys\",\"req\":\"^0.52\",\"target\":\"cfg(all(all(target_arch = \\\"aarch64\\\", target_endian = \\\"little\\\"), target_os = \\\"windows\\\"))\"}],\"features\":{\"alloc\":[],\"default\":[\"alloc\",\"dev_urandom_fallback\"],\"dev_urandom_fallback\":[],\"less-safe-getrandom-custom-or-rdrand\":[],\"less-safe-getrandom-espidf\":[],\"slow_tests\":[],\"std\":[\"alloc\"],\"test_logging\":[],\"unstable-testing-arm-no-hw\":[],\"unstable-testing-arm-no-neon\":[],\"wasm32_unknown_unknown_js\":[\"getrandom/js\"]}}", "rmcp-macros_0.15.0": "{\"dependencies\":[{\"name\":\"darling\",\"req\":\"^0.23\"},{\"name\":\"proc-macro2\",\"req\":\"^1\"},{\"name\":\"quote\",\"req\":\"^1\"},{\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"features\":[\"full\"],\"name\":\"syn\",\"req\":\"^2\"}],\"features\":{}}", "rmcp_0.15.0": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"anyhow\",\"req\":\"^1.0\"},{\"name\":\"async-trait\",\"req\":\"^0.1.89\"},{\"kind\":\"dev\",\"name\":\"async-trait\",\"req\":\"^0.1\"},{\"name\":\"axum\",\"optional\":true,\"req\":\"^0.8\"},{\"name\":\"base64\",\"optional\":true,\"req\":\"^0.22\"},{\"name\":\"bytes\",\"optional\":true,\"req\":\"^1\"},{\"default_features\":false,\"features\":[\"serde\",\"clock\",\"std\",\"oldtime\"],\"name\":\"chrono\",\"req\":\"^0.4.38\",\"target\":\"cfg(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\"))\"},{\"features\":[\"serde\"],\"name\":\"chrono\",\"req\":\"^0.4.38\",\"target\":\"cfg(not(all(target_family = \\\"wasm\\\", target_os = \\\"unknown\\\")))\"},{\"name\":\"futures\",\"req\":\"^0.3\"},{\"name\":\"http\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"http-body\",\"optional\":true,\"req\":\"^1\"},{\"name\":\"http-body-util\",\"optional\":true,\"req\":\"^0.1\"},{\"default_features\":false,\"features\":[\"reqwest\"],\"name\":\"oauth2\",\"optional\":true,\"req\":\"^5.0\"},{\"name\":\"pastey\",\"optional\":true,\"req\":\"^0.2.0\"},{\"name\":\"pin-project-lite\",\"req\":\"^0.2\"},{\"features\":[\"tokio1\"],\"name\":\"process-wrap\",\"optional\":true,\"req\":\"^9.0\"},{\"name\":\"rand\",\"optional\":true,\"req\":\"^0.9\"},{\"default_features\":false,\"features\":[\"json\",\"stream\"],\"name\":\"reqwest\",\"optional\":true,\"req\":\"^0.12\"},{\"name\":\"rmcp-macros\",\"optional\":true,\"req\":\"^0.15.0\"},{\"features\":[\"chrono04\"],\"name\":\"schemars\",\"optional\":true,\"req\":\"^1.0\"},{\"features\":[\"chrono04\"],\"kind\":\"dev\",\"name\":\"schemars\",\"req\":\"^1.1.0\"},{\"features\":[\"derive\",\"rc\"],\"name\":\"serde\",\"req\":\"^1.0\"},{\"name\":\"serde_json\",\"req\":\"^1.0\"},{\"name\":\"sse-stream\",\"optional\":true,\"req\":\"^0.2\"},{\"name\":\"thiserror\",\"req\":\"^2\"},{\"features\":[\"sync\",\"macros\",\"rt\",\"time\"],\"name\":\"tokio\",\"req\":\"^1\"},{\"features\":[\"full\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"name\":\"tokio-stream\",\"optional\":true,\"req\":\"^0.1\"},{\"name\":\"tokio-util\",\"req\":\"^0.7\"},{\"name\":\"tower-service\",\"optional\":true,\"req\":\"^0.3\"},{\"name\":\"tracing\",\"req\":\"^0.1\"},{\"features\":[\"env-filter\",\"std\",\"fmt\"],\"kind\":\"dev\",\"name\":\"tracing-subscriber\",\"req\":\"^0.3\"},{\"name\":\"url\",\"optional\":true,\"req\":\"^2.4\"},{\"features\":[\"v4\"],\"name\":\"uuid\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"__reqwest\":[\"dep:reqwest\"],\"auth\":[\"dep:oauth2\",\"__reqwest\",\"dep:url\"],\"client\":[\"dep:tokio-stream\"],\"client-side-sse\":[\"dep:sse-stream\",\"dep:http\"],\"default\":[\"base64\",\"macros\",\"server\"],\"elicitation\":[\"dep:url\"],\"macros\":[\"dep:rmcp-macros\",\"dep:pastey\"],\"reqwest\":[\"__reqwest\",\"reqwest?/rustls-tls\"],\"reqwest-native-tls\":[\"__reqwest\",\"reqwest?/native-tls\"],\"reqwest-tls-no-provider\":[\"__reqwest\",\"reqwest?/rustls-tls-no-provider\"],\"schemars\":[\"dep:schemars\"],\"server\":[\"transport-async-rw\",\"dep:schemars\",\"dep:pastey\"],\"server-side-http\":[\"uuid\",\"dep:rand\",\"dep:tokio-stream\",\"dep:http\",\"dep:http-body\",\"dep:http-body-util\",\"dep:bytes\",\"dep:sse-stream\",\"dep:axum\",\"tower\"],\"tower\":[\"dep:tower-service\"],\"transport-async-rw\":[\"tokio/io-util\",\"tokio-util/codec\"],\"transport-child-process\":[\"transport-async-rw\",\"tokio/process\",\"dep:process-wrap\"],\"transport-io\":[\"transport-async-rw\",\"tokio/io-std\"],\"transport-streamable-http-client\":[\"client-side-sse\",\"transport-worker\"],\"transport-streamable-http-client-reqwest\":[\"transport-streamable-http-client\",\"__reqwest\"],\"transport-streamable-http-server\":[\"transport-streamable-http-server-session\",\"server-side-http\",\"transport-worker\"],\"transport-streamable-http-server-session\":[\"transport-async-rw\",\"dep:tokio-stream\"],\"transport-worker\":[\"dep:tokio-stream\"]}}", @@ -1458,7 +1449,6 @@ "scratch_1.0.9": "{\"dependencies\":[],\"features\":{}}", "scrypt_0.11.0": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"rand_core\"],\"name\":\"password-hash\",\"optional\":true,\"req\":\"^0.5\"},{\"features\":[\"rand_core\"],\"kind\":\"dev\",\"name\":\"password-hash\",\"req\":\"^0.5\"},{\"name\":\"pbkdf2\",\"req\":\"^0.12\"},{\"default_features\":false,\"name\":\"salsa20\",\"req\":\"^0.10.2\"},{\"default_features\":false,\"name\":\"sha2\",\"req\":\"^0.10\"}],\"features\":{\"default\":[\"simple\",\"std\"],\"simple\":[\"password-hash\"],\"std\":[\"password-hash/std\"]}}", "sdd_3.0.10": "{\"dependencies\":[{\"kind\":\"dev\",\"name\":\"criterion\",\"req\":\"^0.6\"},{\"name\":\"loom\",\"optional\":true,\"req\":\"^0.7\"},{\"kind\":\"dev\",\"name\":\"static_assertions\",\"req\":\"^1.1\"}],\"features\":{}}", - "sec1_0.7.3": "{\"dependencies\":[{\"default_features\":false,\"name\":\"base16ct\",\"optional\":true,\"req\":\"^0.2\"},{\"features\":[\"oid\"],\"name\":\"der\",\"optional\":true,\"req\":\"^0.7\"},{\"default_features\":false,\"name\":\"generic-array\",\"optional\":true,\"req\":\"^0.14.7\"},{\"kind\":\"dev\",\"name\":\"hex-literal\",\"req\":\"^0.4\"},{\"default_features\":false,\"name\":\"pkcs8\",\"optional\":true,\"req\":\"^0.10\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serdect\",\"optional\":true,\"req\":\"^0.2\"},{\"default_features\":false,\"name\":\"subtle\",\"optional\":true,\"req\":\"^2\"},{\"kind\":\"dev\",\"name\":\"tempfile\",\"req\":\"^3\"},{\"default_features\":false,\"name\":\"zeroize\",\"optional\":true,\"req\":\"^1\"}],\"features\":{\"alloc\":[\"der?/alloc\",\"pkcs8?/alloc\",\"zeroize?/alloc\"],\"default\":[\"der\",\"point\"],\"der\":[\"dep:der\",\"zeroize\"],\"pem\":[\"alloc\",\"der/pem\",\"pkcs8/pem\"],\"point\":[\"dep:base16ct\",\"dep:generic-array\"],\"serde\":[\"dep:serdect\"],\"std\":[\"alloc\",\"der?/std\"],\"zeroize\":[\"dep:zeroize\",\"der?/zeroize\"]}}", "seccompiler_0.5.0": "{\"dependencies\":[{\"name\":\"libc\",\"req\":\"^0.2.153\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1.0.27\"},{\"name\":\"serde_json\",\"optional\":true,\"req\":\"^1.0.9\"}],\"features\":{\"json\":[\"serde\",\"serde_json\"]}}", "secrecy_0.10.3": "{\"dependencies\":[{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"serde\",\"optional\":true,\"req\":\"^1\"},{\"default_features\":false,\"features\":[\"alloc\"],\"name\":\"zeroize\",\"req\":\"^1.6\"}],\"features\":{}}", "secret-service_4.0.0": "{\"dependencies\":[{\"name\":\"aes\",\"optional\":true,\"req\":\"^0.8\"},{\"features\":[\"block-padding\",\"alloc\"],\"name\":\"cbc\",\"optional\":true,\"req\":\"^0.1\"},{\"name\":\"futures-util\",\"req\":\"^0.3\"},{\"name\":\"generic-array\",\"req\":\"^0.14\"},{\"name\":\"hkdf\",\"optional\":true,\"req\":\"^0.12.0\"},{\"name\":\"num\",\"req\":\"^0.4.0\"},{\"name\":\"once_cell\",\"req\":\"^1\"},{\"name\":\"openssl\",\"optional\":true,\"req\":\"^0.10.40\"},{\"name\":\"rand\",\"req\":\"^0.8.1\"},{\"features\":[\"derive\"],\"name\":\"serde\",\"req\":\"^1.0.103\"},{\"name\":\"sha2\",\"optional\":true,\"req\":\"^0.10.0\"},{\"default_features\":false,\"kind\":\"dev\",\"name\":\"test-with\",\"req\":\"^0.8\"},{\"features\":[\"rt\",\"macros\"],\"kind\":\"dev\",\"name\":\"tokio\",\"req\":\"^1\"},{\"default_features\":false,\"name\":\"zbus\",\"req\":\"^4\"}],\"features\":{\"crypto-openssl\":[\"dep:openssl\"],\"crypto-rust\":[\"dep:aes\",\"dep:cbc\",\"dep:sha2\",\"dep:hkdf\"],\"rt-async-io-crypto-openssl\":[\"zbus/async-io\",\"crypto-openssl\"],\"rt-async-io-crypto-rust\":[\"zbus/async-io\",\"crypto-rust\"],\"rt-tokio-crypto-openssl\":[\"zbus/tokio\",\"crypto-openssl\"],\"rt-tokio-crypto-rust\":[\"zbus/tokio\",\"crypto-rust\"]}}", diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index c656a791a..fe156e07b 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1180,12 +1180,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base64" version = "0.21.7" @@ -3609,16 +3603,11 @@ dependencies = [ "codex-rollout", "codex-state", "pretty_assertions", - "prost 0.14.3", "serde", "serde_json", "tempfile", "thiserror 2.0.18", "tokio", - "tokio-stream", - "tonic", - "tonic-prost", - "tonic-prost-build", "tracing", "uuid", ] @@ -4425,18 +4414,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-common" version = "0.1.7" @@ -5150,20 +5127,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - [[package]] name = "ed25519" version = "2.2.3" @@ -5197,26 +5160,6 @@ dependencies = [ "serde", ] -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - [[package]] name = "ena" version = "0.14.3" @@ -5470,16 +5413,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "fiat-crypto" version = "0.2.9" @@ -6874,17 +6807,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "gzip-header" version = "1.0.0" @@ -9384,18 +9306,6 @@ dependencies = [ "supports-color 3.0.2", ] -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - [[package]] name = "parking" version = "2.2.1" @@ -9825,15 +9735,6 @@ dependencies = [ "syn 2.0.114", ] -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -10784,16 +10685,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - [[package]] name = "ring" version = "0.17.14" @@ -11253,20 +11144,6 @@ version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - [[package]] name = "seccompiler" version = "0.5.0" diff --git a/codex-rs/app-server/tests/suite/conversation_summary.rs b/codex-rs/app-server/tests/suite/conversation_summary.rs index c06ff8599..754d1f946 100644 --- a/codex-rs/app-server/tests/suite/conversation_summary.rs +++ b/codex-rs/app-server/tests/suite/conversation_summary.rs @@ -12,7 +12,6 @@ use codex_app_server_protocol::GetConversationSummaryParams; use codex_app_server_protocol::GetConversationSummaryResponse; use codex_app_server_protocol::InitializeCapabilities; use codex_app_server_protocol::InitializeParams; -use codex_app_server_protocol::JSONRPCError; use codex_app_server_protocol::JSONRPCResponse; use codex_app_server_protocol::RequestId; use codex_arg0::Arg0DispatchPaths; @@ -46,7 +45,6 @@ const CREATED_AT_RFC3339: &str = "2025-01-02T12:00:00.000Z"; const UPDATED_AT_RFC3339: &str = "2025-01-02T12:00:00.000Z"; const PREVIEW: &str = "Summarize this conversation"; const MODEL_PROVIDER: &str = "openai"; -const INVALID_REQUEST_ERROR_CODE: i64 = -32600; fn expected_summary(conversation_id: ThreadId, path: PathBuf) -> ConversationSummary { ConversationSummary { @@ -114,37 +112,6 @@ async fn get_conversation_summary_by_thread_id_reads_rollout() -> Result<()> { Ok(()) } -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn get_conversation_summary_by_rollout_path_rejects_remote_thread_store() -> Result<()> { - let codex_home = TempDir::new()?; - std::fs::write( - codex_home.path().join("config.toml"), - r#"experimental_thread_store_endpoint = "http://127.0.0.1:1" -"#, - )?; - - let mut mcp = McpProcess::new(codex_home.path()).await?; - timeout(DEFAULT_READ_TIMEOUT, mcp.initialize()).await??; - - let request_id = mcp - .send_get_conversation_summary_request(GetConversationSummaryParams::RolloutPath { - rollout_path: PathBuf::from("sessions/2025/01/02/rollout.jsonl"), - }) - .await?; - let error: JSONRPCError = timeout( - DEFAULT_READ_TIMEOUT, - mcp.read_stream_until_error_message(RequestId::Integer(request_id)), - ) - .await??; - - assert_eq!(error.error.code, INVALID_REQUEST_ERROR_CODE); - assert_eq!( - error.error.message, - "rollout path queries are only supported with the local thread store" - ); - Ok(()) -} - #[tokio::test] async fn get_conversation_summary_by_thread_id_reads_pathless_store_thread() -> Result<()> { let codex_home = TempDir::new()?; diff --git a/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs b/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs index b04eb12a4..e5c0b2c53 100644 --- a/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs +++ b/codex-rs/app-server/tests/suite/v2/remote_thread_store.rs @@ -3,9 +3,8 @@ //! //! The app-server startup path should honor `experimental_thread_store` //! by routing all thread persistence through the configured store. This suite uses -//! the thread-store crate's test-only in-memory store, which exercises the same -//! config-driven selection path as a remote store without requiring the real gRPC -//! service. +//! the thread-store crate's test-only in-memory store to exercise the non-local +//! config-driven selection path without touching local rollout or sqlite storage. //! //! The important failure mode is accidentally materializing local persistence //! while a non-local store is configured. After `thread/start` and a simple turn, diff --git a/codex-rs/app-server/tests/suite/v2/thread_fork.rs b/codex-rs/app-server/tests/suite/v2/thread_fork.rs index 8394f9839..3eb262bd2 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_fork.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_fork.rs @@ -33,7 +33,6 @@ use pretty_assertions::assert_eq; use serde_json::Value; use serde_json::json; use std::path::Path; -use std::path::PathBuf; use tempfile::TempDir; use tokio::time::timeout; use wiremock::Mock; @@ -51,7 +50,6 @@ use super::analytics::wait_for_analytics_payload; const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(25); #[cfg(not(windows))] const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10); -const INTERNAL_ERROR_CODE: i64 = -32603; #[tokio::test] async fn thread_fork_creates_new_thread_and_emits_started() -> Result<()> { @@ -269,37 +267,6 @@ async fn thread_fork_can_load_source_by_path() -> Result<()> { Ok(()) } -#[tokio::test] -async fn thread_fork_by_path_uses_remote_thread_store_error() -> Result<()> { - let server = create_mock_responses_server_repeating_assistant("Done").await; - let codex_home = TempDir::new()?; - create_config_toml_with_remote_thread_store(codex_home.path(), &server.uri())?; - - let mut mcp = McpProcess::new(codex_home.path()).await?; - timeout(DEFAULT_READ_TIMEOUT, mcp.initialize()).await??; - - let fork_id = mcp - .send_thread_fork_request(ThreadForkParams { - thread_id: "not-a-valid-thread-id".to_string(), - path: Some(PathBuf::from("sessions/2025/01/05/rollout.jsonl")), - ..Default::default() - }) - .await?; - let fork_err: JSONRPCError = timeout( - DEFAULT_READ_TIMEOUT, - mcp.read_stream_until_error_message(RequestId::Integer(fork_id)), - ) - .await??; - - assert_eq!(fork_err.error.code, INTERNAL_ERROR_CODE); - assert_eq!( - fork_err.error.message, - "failed to read thread: thread-store internal error: remote thread store does not support read_thread_by_rollout_path" - ); - - Ok(()) -} - #[tokio::test] async fn thread_fork_emits_restored_token_usage_before_next_turn() -> Result<()> { let server = create_mock_responses_server_repeating_assistant("Done").await; @@ -779,33 +746,6 @@ stream_max_retries = 0 ) } -fn create_config_toml_with_remote_thread_store( - codex_home: &Path, - server_uri: &str, -) -> std::io::Result<()> { - let config_toml = codex_home.join("config.toml"); - std::fs::write( - config_toml, - format!( - r#" -model = "mock-model" -approval_policy = "never" -sandbox_mode = "read-only" -experimental_thread_store_endpoint = "http://127.0.0.1:1" - -model_provider = "mock_provider" - -[model_providers.mock_provider] -name = "Mock provider for test" -base_url = "{server_uri}/v1" -wire_api = "responses" -request_max_retries = 0 -stream_max_retries = 0 -"# - ), - ) -} - fn create_config_toml_with_chatgpt_base_url( codex_home: &Path, server_uri: &str, diff --git a/codex-rs/app-server/tests/suite/v2/thread_resume.rs b/codex-rs/app-server/tests/suite/v2/thread_resume.rs index 7d7de2551..2b0eafd00 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_resume.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_resume.rs @@ -95,7 +95,6 @@ use super::analytics::wait_for_analytics_payload; const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(25); #[cfg(not(windows))] const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10); -const INTERNAL_ERROR_CODE: i64 = -32603; const CODEX_5_2_INSTRUCTIONS_TEMPLATE_DEFAULT: &str = "You are Codex, a coding agent based on GPT-5. You and the user share the same workspace and collaborate to achieve the user's goals."; fn normalized_existing_path(path: impl AsRef) -> Result { @@ -745,37 +744,6 @@ async fn thread_goal_clear_deletes_goal_and_notifies() -> Result<()> { Ok(()) } -#[tokio::test] -async fn thread_resume_by_path_uses_remote_thread_store_error() -> Result<()> { - let server = create_mock_responses_server_repeating_assistant("Done").await; - let codex_home = TempDir::new()?; - create_config_toml_with_remote_thread_store(codex_home.path(), &server.uri())?; - - let mut mcp = McpProcess::new(codex_home.path()).await?; - timeout(DEFAULT_READ_TIMEOUT, mcp.initialize()).await??; - - let resume_id = mcp - .send_thread_resume_request(ThreadResumeParams { - thread_id: "ignored-when-path-is-present".to_string(), - path: Some(PathBuf::from("sessions/2025/01/05/rollout.jsonl")), - ..Default::default() - }) - .await?; - let resume_err: JSONRPCError = timeout( - DEFAULT_READ_TIMEOUT, - mcp.read_stream_until_error_message(RequestId::Integer(resume_id)), - ) - .await??; - - assert_eq!(resume_err.error.code, INTERNAL_ERROR_CODE); - assert_eq!( - resume_err.error.message, - "failed to read thread: thread-store internal error: remote thread store does not support read_thread_by_rollout_path" - ); - - Ok(()) -} - #[tokio::test] async fn thread_resume_emits_restored_token_usage_before_next_turn() -> Result<()> { let server = create_mock_responses_server_repeating_assistant("Done").await; @@ -2928,36 +2896,6 @@ stream_max_retries = 0 ) } -fn create_config_toml_with_remote_thread_store( - codex_home: &std::path::Path, - server_uri: &str, -) -> std::io::Result<()> { - let config_toml = codex_home.join("config.toml"); - std::fs::write( - config_toml, - format!( - r#" -model = "gpt-5.3-codex" -approval_policy = "never" -sandbox_mode = "read-only" -experimental_thread_store_endpoint = "http://127.0.0.1:1" - -model_provider = "mock_provider" - -[features] -personality = true - -[model_providers.mock_provider] -name = "Mock provider for test" -base_url = "{server_uri}/v1" -wire_api = "responses" -request_max_retries = 0 -stream_max_retries = 0 -"# - ), - ) -} - fn create_config_toml_with_chatgpt_base_url( codex_home: &std::path::Path, server_uri: &str, diff --git a/codex-rs/config/src/config_toml.rs b/codex-rs/config/src/config_toml.rs index d2eeaf927..0a82eaf53 100644 --- a/codex-rs/config/src/config_toml.rs +++ b/codex-rs/config/src/config_toml.rs @@ -345,14 +345,15 @@ pub struct ConfigToml { /// active. pub experimental_realtime_start_instructions: Option, - /// Experimental / do not use. When set, app-server uses a remote thread - /// store at this endpoint instead of the local filesystem/SQLite store. - pub experimental_thread_store_endpoint: Option, - /// Experimental / do not use. When set, app-server fetches thread-scoped /// config from a remote service at this endpoint. pub experimental_thread_config_endpoint: Option, + /// Removed. Former remote thread-store endpoint setting kept only so we can + /// fail fast instead of silently falling back to local persistence. + #[schemars(skip)] + pub experimental_thread_store_endpoint: Option, + /// Experimental / do not use. Selects the thread store implementation. pub experimental_thread_store: Option, pub projects: Option>, @@ -488,9 +489,6 @@ pub struct DebugConfigLockToml { #[serde(tag = "type", rename_all = "snake_case")] pub enum ThreadStoreToml { Local {}, - Remote { - endpoint: String, - }, #[schemars(skip)] InMemory { id: String, diff --git a/codex-rs/core/config.schema.json b/codex-rs/core/config.schema.json index c50c4d97a..ecbd73093 100644 --- a/codex-rs/core/config.schema.json +++ b/codex-rs/core/config.schema.json @@ -2355,24 +2355,6 @@ "type" ], "type": "object" - }, - { - "properties": { - "endpoint": { - "type": "string" - }, - "type": { - "enum": [ - "remote" - ], - "type": "string" - } - }, - "required": [ - "endpoint", - "type" - ], - "type": "object" } ] }, @@ -3932,10 +3914,6 @@ ], "description": "Experimental / do not use. Selects the thread store implementation." }, - "experimental_thread_store_endpoint": { - "description": "Experimental / do not use. When set, app-server uses a remote thread store at this endpoint instead of the local filesystem/SQLite store.", - "type": "string" - }, "experimental_use_freeform_apply_patch": { "type": "boolean" }, diff --git a/codex-rs/core/src/agent/control.rs b/codex-rs/core/src/agent/control.rs index f39c9a182..079ee61f0 100644 --- a/codex-rs/core/src/agent/control.rs +++ b/codex-rs/core/src/agent/control.rs @@ -717,11 +717,13 @@ impl AgentControl { let result = if let Ok(thread) = state.get_thread(agent_id).await { thread.codex.session.ensure_rollout_materialized().await; thread.codex.session.flush_rollout().await?; - if matches!(thread.agent_status().await, AgentStatus::Shutdown) { + let result = if matches!(thread.agent_status().await, AgentStatus::Shutdown) { Ok(String::new()) } else { state.send_op(agent_id, Op::Shutdown {}).await - } + }; + thread.wait_until_terminated().await; + result } else { state.send_op(agent_id, Op::Shutdown {}).await }; diff --git a/codex-rs/core/src/config/config_tests.rs b/codex-rs/core/src/config/config_tests.rs index 368ad769d..25f6697c7 100644 --- a/codex-rs/core/src/config/config_tests.rs +++ b/codex-rs/core/src/config/config_tests.rs @@ -2278,6 +2278,27 @@ async fn runtime_config_resolves_terminal_resize_reflow_defaults_and_overrides() ); } +#[tokio::test] +async fn legacy_remote_thread_store_endpoint_is_rejected() { + let cfg: ConfigToml = + toml::from_str(r#"experimental_thread_store_endpoint = "https://example.com""#) + .expect("legacy remote thread-store endpoint should still deserialize"); + + let err = Config::load_from_base_config_with_overrides( + cfg, + ConfigOverrides::default(), + tempdir().expect("tempdir").abs(), + ) + .await + .expect_err("legacy remote thread-store endpoint should be rejected at load time"); + + assert!( + err.to_string() + .contains("experimental_thread_store_endpoint") + ); + assert!(err.to_string().contains("no longer supported")); +} + #[test] fn profile_tui_rejects_unsupported_settings() { let err = toml::from_str::( diff --git a/codex-rs/core/src/config/mod.rs b/codex-rs/core/src/config/mod.rs index cf0ccbe54..e27002aef 100644 --- a/codex-rs/core/src/config/mod.rs +++ b/codex-rs/core/src/config/mod.rs @@ -380,8 +380,6 @@ pub enum ThreadStoreConfig { /// Persist threads locally using rollout JSONL files and sqlite metadata. #[default] Local, - /// Persist threads through the remote thread-store service. - Remote { endpoint: String }, /// In-memory thread store for test and debug configurations. InMemory { id: String }, } @@ -1733,17 +1731,11 @@ fn resolve_tool_suggest_config_from_config( } } -fn thread_store_config( - thread_store: Option, - legacy_remote_endpoint: Option, -) -> ThreadStoreConfig { +fn thread_store_config(thread_store: Option) -> ThreadStoreConfig { match thread_store { Some(ThreadStoreToml::Local {}) => ThreadStoreConfig::Local, - Some(ThreadStoreToml::Remote { endpoint }) => ThreadStoreConfig::Remote { endpoint }, Some(ThreadStoreToml::InMemory { id }) => ThreadStoreConfig::InMemory { id }, - None => legacy_remote_endpoint.map_or(ThreadStoreConfig::Local, |endpoint| { - ThreadStoreConfig::Remote { endpoint } - }), + None => ThreadStoreConfig::Local, } } @@ -2097,6 +2089,13 @@ impl Config { ) -> std::io::Result { // Keep the large config-construction future off small test thread stacks. Box::pin(async move { + if cfg.experimental_thread_store_endpoint.is_some() { + return Err(std::io::Error::new( + std::io::ErrorKind::InvalidInput, + "`experimental_thread_store_endpoint` is no longer supported; remove it from config.toml", + )); + } + validate_model_providers(&cfg.model_providers) .map_err(|message| std::io::Error::new(std::io::ErrorKind::InvalidInput, message))?; // Ensure that every field of ConfigRequirements is applied to the final @@ -3122,10 +3121,7 @@ impl Config { experimental_realtime_ws_startup_context: cfg.experimental_realtime_ws_startup_context, experimental_realtime_start_instructions: cfg.experimental_realtime_start_instructions, experimental_thread_config_endpoint: cfg.experimental_thread_config_endpoint, - experimental_thread_store: thread_store_config( - cfg.experimental_thread_store, - cfg.experimental_thread_store_endpoint, - ), + experimental_thread_store: thread_store_config(cfg.experimental_thread_store), forced_chatgpt_workspace_id, forced_login_method, include_apply_patch_tool: include_apply_patch_tool_flag, diff --git a/codex-rs/core/src/thread_manager.rs b/codex-rs/core/src/thread_manager.rs index a19832717..003f2786b 100644 --- a/codex-rs/core/src/thread_manager.rs +++ b/codex-rs/core/src/thread_manager.rs @@ -57,7 +57,6 @@ use codex_thread_store::LocalThreadStore; use codex_thread_store::LocalThreadStoreConfig; use codex_thread_store::ReadThreadByRolloutPathParams; use codex_thread_store::ReadThreadParams; -use codex_thread_store::RemoteThreadStore; use codex_thread_store::StoredThread; use codex_thread_store::ThreadStore; use codex_thread_store::ThreadStoreError; @@ -277,7 +276,6 @@ pub fn thread_store_from_config( LocalThreadStoreConfig::from_config(config), state_db, )), - ThreadStoreConfig::Remote { endpoint } => Arc::new(RemoteThreadStore::new(endpoint)), ThreadStoreConfig::InMemory { id } => InMemoryThreadStore::for_id(id), } } diff --git a/codex-rs/thread-store/Cargo.toml b/codex-rs/thread-store/Cargo.toml index 4da4c1d37..0f8e83fe6 100644 --- a/codex-rs/thread-store/Cargo.toml +++ b/codex-rs/thread-store/Cargo.toml @@ -9,10 +9,6 @@ name = "codex_thread_store" path = "src/lib.rs" doctest = false -[[example]] -name = "generate-proto" -path = "examples/generate-proto.rs" - [lints] workspace = true @@ -23,20 +19,14 @@ codex-git-utils = { workspace = true } codex-protocol = { workspace = true } codex-rollout = { workspace = true } codex-state = { workspace = true } -prost = "0.14.3" serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } -tonic = { workspace = true } -tonic-prost = { workspace = true } tracing = { workspace = true } [dev-dependencies] pretty_assertions = { workspace = true } tempfile = { workspace = true } tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } -tokio-stream = { workspace = true, features = ["net"] } -tonic = { workspace = true, features = ["router", "transport"] } -tonic-prost-build = { version = "=0.14.3", default-features = false, features = ["transport"] } uuid = { workspace = true } diff --git a/codex-rs/thread-store/examples/generate-proto.rs b/codex-rs/thread-store/examples/generate-proto.rs deleted file mode 100644 index 0b4afb54f..000000000 --- a/codex-rs/thread-store/examples/generate-proto.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::path::PathBuf; - -fn main() -> Result<(), Box> { - let Some(proto_dir_arg) = std::env::args().nth(1) else { - eprintln!("Usage: generate-proto "); - std::process::exit(1); - }; - - let proto_dir = PathBuf::from(proto_dir_arg); - let proto_file = proto_dir.join("codex.thread_store.v1.proto"); - - tonic_prost_build::configure() - .build_client(true) - .build_server(true) - .out_dir(&proto_dir) - .compile_protos(&[proto_file], &[proto_dir])?; - - Ok(()) -} diff --git a/codex-rs/thread-store/scripts/generate-proto.sh b/codex-rs/thread-store/scripts/generate-proto.sh deleted file mode 100755 index 4045467ca..000000000 --- a/codex-rs/thread-store/scripts/generate-proto.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -repo_root="$(cd "$script_dir/../../.." && pwd)" -proto_dir="$repo_root/codex-rs/thread-store/src/remote/proto" -generated="$proto_dir/codex.thread_store.v1.rs" -tmpdir="$(mktemp -d)" - -cleanup() { - rm -rf "$tmpdir" -} -trap cleanup EXIT - -( - cd "$repo_root/codex-rs" - CARGO_TARGET_DIR="$tmpdir/target" cargo run \ - -p codex-thread-store \ - --example generate-proto \ - -- "$proto_dir" -) - -if ! sed -n '2p' "$generated" | grep -q 'clippy::trivially_copy_pass_by_ref'; then - { - sed -n '1p' "$generated" - printf '#![allow(clippy::trivially_copy_pass_by_ref)]\n' - sed '1d' "$generated" - } > "$tmpdir/generated.rs" - mv "$tmpdir/generated.rs" "$generated" -fi - -rustfmt --edition 2024 "$generated" - -awk ' - NR == 3 && previous ~ /clippy::trivially_copy_pass_by_ref/ && $0 != "" { print "" } - { print; previous = $0 } -' "$generated" > "$tmpdir/formatted.rs" -mv "$tmpdir/formatted.rs" "$generated" diff --git a/codex-rs/thread-store/src/lib.rs b/codex-rs/thread-store/src/lib.rs index a5daeff44..c7f6b4eae 100644 --- a/codex-rs/thread-store/src/lib.rs +++ b/codex-rs/thread-store/src/lib.rs @@ -8,7 +8,6 @@ mod error; mod in_memory; mod live_thread; mod local; -mod remote; mod store; mod types; @@ -20,7 +19,6 @@ pub use live_thread::LiveThread; pub use live_thread::LiveThreadInitGuard; pub use local::LocalThreadStore; pub use local::LocalThreadStoreConfig; -pub use remote::RemoteThreadStore; pub use store::ThreadStore; pub use types::AppendThreadItemsParams; pub use types::ArchiveThreadParams; diff --git a/codex-rs/thread-store/src/remote/AGENTS.md b/codex-rs/thread-store/src/remote/AGENTS.md deleted file mode 100644 index b2b2b6417..000000000 --- a/codex-rs/thread-store/src/remote/AGENTS.md +++ /dev/null @@ -1,13 +0,0 @@ -# Remote Thread Store - -- The Rust protobuf output in `proto/codex.thread_store.v1.rs` is checked in. -- Do not add build-time protobuf generation to `codex-thread-store` unless the Bazel/Cargo story is intentionally changed. -- When `proto/codex.thread_store.v1.proto` changes, regenerate the Rust file manually and include both files in the same commit. - -Run this from the repository root: - -```sh -./codex-rs/thread-store/scripts/generate-proto.sh -``` - -The command requires `protoc` to be available on `PATH`. diff --git a/codex-rs/thread-store/src/remote/helpers.rs b/codex-rs/thread-store/src/remote/helpers.rs deleted file mode 100644 index 3322ecd14..000000000 --- a/codex-rs/thread-store/src/remote/helpers.rs +++ /dev/null @@ -1,457 +0,0 @@ -use std::path::PathBuf; -use std::str::FromStr; - -use chrono::DateTime; -use chrono::Utc; -use codex_git_utils::GitSha; -use codex_protocol::AgentPath; -use codex_protocol::ThreadId; -use codex_protocol::dynamic_tools::DynamicToolSpec; -use codex_protocol::models::BaseInstructions; -use codex_protocol::openai_models::ReasoningEffort; -use codex_protocol::protocol::AskForApproval; -use codex_protocol::protocol::GitInfo; -use codex_protocol::protocol::RolloutItem; -use codex_protocol::protocol::SandboxPolicy; -use codex_protocol::protocol::SessionSource; -use codex_protocol::protocol::SubAgentSource; -use codex_protocol::protocol::ThreadMemoryMode; -use codex_protocol::protocol::ThreadSource; - -use super::proto; -use crate::GitInfoPatch; -use crate::OptionalStringPatch; -use crate::SortDirection; -use crate::StoredThread; -use crate::StoredThreadHistory; -use crate::ThreadEventPersistenceMode; -use crate::ThreadMetadataPatch; -use crate::ThreadPersistenceMetadata; -use crate::ThreadSortKey; -use crate::ThreadStoreError; -use crate::ThreadStoreResult; - -pub(super) fn remote_status_to_error(status: tonic::Status) -> ThreadStoreError { - match status.code() { - tonic::Code::InvalidArgument => ThreadStoreError::InvalidRequest { - message: status.message().to_string(), - }, - tonic::Code::AlreadyExists | tonic::Code::FailedPrecondition | tonic::Code::Aborted => { - ThreadStoreError::Conflict { - message: status.message().to_string(), - } - } - _ => ThreadStoreError::Internal { - message: format!("remote thread store request failed: {status}"), - }, - } -} - -pub(super) fn remote_status_to_thread_error( - status: tonic::Status, - thread_id: ThreadId, -) -> ThreadStoreError { - if status.code() == tonic::Code::NotFound { - return ThreadStoreError::ThreadNotFound { thread_id }; - } - remote_status_to_error(status) -} - -pub(super) fn proto_thread_id_request(thread_id: ThreadId) -> proto::ThreadIdRequest { - proto::ThreadIdRequest { - thread_id: thread_id.to_string(), - } -} - -pub(super) fn proto_sort_key(sort_key: ThreadSortKey) -> proto::ThreadSortKey { - match sort_key { - ThreadSortKey::CreatedAt => proto::ThreadSortKey::CreatedAt, - ThreadSortKey::UpdatedAt => proto::ThreadSortKey::UpdatedAt, - } -} - -pub(super) fn proto_sort_direction(sort_direction: SortDirection) -> proto::SortDirection { - match sort_direction { - SortDirection::Asc => proto::SortDirection::Asc, - SortDirection::Desc => proto::SortDirection::Desc, - } -} - -pub(super) fn proto_event_persistence_mode( - mode: ThreadEventPersistenceMode, -) -> proto::ThreadEventPersistenceMode { - match mode { - ThreadEventPersistenceMode::Limited => proto::ThreadEventPersistenceMode::Limited, - ThreadEventPersistenceMode::Extended => proto::ThreadEventPersistenceMode::Extended, - } -} - -pub(super) fn proto_session_source(source: &SessionSource) -> proto::SessionSource { - match source { - SessionSource::Cli => proto_source(proto::SessionSourceKind::Cli), - SessionSource::VSCode => proto_source(proto::SessionSourceKind::Vscode), - SessionSource::Exec => proto_source(proto::SessionSourceKind::Exec), - SessionSource::Mcp => proto_source(proto::SessionSourceKind::AppServer), - SessionSource::Custom(custom) => proto::SessionSource { - kind: proto::SessionSourceKind::Custom.into(), - custom: Some(custom.clone()), - ..Default::default() - }, - SessionSource::SubAgent(SubAgentSource::Review) => { - proto_source(proto::SessionSourceKind::SubAgentReview) - } - SessionSource::SubAgent(SubAgentSource::Compact) => { - proto_source(proto::SessionSourceKind::SubAgentCompact) - } - SessionSource::SubAgent(SubAgentSource::ThreadSpawn { - parent_thread_id, - depth, - agent_path, - agent_nickname, - agent_role, - }) => proto::SessionSource { - kind: proto::SessionSourceKind::SubAgentThreadSpawn.into(), - sub_agent_parent_thread_id: Some(parent_thread_id.to_string()), - sub_agent_depth: Some(*depth), - sub_agent_path: agent_path.as_ref().map(|path| path.as_str().to_string()), - sub_agent_nickname: agent_nickname.clone(), - sub_agent_role: agent_role.clone(), - ..Default::default() - }, - SessionSource::SubAgent(SubAgentSource::MemoryConsolidation) => { - proto_source(proto::SessionSourceKind::SubAgentMemoryConsolidation) - } - SessionSource::SubAgent(SubAgentSource::Other(other)) => proto::SessionSource { - kind: proto::SessionSourceKind::SubAgentOther.into(), - sub_agent_other: Some(other.clone()), - ..Default::default() - }, - SessionSource::Internal(_) => proto_source(proto::SessionSourceKind::Unknown), - SessionSource::Unknown => proto_source(proto::SessionSourceKind::Unknown), - } -} - -fn proto_source(kind: proto::SessionSourceKind) -> proto::SessionSource { - proto::SessionSource { - kind: kind.into(), - ..Default::default() - } -} - -pub(super) fn serialize_json( - value: &T, - field_name: &str, -) -> ThreadStoreResult { - serde_json::to_string(value).map_err(|err| ThreadStoreError::InvalidRequest { - message: format!("failed to serialize {field_name} for remote thread store: {err}"), - }) -} - -fn deserialize_json( - json: &str, - field_name: &str, -) -> ThreadStoreResult { - serde_json::from_str(json).map_err(|err| ThreadStoreError::InvalidRequest { - message: format!("remote thread store returned invalid {field_name}: {err}"), - }) -} - -pub(super) fn serialize_json_vec( - values: &[T], - field_name: &str, -) -> ThreadStoreResult> { - values - .iter() - .map(|value| serialize_json(value, field_name)) - .collect() -} - -fn deserialize_json_vec( - values: &[String], - field_name: &str, -) -> ThreadStoreResult> { - values - .iter() - .map(|value| deserialize_json(value, field_name)) - .collect() -} - -pub(super) fn base_instructions_json( - base_instructions: &BaseInstructions, -) -> ThreadStoreResult { - serialize_json(base_instructions, "base_instructions") -} - -pub(super) fn dynamic_tools_json( - dynamic_tools: &[DynamicToolSpec], -) -> ThreadStoreResult> { - serialize_json_vec(dynamic_tools, "dynamic_tool") -} - -pub(super) fn thread_persistence_metadata_json( - metadata: &ThreadPersistenceMetadata, -) -> ThreadStoreResult { - serialize_json(metadata, "thread_persistence_metadata") -} - -pub(super) fn rollout_items_json(items: &[RolloutItem]) -> ThreadStoreResult> { - serialize_json_vec(items, "rollout_item") -} - -pub(super) fn stored_thread_history_from_proto( - history: proto::StoredThreadHistory, -) -> ThreadStoreResult { - let thread_id = ThreadId::from_string(&history.thread_id).map_err(|err| { - ThreadStoreError::InvalidRequest { - message: format!("remote thread store returned invalid history thread_id: {err}"), - } - })?; - Ok(StoredThreadHistory { - thread_id, - items: deserialize_json_vec(&history.items_json, "rollout_item")?, - }) -} - -pub(super) fn proto_metadata_patch(patch: ThreadMetadataPatch) -> proto::ThreadMetadataPatch { - proto::ThreadMetadataPatch { - name: patch.name, - memory_mode: patch.memory_mode.map(proto_memory_mode).map(Into::into), - git_info: patch.git_info.map(proto_git_info_patch), - } -} - -fn proto_memory_mode(memory_mode: ThreadMemoryMode) -> proto::ThreadMemoryMode { - match memory_mode { - ThreadMemoryMode::Enabled => proto::ThreadMemoryMode::Enabled, - ThreadMemoryMode::Disabled => proto::ThreadMemoryMode::Disabled, - } -} - -fn proto_git_info_patch(patch: GitInfoPatch) -> proto::GitInfoPatch { - proto::GitInfoPatch { - sha: Some(proto_optional_string_patch(patch.sha)), - branch: Some(proto_optional_string_patch(patch.branch)), - origin_url: Some(proto_optional_string_patch(patch.origin_url)), - } -} - -fn proto_optional_string_patch(patch: OptionalStringPatch) -> proto::OptionalStringPatch { - match patch { - None => proto::OptionalStringPatch { - kind: proto::OptionalStringPatchKind::Unset.into(), - value: None, - }, - Some(None) => proto::OptionalStringPatch { - kind: proto::OptionalStringPatchKind::Clear.into(), - value: None, - }, - Some(Some(value)) => proto::OptionalStringPatch { - kind: proto::OptionalStringPatchKind::Set.into(), - value: Some(value), - }, - } -} - -pub(super) fn stored_thread_from_proto( - thread: proto::StoredThread, -) -> ThreadStoreResult { - // Keep this mapping boring: the proto mirrors StoredThread for remote-readable - // summary fields, except for Rust domain types that cross gRPC as stable scalar - // values. Local-only fields such as rollout_path intentionally stay local. - let source = thread - .source - .as_ref() - .map(session_source_from_proto) - .transpose()? - .unwrap_or(SessionSource::Unknown); - let thread_id = ThreadId::from_string(&thread.thread_id).map_err(|err| { - ThreadStoreError::InvalidRequest { - message: format!("remote thread store returned invalid thread_id: {err}"), - } - })?; - let forked_from_id = thread - .forked_from_id - .as_deref() - .map(ThreadId::from_string) - .transpose() - .map_err(|err| ThreadStoreError::InvalidRequest { - message: format!("remote thread store returned invalid forked_from_id: {err}"), - })?; - - Ok(StoredThread { - thread_id, - rollout_path: thread.rollout_path.map(PathBuf::from), - forked_from_id, - preview: thread.preview, - name: thread.name, - model_provider: thread.model_provider, - model: thread.model, - reasoning_effort: thread - .reasoning_effort - .as_deref() - .map(parse_reasoning_effort) - .transpose()?, - created_at: datetime_from_unix(thread.created_at)?, - updated_at: datetime_from_unix(thread.updated_at)?, - archived_at: thread.archived_at.map(datetime_from_unix).transpose()?, - cwd: PathBuf::from(thread.cwd), - cli_version: thread.cli_version, - source, - thread_source: thread - .thread_source - .map(|thread_source| thread_source.parse::()) - .transpose() - .map_err(|error| ThreadStoreError::Internal { message: error })?, - agent_nickname: thread.agent_nickname, - agent_role: thread.agent_role, - agent_path: thread.agent_path, - git_info: thread.git_info.map(git_info_from_proto), - approval_mode: thread - .approval_mode_json - .as_deref() - .map(|json| deserialize_json(json, "approval_mode")) - .transpose()? - .unwrap_or(AskForApproval::OnRequest), - sandbox_policy: thread - .sandbox_policy_json - .as_deref() - .map(|json| deserialize_json(json, "sandbox_policy")) - .transpose()? - .unwrap_or_else(SandboxPolicy::new_read_only_policy), - token_usage: thread - .token_usage_json - .as_deref() - .map(|json| deserialize_json(json, "token_usage")) - .transpose()?, - first_user_message: thread.first_user_message, - history: thread - .history - .map(stored_thread_history_from_proto) - .transpose()?, - }) -} - -#[cfg(test)] -pub(super) fn stored_thread_to_proto(thread: StoredThread) -> proto::StoredThread { - proto::StoredThread { - thread_id: thread.thread_id.to_string(), - forked_from_id: thread.forked_from_id.map(|thread_id| thread_id.to_string()), - preview: thread.preview, - name: thread.name, - model_provider: thread.model_provider, - model: thread.model, - created_at: thread.created_at.timestamp(), - updated_at: thread.updated_at.timestamp(), - archived_at: thread.archived_at.map(|timestamp| timestamp.timestamp()), - cwd: thread.cwd.to_string_lossy().into_owned(), - cli_version: thread.cli_version, - source: Some(proto_session_source(&thread.source)), - thread_source: thread.thread_source.map(|source| source.to_string()), - git_info: thread.git_info.map(git_info_to_proto), - agent_nickname: thread.agent_nickname, - agent_role: thread.agent_role, - agent_path: thread.agent_path, - reasoning_effort: thread.reasoning_effort.map(|effort| effort.to_string()), - first_user_message: thread.first_user_message, - rollout_path: thread - .rollout_path - .map(|path| path.to_string_lossy().into_owned()), - approval_mode_json: Some(serialize_json(&thread.approval_mode, "approval_mode").unwrap()), - sandbox_policy_json: Some( - serialize_json(&thread.sandbox_policy, "sandbox_policy").unwrap(), - ), - token_usage_json: thread - .token_usage - .as_ref() - .map(|usage| serialize_json(usage, "token_usage").unwrap()), - history: thread.history.map(stored_thread_history_to_proto), - } -} - -#[cfg(test)] -fn stored_thread_history_to_proto(history: StoredThreadHistory) -> proto::StoredThreadHistory { - proto::StoredThreadHistory { - thread_id: history.thread_id.to_string(), - items_json: rollout_items_json(&history.items).unwrap(), - } -} - -fn datetime_from_unix(timestamp: i64) -> ThreadStoreResult> { - DateTime::from_timestamp(timestamp, 0).ok_or_else(|| ThreadStoreError::InvalidRequest { - message: format!("remote thread store returned invalid timestamp: {timestamp}"), - }) -} - -fn session_source_from_proto(source: &proto::SessionSource) -> ThreadStoreResult { - let kind = proto::SessionSourceKind::try_from(source.kind).unwrap_or_default(); - Ok(match kind { - proto::SessionSourceKind::Unknown => SessionSource::Unknown, - proto::SessionSourceKind::Cli => SessionSource::Cli, - proto::SessionSourceKind::Vscode => SessionSource::VSCode, - proto::SessionSourceKind::Exec => SessionSource::Exec, - proto::SessionSourceKind::AppServer => SessionSource::Mcp, - proto::SessionSourceKind::Custom => { - SessionSource::Custom(source.custom.clone().unwrap_or_default()) - } - proto::SessionSourceKind::SubAgentReview => SessionSource::SubAgent(SubAgentSource::Review), - proto::SessionSourceKind::SubAgentCompact => { - SessionSource::SubAgent(SubAgentSource::Compact) - } - proto::SessionSourceKind::SubAgentThreadSpawn => { - let parent_thread_id = source - .sub_agent_parent_thread_id - .as_deref() - .map(ThreadId::from_string) - .transpose() - .map_err(|err| ThreadStoreError::InvalidRequest { - message: format!( - "remote thread store returned invalid sub-agent parent thread id: {err}" - ), - })? - .ok_or_else(|| ThreadStoreError::InvalidRequest { - message: "remote thread store omitted sub-agent parent thread id".to_string(), - })?; - SessionSource::SubAgent(SubAgentSource::ThreadSpawn { - parent_thread_id, - depth: source.sub_agent_depth.unwrap_or_default(), - agent_path: source - .sub_agent_path - .clone() - .map(AgentPath::from_string) - .transpose() - .map_err(|message| ThreadStoreError::InvalidRequest { message })?, - agent_nickname: source.sub_agent_nickname.clone(), - agent_role: source.sub_agent_role.clone(), - }) - } - proto::SessionSourceKind::SubAgentMemoryConsolidation => { - SessionSource::SubAgent(SubAgentSource::MemoryConsolidation) - } - proto::SessionSourceKind::SubAgentOther => SessionSource::SubAgent(SubAgentSource::Other( - source.sub_agent_other.clone().unwrap_or_default(), - )), - }) -} - -fn git_info_from_proto(info: proto::GitInfo) -> GitInfo { - GitInfo { - commit_hash: info.sha.as_deref().map(GitSha::new), - branch: info.branch, - repository_url: info.origin_url, - } -} - -#[cfg(test)] -fn git_info_to_proto(info: GitInfo) -> proto::GitInfo { - proto::GitInfo { - sha: info.commit_hash.map(|sha| sha.0), - branch: info.branch, - origin_url: info.repository_url, - } -} - -fn parse_reasoning_effort(value: &str) -> ThreadStoreResult { - ReasoningEffort::from_str(value).map_err(|message| ThreadStoreError::InvalidRequest { - message: format!("remote thread store returned {message}"), - }) -} diff --git a/codex-rs/thread-store/src/remote/list_threads.rs b/codex-rs/thread-store/src/remote/list_threads.rs deleted file mode 100644 index cf562497f..000000000 --- a/codex-rs/thread-store/src/remote/list_threads.rs +++ /dev/null @@ -1,282 +0,0 @@ -use super::RemoteThreadStore; -use super::helpers::proto_session_source; -use super::helpers::proto_sort_direction; -use super::helpers::proto_sort_key; -use super::helpers::remote_status_to_error; -use super::helpers::stored_thread_from_proto; -use super::proto; -use crate::ListThreadsParams; -use crate::ThreadPage; -use crate::ThreadStoreError; -use crate::ThreadStoreResult; - -pub(super) async fn list_threads( - store: &RemoteThreadStore, - params: ListThreadsParams, -) -> ThreadStoreResult { - let request = proto::ListThreadsRequest { - page_size: params - .page_size - .try_into() - .map_err(|_| ThreadStoreError::InvalidRequest { - message: format!("page_size is too large: {}", params.page_size), - })?, - cursor: params.cursor, - sort_key: proto_sort_key(params.sort_key).into(), - sort_direction: proto_sort_direction(params.sort_direction).into(), - allowed_sources: params - .allowed_sources - .iter() - .map(proto_session_source) - .collect(), - model_provider_filter: params - .model_providers - .map(|values| proto::ModelProviderFilter { values }), - cwd_filter: params.cwd_filters.map(|values| proto::CwdFilter { - values: values - .into_iter() - .map(|cwd| cwd.display().to_string()) - .collect(), - }), - archived: params.archived, - search_term: params.search_term, - use_state_db_only: params.use_state_db_only, - }; - - let response = store - .client() - .await? - .list_threads(request) - .await - .map_err(remote_status_to_error)? - .into_inner(); - - let items = response - .threads - .into_iter() - .map(stored_thread_from_proto) - .collect::>>()?; - - Ok(ThreadPage { - items, - next_cursor: response.next_cursor, - }) -} - -#[cfg(test)] -mod tests { - use std::path::PathBuf; - - use codex_protocol::openai_models::ReasoningEffort; - use codex_protocol::protocol::SessionSource; - use pretty_assertions::assert_eq; - use tonic::Request; - use tonic::Response; - use tonic::Status; - use tonic::transport::Server; - - use super::super::helpers::stored_thread_to_proto; - use super::super::proto::thread_store_server; - use super::super::proto::thread_store_server::ThreadStoreServer; - use super::*; - use crate::ThreadSortKey; - use crate::ThreadStore; - - #[derive(Default)] - struct TestServer; - - #[tonic::async_trait] - impl thread_store_server::ThreadStore for TestServer { - async fn list_threads( - &self, - request: Request, - ) -> Result, Status> { - let request = request.into_inner(); - assert_eq!(request.page_size, 2); - assert_eq!(request.cursor.as_deref(), Some("cursor-1")); - assert_eq!( - proto::ThreadSortKey::try_from(request.sort_key), - Ok(proto::ThreadSortKey::UpdatedAt) - ); - assert_eq!( - proto::SortDirection::try_from(request.sort_direction), - Ok(proto::SortDirection::Desc) - ); - assert_eq!(request.archived, true); - assert_eq!(request.search_term.as_deref(), Some("needle")); - assert!(request.use_state_db_only); - assert_eq!( - request.model_provider_filter, - Some(proto::ModelProviderFilter { - values: vec!["openai".to_string()], - }) - ); - assert_eq!( - request.cwd_filter, - Some(proto::CwdFilter { - values: vec!["/workspace".to_string()], - }) - ); - assert_eq!(request.allowed_sources.len(), 1); - assert_eq!( - proto::SessionSourceKind::try_from(request.allowed_sources[0].kind), - Ok(proto::SessionSourceKind::Cli) - ); - - Ok(Response::new(proto::ListThreadsResponse { - threads: vec![proto::StoredThread { - thread_id: "11111111-1111-1111-1111-111111111111".to_string(), - forked_from_id: None, - preview: "hello".to_string(), - name: Some("named thread".to_string()), - model_provider: "openai".to_string(), - model: Some("gpt-5".to_string()), - created_at: 100, - updated_at: 200, - archived_at: Some(300), - cwd: "/workspace".to_string(), - cli_version: "1.2.3".to_string(), - source: Some(proto::SessionSource { - kind: proto::SessionSourceKind::Cli.into(), - ..Default::default() - }), - thread_source: Some("user".to_string()), - git_info: Some(proto::GitInfo { - sha: Some("abc123".to_string()), - branch: Some("main".to_string()), - origin_url: Some("https://example.test/repo.git".to_string()), - }), - agent_nickname: None, - agent_role: None, - agent_path: None, - reasoning_effort: Some("medium".to_string()), - first_user_message: Some("hello".to_string()), - rollout_path: None, - approval_mode_json: None, - sandbox_policy_json: None, - token_usage_json: None, - history: None, - }], - next_cursor: Some("cursor-2".to_string()), - })) - } - } - - #[tokio::test] - async fn list_threads_calls_remote_service() { - let listener = tokio::net::TcpListener::bind("127.0.0.1:0") - .await - .expect("bind test server"); - let addr = listener.local_addr().expect("test server addr"); - let (shutdown_tx, shutdown_rx) = tokio::sync::oneshot::channel(); - let server = tokio::spawn(async move { - Server::builder() - .add_service(ThreadStoreServer::new(TestServer)) - .serve_with_incoming_shutdown( - tokio_stream::wrappers::TcpListenerStream::new(listener), - async { - let _ = shutdown_rx.await; - }, - ) - .await - }); - - let store = RemoteThreadStore::new(format!("http://{addr}")); - let page = store - .list_threads(ListThreadsParams { - page_size: 2, - cursor: Some("cursor-1".to_string()), - sort_key: ThreadSortKey::UpdatedAt, - sort_direction: crate::SortDirection::Desc, - allowed_sources: vec![SessionSource::Cli], - model_providers: Some(vec!["openai".to_string()]), - cwd_filters: Some(vec![PathBuf::from("/workspace")]), - archived: true, - search_term: Some("needle".to_string()), - use_state_db_only: true, - }) - .await - .expect("list threads"); - - assert_eq!(page.next_cursor.as_deref(), Some("cursor-2")); - assert_eq!(page.items.len(), 1); - let item = &page.items[0]; - assert_eq!( - item.thread_id.to_string(), - "11111111-1111-1111-1111-111111111111" - ); - assert_eq!(item.name.as_deref(), Some("named thread")); - assert_eq!(item.preview, "hello"); - assert_eq!(item.first_user_message.as_deref(), Some("hello")); - assert_eq!(item.model_provider, "openai"); - assert_eq!(item.model.as_deref(), Some("gpt-5")); - assert_eq!(item.created_at.timestamp(), 100); - assert_eq!(item.updated_at.timestamp(), 200); - assert_eq!(item.archived_at.map(|ts| ts.timestamp()), Some(300)); - assert_eq!(item.cwd, PathBuf::from("/workspace")); - assert_eq!(item.cli_version, "1.2.3"); - assert_eq!(item.source, SessionSource::Cli); - assert_eq!(item.reasoning_effort, Some(ReasoningEffort::Medium)); - assert_eq!( - item.git_info.as_ref().and_then(|git| git.branch.as_deref()), - Some("main") - ); - - let _ = shutdown_tx.send(()); - server.await.expect("join server").expect("server"); - } - - #[test] - fn stored_thread_proto_roundtrips_through_domain_type() { - let thread = proto::StoredThread { - thread_id: "11111111-1111-1111-1111-111111111111".to_string(), - forked_from_id: Some("22222222-2222-2222-2222-222222222222".to_string()), - preview: "preview text".to_string(), - name: Some("named thread".to_string()), - model_provider: "openai".to_string(), - model: Some("gpt-5".to_string()), - created_at: 100, - updated_at: 200, - archived_at: Some(300), - cwd: "/workspace/project".to_string(), - cli_version: "1.2.3".to_string(), - source: Some(proto::SessionSource { - kind: proto::SessionSourceKind::SubAgentThreadSpawn.into(), - sub_agent_parent_thread_id: Some( - "33333333-3333-3333-3333-333333333333".to_string(), - ), - sub_agent_depth: Some(2), - sub_agent_path: Some("/root/review/backend".to_string()), - sub_agent_nickname: Some("Navigator".to_string()), - sub_agent_role: Some("explorer".to_string()), - ..Default::default() - }), - thread_source: Some("subagent".to_string()), - git_info: Some(proto::GitInfo { - sha: Some("abc123".to_string()), - branch: Some("main".to_string()), - origin_url: Some("https://example.test/repo.git".to_string()), - }), - agent_nickname: Some("Navigator".to_string()), - agent_role: Some("explorer".to_string()), - agent_path: Some("/root/review/backend".to_string()), - reasoning_effort: Some("high".to_string()), - first_user_message: Some("first message".to_string()), - rollout_path: None, - approval_mode_json: None, - sandbox_policy_json: None, - token_usage_json: None, - history: None, - }; - - let stored = stored_thread_from_proto(thread.clone()).expect("proto to stored thread"); - - assert_eq!(stored.rollout_path, None); - assert!(stored.history.is_none()); - let roundtripped = stored_thread_to_proto(stored); - assert_eq!(roundtripped.thread_id, thread.thread_id); - assert_eq!(roundtripped.forked_from_id, thread.forked_from_id); - assert_eq!(roundtripped.source, thread.source); - assert_eq!(roundtripped.git_info, thread.git_info); - } -} diff --git a/codex-rs/thread-store/src/remote/mod.rs b/codex-rs/thread-store/src/remote/mod.rs deleted file mode 100644 index 013b74c93..000000000 --- a/codex-rs/thread-store/src/remote/mod.rs +++ /dev/null @@ -1,410 +0,0 @@ -mod helpers; -mod list_threads; - -use async_trait::async_trait; -use codex_protocol::ThreadId; - -use crate::AppendThreadItemsParams; -use crate::ArchiveThreadParams; -use crate::CreateThreadParams; -use crate::ListThreadsParams; -use crate::LoadThreadHistoryParams; -use crate::ReadThreadByRolloutPathParams; -use crate::ReadThreadParams; -use crate::ResumeThreadParams; -use crate::StoredThread; -use crate::StoredThreadHistory; -use crate::ThreadPage; -use crate::ThreadStore; -use crate::ThreadStoreError; -use crate::ThreadStoreResult; -use crate::UpdateThreadMetadataParams; -use proto::thread_store_client::ThreadStoreClient; - -#[path = "proto/codex.thread_store.v1.rs"] -mod proto; - -/// gRPC-backed [`ThreadStore`] implementation for deployments whose durable thread data lives -/// outside the app-server process. -/// -/// This store is still a work in progress: app-server code should call the generic -/// [`ThreadStore`] methods, and unsupported remote operations will return explicit -/// `not_implemented` errors until the remote API catches up. -#[derive(Clone, Debug)] -pub struct RemoteThreadStore { - endpoint: String, -} - -impl RemoteThreadStore { - pub fn new(endpoint: impl Into) -> Self { - Self { - endpoint: endpoint.into(), - } - } - - async fn client(&self) -> ThreadStoreResult> { - ThreadStoreClient::connect(self.endpoint.clone()) - .await - .map_err(|err| ThreadStoreError::Internal { - message: format!("failed to connect to remote thread store: {err}"), - }) - } -} - -#[async_trait] -impl ThreadStore for RemoteThreadStore { - fn as_any(&self) -> &dyn std::any::Any { - self - } - - async fn create_thread(&self, params: CreateThreadParams) -> ThreadStoreResult<()> { - let thread_id = params.thread_id; - let request = proto::CreateThreadRequest { - thread_id: thread_id.to_string(), - forked_from_id: params.forked_from_id.map(|thread_id| thread_id.to_string()), - source: Some(helpers::proto_session_source(¶ms.source)), - base_instructions_json: helpers::base_instructions_json(¶ms.base_instructions)?, - dynamic_tools_json: helpers::dynamic_tools_json(¶ms.dynamic_tools)?, - event_persistence_mode: helpers::proto_event_persistence_mode( - params.event_persistence_mode, - ) - .into(), - metadata_json: helpers::thread_persistence_metadata_json(¶ms.metadata)?, - }; - self.client() - .await? - .create_thread(request) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn resume_thread(&self, params: ResumeThreadParams) -> ThreadStoreResult<()> { - let thread_id = params.thread_id; - let (has_history, history_json) = match params.history { - Some(history) => (true, helpers::rollout_items_json(&history)?), - None => (false, Vec::new()), - }; - let request = proto::ResumeThreadRequest { - thread_id: thread_id.to_string(), - rollout_path: params - .rollout_path - .map(|path| path.to_string_lossy().into_owned()), - history_json, - has_history, - include_archived: params.include_archived, - event_persistence_mode: helpers::proto_event_persistence_mode( - params.event_persistence_mode, - ) - .into(), - metadata_json: helpers::thread_persistence_metadata_json(¶ms.metadata)?, - }; - self.client() - .await? - .resume_thread(request) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn append_items(&self, params: AppendThreadItemsParams) -> ThreadStoreResult<()> { - let thread_id = params.thread_id; - let request = proto::AppendThreadItemsRequest { - thread_id: thread_id.to_string(), - items_json: helpers::rollout_items_json(¶ms.items)?, - }; - self.client() - .await? - .append_items(request) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn persist_thread(&self, thread_id: ThreadId) -> ThreadStoreResult<()> { - self.client() - .await? - .persist_thread(helpers::proto_thread_id_request(thread_id)) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn flush_thread(&self, thread_id: ThreadId) -> ThreadStoreResult<()> { - self.client() - .await? - .flush_thread(helpers::proto_thread_id_request(thread_id)) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn shutdown_thread(&self, thread_id: ThreadId) -> ThreadStoreResult<()> { - self.client() - .await? - .shutdown_thread(helpers::proto_thread_id_request(thread_id)) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn discard_thread(&self, thread_id: ThreadId) -> ThreadStoreResult<()> { - self.client() - .await? - .discard_thread(helpers::proto_thread_id_request(thread_id)) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn load_history( - &self, - params: LoadThreadHistoryParams, - ) -> ThreadStoreResult { - let thread_id = params.thread_id; - let response = self - .client() - .await? - .load_history(proto::LoadThreadHistoryRequest { - thread_id: thread_id.to_string(), - include_archived: params.include_archived, - }) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))? - .into_inner(); - helpers::stored_thread_history_from_proto(response) - } - - async fn read_thread(&self, params: ReadThreadParams) -> ThreadStoreResult { - let thread_id = params.thread_id; - let response = self - .client() - .await? - .read_thread(proto::ReadThreadRequest { - thread_id: thread_id.to_string(), - include_archived: params.include_archived, - include_history: params.include_history, - }) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))? - .into_inner(); - let thread = response.thread.ok_or_else(|| ThreadStoreError::Internal { - message: "remote thread store omitted read_thread response thread".to_string(), - })?; - helpers::stored_thread_from_proto(thread) - } - - async fn read_thread_by_rollout_path( - &self, - _params: ReadThreadByRolloutPathParams, - ) -> ThreadStoreResult { - Err(ThreadStoreError::Internal { - message: "remote thread store does not support read_thread_by_rollout_path".to_string(), - }) - } - - async fn list_threads(&self, params: ListThreadsParams) -> ThreadStoreResult { - list_threads::list_threads(self, params).await - } - - async fn update_thread_metadata( - &self, - params: UpdateThreadMetadataParams, - ) -> ThreadStoreResult { - let thread_id = params.thread_id; - let response = self - .client() - .await? - .update_thread_metadata(proto::UpdateThreadMetadataRequest { - thread_id: thread_id.to_string(), - patch: Some(helpers::proto_metadata_patch(params.patch)), - include_archived: params.include_archived, - }) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))? - .into_inner(); - let thread = response.thread.ok_or_else(|| ThreadStoreError::Internal { - message: "remote thread store omitted update_thread_metadata response thread" - .to_string(), - })?; - helpers::stored_thread_from_proto(thread) - } - - async fn archive_thread(&self, params: ArchiveThreadParams) -> ThreadStoreResult<()> { - let thread_id = params.thread_id; - self.client() - .await? - .archive_thread(proto::ArchiveThreadRequest { - thread_id: thread_id.to_string(), - }) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))?; - Ok(()) - } - - async fn unarchive_thread( - &self, - params: ArchiveThreadParams, - ) -> ThreadStoreResult { - let thread_id = params.thread_id; - let response = self - .client() - .await? - .unarchive_thread(proto::ArchiveThreadRequest { - thread_id: thread_id.to_string(), - }) - .await - .map_err(|status| helpers::remote_status_to_thread_error(status, thread_id))? - .into_inner(); - let thread = response.thread.ok_or_else(|| ThreadStoreError::Internal { - message: "remote thread store omitted unarchive_thread response thread".to_string(), - })?; - helpers::stored_thread_from_proto(thread) - } -} - -#[cfg(test)] -mod tests { - use std::path::PathBuf; - - use codex_protocol::ThreadId; - use codex_protocol::models::BaseInstructions; - use codex_protocol::protocol::SessionSource; - use codex_protocol::protocol::ThreadMemoryMode; - use pretty_assertions::assert_eq; - use tokio::sync::mpsc; - use tonic::Request; - use tonic::Response; - use tonic::Status; - use tonic::transport::Server; - - use super::*; - use crate::ThreadEventPersistenceMode; - use crate::ThreadPersistenceMetadata; - use proto::thread_store_server; - use proto::thread_store_server::ThreadStoreServer; - - enum RecordedRequest { - Create(proto::CreateThreadRequest), - Resume(proto::ResumeThreadRequest), - } - - struct TestServer { - requests_tx: mpsc::UnboundedSender, - } - - #[tonic::async_trait] - impl thread_store_server::ThreadStore for TestServer { - async fn create_thread( - &self, - request: Request, - ) -> Result, Status> { - self.requests_tx - .send(RecordedRequest::Create(request.into_inner())) - .expect("record create request"); - Ok(Response::new(proto::Empty {})) - } - - async fn resume_thread( - &self, - request: Request, - ) -> Result, Status> { - self.requests_tx - .send(RecordedRequest::Resume(request.into_inner())) - .expect("record resume request"); - Ok(Response::new(proto::Empty {})) - } - - async fn list_threads( - &self, - _request: Request, - ) -> Result, Status> { - Err(Status::unimplemented("not implemented")) - } - } - - async fn test_store() -> (RemoteThreadStore, mpsc::UnboundedReceiver) { - let (requests_tx, requests_rx) = mpsc::unbounded_channel(); - let listener = tokio::net::TcpListener::bind("127.0.0.1:0") - .await - .expect("bind test server"); - let addr = listener.local_addr().expect("test server addr"); - - tokio::spawn(async move { - Server::builder() - .add_service(ThreadStoreServer::new(TestServer { requests_tx })) - .serve_with_incoming(tokio_stream::wrappers::TcpListenerStream::new(listener)) - .await - .expect("test server"); - }); - - ( - RemoteThreadStore::new(format!("http://{addr}")), - requests_rx, - ) - } - - #[tokio::test] - async fn create_thread_forwards_metadata() { - let (store, mut requests_rx) = test_store().await; - let metadata = ThreadPersistenceMetadata { - cwd: Some(PathBuf::from("/workspace")), - model_provider: "test-provider".to_string(), - memory_mode: ThreadMemoryMode::Enabled, - }; - - store - .create_thread(CreateThreadParams { - thread_id: ThreadId::new(), - forked_from_id: None, - source: SessionSource::Exec, - thread_source: None, - base_instructions: BaseInstructions::default(), - dynamic_tools: Vec::new(), - metadata: metadata.clone(), - event_persistence_mode: ThreadEventPersistenceMode::Limited, - }) - .await - .expect("create thread"); - - let Some(RecordedRequest::Create(request)) = requests_rx.recv().await else { - panic!("expected create request"); - }; - assert_eq!( - serde_json::from_str::(&request.metadata_json) - .expect("metadata json"), - metadata - ); - } - - #[tokio::test] - async fn resume_thread_forwards_metadata() { - let (store, mut requests_rx) = test_store().await; - let metadata = ThreadPersistenceMetadata { - cwd: Some(PathBuf::from("/workspace")), - model_provider: "test-provider".to_string(), - memory_mode: ThreadMemoryMode::Disabled, - }; - - store - .resume_thread(ResumeThreadParams { - thread_id: ThreadId::new(), - rollout_path: None, - history: None, - include_archived: false, - metadata: metadata.clone(), - event_persistence_mode: ThreadEventPersistenceMode::Limited, - }) - .await - .expect("resume thread"); - - let Some(RecordedRequest::Resume(request)) = requests_rx.recv().await else { - panic!("expected resume request"); - }; - assert_eq!( - serde_json::from_str::(&request.metadata_json) - .expect("metadata json"), - metadata - ); - } -} diff --git a/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.proto b/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.proto deleted file mode 100644 index a5755afee..000000000 --- a/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.proto +++ /dev/null @@ -1,210 +0,0 @@ -syntax = "proto3"; - -package codex.thread_store.v1; - -service ThreadStore { - rpc CreateThread(CreateThreadRequest) returns (Empty); - rpc ResumeThread(ResumeThreadRequest) returns (Empty); - rpc AppendItems(AppendThreadItemsRequest) returns (Empty); - rpc PersistThread(ThreadIdRequest) returns (Empty); - rpc FlushThread(ThreadIdRequest) returns (Empty); - rpc ShutdownThread(ThreadIdRequest) returns (Empty); - rpc DiscardThread(ThreadIdRequest) returns (Empty); - rpc LoadHistory(LoadThreadHistoryRequest) returns (StoredThreadHistory); - rpc ReadThread(ReadThreadRequest) returns (StoredThreadResponse); - rpc ListThreads(ListThreadsRequest) returns (ListThreadsResponse); - rpc UpdateThreadMetadata(UpdateThreadMetadataRequest) returns (StoredThreadResponse); - rpc ArchiveThread(ArchiveThreadRequest) returns (Empty); - rpc UnarchiveThread(ArchiveThreadRequest) returns (StoredThreadResponse); -} - -message Empty {} - -message ThreadIdRequest { - string thread_id = 1; -} - -message CreateThreadRequest { - string thread_id = 1; - optional string forked_from_id = 2; - SessionSource source = 3; - string base_instructions_json = 4; - repeated string dynamic_tools_json = 5; - ThreadEventPersistenceMode event_persistence_mode = 6; - string metadata_json = 7; -} - -message ResumeThreadRequest { - string thread_id = 1; - optional string rollout_path = 2; - repeated string history_json = 3; - bool has_history = 4; - bool include_archived = 5; - ThreadEventPersistenceMode event_persistence_mode = 6; - string metadata_json = 7; -} - -message AppendThreadItemsRequest { - string thread_id = 1; - repeated string items_json = 2; -} - -message LoadThreadHistoryRequest { - string thread_id = 1; - bool include_archived = 2; -} - -message ReadThreadRequest { - string thread_id = 1; - bool include_archived = 2; - bool include_history = 3; -} - -message ListThreadsRequest { - uint32 page_size = 1; - optional string cursor = 2; - ThreadSortKey sort_key = 3; - repeated SessionSource allowed_sources = 4; - optional ModelProviderFilter model_provider_filter = 5; - bool archived = 6; - optional string search_term = 7; - optional CwdFilter cwd_filter = 8; - bool use_state_db_only = 9; - SortDirection sort_direction = 10; -} - -message ModelProviderFilter { - repeated string values = 1; -} - -message CwdFilter { - repeated string values = 1; -} - -enum ThreadSortKey { - THREAD_SORT_KEY_CREATED_AT = 0; - THREAD_SORT_KEY_UPDATED_AT = 1; -} - -enum SortDirection { - SORT_DIRECTION_ASC = 0; - SORT_DIRECTION_DESC = 1; -} - -message ListThreadsResponse { - repeated StoredThread threads = 1; - optional string next_cursor = 2; -} - -message StoredThreadResponse { - StoredThread thread = 1; -} - -message StoredThreadHistory { - string thread_id = 1; - repeated string items_json = 2; -} - -message StoredThread { - // Mirrors Rust's StoredThread. Domain types that are not protobuf-native, - // such as ThreadId, DateTime, and PathBuf, are represented as their - // stable scalar forms on the wire. - string thread_id = 1; - optional string forked_from_id = 2; - string preview = 3; - optional string name = 4; - string model_provider = 5; - optional string model = 6; - int64 created_at = 7; - int64 updated_at = 8; - optional int64 archived_at = 9; - string cwd = 10; - string cli_version = 11; - SessionSource source = 12; - optional GitInfo git_info = 13; - optional string agent_nickname = 14; - optional string agent_role = 15; - optional string agent_path = 16; - optional string reasoning_effort = 17; - optional string first_user_message = 18; - optional string rollout_path = 19; - optional string approval_mode_json = 20; - optional string sandbox_policy_json = 21; - optional string token_usage_json = 22; - optional StoredThreadHistory history = 23; - optional string thread_source = 24; -} - -message SessionSource { - SessionSourceKind kind = 1; - optional string custom = 2; - optional string sub_agent_parent_thread_id = 3; - optional int32 sub_agent_depth = 4; - optional string sub_agent_other = 5; - optional string sub_agent_path = 6; - optional string sub_agent_nickname = 7; - optional string sub_agent_role = 8; -} - -enum SessionSourceKind { - SESSION_SOURCE_KIND_UNKNOWN = 0; - SESSION_SOURCE_KIND_CLI = 1; - SESSION_SOURCE_KIND_VSCODE = 2; - SESSION_SOURCE_KIND_EXEC = 3; - SESSION_SOURCE_KIND_APP_SERVER = 4; - SESSION_SOURCE_KIND_CUSTOM = 5; - SESSION_SOURCE_KIND_SUB_AGENT_REVIEW = 6; - SESSION_SOURCE_KIND_SUB_AGENT_COMPACT = 7; - SESSION_SOURCE_KIND_SUB_AGENT_THREAD_SPAWN = 8; - SESSION_SOURCE_KIND_SUB_AGENT_MEMORY_CONSOLIDATION = 9; - SESSION_SOURCE_KIND_SUB_AGENT_OTHER = 10; -} - -message GitInfo { - optional string sha = 1; - optional string branch = 2; - optional string origin_url = 3; -} - -message UpdateThreadMetadataRequest { - string thread_id = 1; - ThreadMetadataPatch patch = 2; - bool include_archived = 3; -} - -message ThreadMetadataPatch { - optional string name = 1; - optional ThreadMemoryMode memory_mode = 2; - optional GitInfoPatch git_info = 3; -} - -enum ThreadMemoryMode { - THREAD_MEMORY_MODE_ENABLED = 0; - THREAD_MEMORY_MODE_DISABLED = 1; -} - -message GitInfoPatch { - OptionalStringPatch sha = 1; - OptionalStringPatch branch = 2; - OptionalStringPatch origin_url = 3; -} - -message OptionalStringPatch { - OptionalStringPatchKind kind = 1; - optional string value = 2; -} - -enum OptionalStringPatchKind { - OPTIONAL_STRING_PATCH_KIND_UNSET = 0; - OPTIONAL_STRING_PATCH_KIND_CLEAR = 1; - OPTIONAL_STRING_PATCH_KIND_SET = 2; -} - -message ArchiveThreadRequest { - string thread_id = 1; -} - -enum ThreadEventPersistenceMode { - THREAD_EVENT_PERSISTENCE_MODE_LIMITED = 0; - THREAD_EVENT_PERSISTENCE_MODE_EXTENDED = 1; -} diff --git a/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.rs b/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.rs deleted file mode 100644 index c5b8fdc1d..000000000 --- a/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.rs +++ /dev/null @@ -1,1122 +0,0 @@ -// This file is @generated by prost-build. -#![allow(clippy::trivially_copy_pass_by_ref)] - -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct Empty {} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ThreadIdRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct CreateThreadRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(string, optional, tag = "2")] - pub forked_from_id: ::core::option::Option<::prost::alloc::string::String>, - #[prost(message, optional, tag = "3")] - pub source: ::core::option::Option, - #[prost(string, tag = "4")] - pub base_instructions_json: ::prost::alloc::string::String, - #[prost(string, repeated, tag = "5")] - pub dynamic_tools_json: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - #[prost(enumeration = "ThreadEventPersistenceMode", tag = "6")] - pub event_persistence_mode: i32, - #[prost(string, tag = "7")] - pub metadata_json: ::prost::alloc::string::String, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ResumeThreadRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(string, optional, tag = "2")] - pub rollout_path: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, repeated, tag = "3")] - pub history_json: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - #[prost(bool, tag = "4")] - pub has_history: bool, - #[prost(bool, tag = "5")] - pub include_archived: bool, - #[prost(enumeration = "ThreadEventPersistenceMode", tag = "6")] - pub event_persistence_mode: i32, - #[prost(string, tag = "7")] - pub metadata_json: ::prost::alloc::string::String, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct AppendThreadItemsRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(string, repeated, tag = "2")] - pub items_json: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct LoadThreadHistoryRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(bool, tag = "2")] - pub include_archived: bool, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ReadThreadRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(bool, tag = "2")] - pub include_archived: bool, - #[prost(bool, tag = "3")] - pub include_history: bool, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ListThreadsRequest { - #[prost(uint32, tag = "1")] - pub page_size: u32, - #[prost(string, optional, tag = "2")] - pub cursor: ::core::option::Option<::prost::alloc::string::String>, - #[prost(enumeration = "ThreadSortKey", tag = "3")] - pub sort_key: i32, - #[prost(message, repeated, tag = "4")] - pub allowed_sources: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "5")] - pub model_provider_filter: ::core::option::Option, - #[prost(bool, tag = "6")] - pub archived: bool, - #[prost(string, optional, tag = "7")] - pub search_term: ::core::option::Option<::prost::alloc::string::String>, - #[prost(message, optional, tag = "8")] - pub cwd_filter: ::core::option::Option, - #[prost(bool, tag = "9")] - pub use_state_db_only: bool, - #[prost(enumeration = "SortDirection", tag = "10")] - pub sort_direction: i32, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ModelProviderFilter { - #[prost(string, repeated, tag = "1")] - pub values: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct CwdFilter { - #[prost(string, repeated, tag = "1")] - pub values: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ListThreadsResponse { - #[prost(message, repeated, tag = "1")] - pub threads: ::prost::alloc::vec::Vec, - #[prost(string, optional, tag = "2")] - pub next_cursor: ::core::option::Option<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct StoredThreadResponse { - #[prost(message, optional, tag = "1")] - pub thread: ::core::option::Option, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct StoredThreadHistory { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(string, repeated, tag = "2")] - pub items_json: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct StoredThread { - /// Mirrors Rust's StoredThread. Domain types that are not protobuf-native, - /// such as ThreadId, DateTime, and PathBuf, are represented as their - /// stable scalar forms on the wire. - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(string, optional, tag = "2")] - pub forked_from_id: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, tag = "3")] - pub preview: ::prost::alloc::string::String, - #[prost(string, optional, tag = "4")] - pub name: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, tag = "5")] - pub model_provider: ::prost::alloc::string::String, - #[prost(string, optional, tag = "6")] - pub model: ::core::option::Option<::prost::alloc::string::String>, - #[prost(int64, tag = "7")] - pub created_at: i64, - #[prost(int64, tag = "8")] - pub updated_at: i64, - #[prost(int64, optional, tag = "9")] - pub archived_at: ::core::option::Option, - #[prost(string, tag = "10")] - pub cwd: ::prost::alloc::string::String, - #[prost(string, tag = "11")] - pub cli_version: ::prost::alloc::string::String, - #[prost(message, optional, tag = "12")] - pub source: ::core::option::Option, - #[prost(message, optional, tag = "13")] - pub git_info: ::core::option::Option, - #[prost(string, optional, tag = "14")] - pub agent_nickname: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "15")] - pub agent_role: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "16")] - pub agent_path: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "17")] - pub reasoning_effort: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "18")] - pub first_user_message: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "19")] - pub rollout_path: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "20")] - pub approval_mode_json: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "21")] - pub sandbox_policy_json: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "22")] - pub token_usage_json: ::core::option::Option<::prost::alloc::string::String>, - #[prost(message, optional, tag = "23")] - pub history: ::core::option::Option, - #[prost(string, optional, tag = "24")] - pub thread_source: ::core::option::Option<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SessionSource { - #[prost(enumeration = "SessionSourceKind", tag = "1")] - pub kind: i32, - #[prost(string, optional, tag = "2")] - pub custom: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "3")] - pub sub_agent_parent_thread_id: ::core::option::Option<::prost::alloc::string::String>, - #[prost(int32, optional, tag = "4")] - pub sub_agent_depth: ::core::option::Option, - #[prost(string, optional, tag = "5")] - pub sub_agent_other: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "6")] - pub sub_agent_path: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "7")] - pub sub_agent_nickname: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "8")] - pub sub_agent_role: ::core::option::Option<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GitInfo { - #[prost(string, optional, tag = "1")] - pub sha: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "2")] - pub branch: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag = "3")] - pub origin_url: ::core::option::Option<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct UpdateThreadMetadataRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, - #[prost(message, optional, tag = "2")] - pub patch: ::core::option::Option, - #[prost(bool, tag = "3")] - pub include_archived: bool, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ThreadMetadataPatch { - #[prost(string, optional, tag = "1")] - pub name: ::core::option::Option<::prost::alloc::string::String>, - #[prost(enumeration = "ThreadMemoryMode", optional, tag = "2")] - pub memory_mode: ::core::option::Option, - #[prost(message, optional, tag = "3")] - pub git_info: ::core::option::Option, -} -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GitInfoPatch { - #[prost(message, optional, tag = "1")] - pub sha: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub branch: ::core::option::Option, - #[prost(message, optional, tag = "3")] - pub origin_url: ::core::option::Option, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct OptionalStringPatch { - #[prost(enumeration = "OptionalStringPatchKind", tag = "1")] - pub kind: i32, - #[prost(string, optional, tag = "2")] - pub value: ::core::option::Option<::prost::alloc::string::String>, -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ArchiveThreadRequest { - #[prost(string, tag = "1")] - pub thread_id: ::prost::alloc::string::String, -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum ThreadSortKey { - CreatedAt = 0, - UpdatedAt = 1, -} -impl ThreadSortKey { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::CreatedAt => "THREAD_SORT_KEY_CREATED_AT", - Self::UpdatedAt => "THREAD_SORT_KEY_UPDATED_AT", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "THREAD_SORT_KEY_CREATED_AT" => Some(Self::CreatedAt), - "THREAD_SORT_KEY_UPDATED_AT" => Some(Self::UpdatedAt), - _ => None, - } - } -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum SortDirection { - Asc = 0, - Desc = 1, -} -impl SortDirection { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Asc => "SORT_DIRECTION_ASC", - Self::Desc => "SORT_DIRECTION_DESC", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "SORT_DIRECTION_ASC" => Some(Self::Asc), - "SORT_DIRECTION_DESC" => Some(Self::Desc), - _ => None, - } - } -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum SessionSourceKind { - Unknown = 0, - Cli = 1, - Vscode = 2, - Exec = 3, - AppServer = 4, - Custom = 5, - SubAgentReview = 6, - SubAgentCompact = 7, - SubAgentThreadSpawn = 8, - SubAgentMemoryConsolidation = 9, - SubAgentOther = 10, -} -impl SessionSourceKind { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Unknown => "SESSION_SOURCE_KIND_UNKNOWN", - Self::Cli => "SESSION_SOURCE_KIND_CLI", - Self::Vscode => "SESSION_SOURCE_KIND_VSCODE", - Self::Exec => "SESSION_SOURCE_KIND_EXEC", - Self::AppServer => "SESSION_SOURCE_KIND_APP_SERVER", - Self::Custom => "SESSION_SOURCE_KIND_CUSTOM", - Self::SubAgentReview => "SESSION_SOURCE_KIND_SUB_AGENT_REVIEW", - Self::SubAgentCompact => "SESSION_SOURCE_KIND_SUB_AGENT_COMPACT", - Self::SubAgentThreadSpawn => "SESSION_SOURCE_KIND_SUB_AGENT_THREAD_SPAWN", - Self::SubAgentMemoryConsolidation => { - "SESSION_SOURCE_KIND_SUB_AGENT_MEMORY_CONSOLIDATION" - } - Self::SubAgentOther => "SESSION_SOURCE_KIND_SUB_AGENT_OTHER", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "SESSION_SOURCE_KIND_UNKNOWN" => Some(Self::Unknown), - "SESSION_SOURCE_KIND_CLI" => Some(Self::Cli), - "SESSION_SOURCE_KIND_VSCODE" => Some(Self::Vscode), - "SESSION_SOURCE_KIND_EXEC" => Some(Self::Exec), - "SESSION_SOURCE_KIND_APP_SERVER" => Some(Self::AppServer), - "SESSION_SOURCE_KIND_CUSTOM" => Some(Self::Custom), - "SESSION_SOURCE_KIND_SUB_AGENT_REVIEW" => Some(Self::SubAgentReview), - "SESSION_SOURCE_KIND_SUB_AGENT_COMPACT" => Some(Self::SubAgentCompact), - "SESSION_SOURCE_KIND_SUB_AGENT_THREAD_SPAWN" => Some(Self::SubAgentThreadSpawn), - "SESSION_SOURCE_KIND_SUB_AGENT_MEMORY_CONSOLIDATION" => { - Some(Self::SubAgentMemoryConsolidation) - } - "SESSION_SOURCE_KIND_SUB_AGENT_OTHER" => Some(Self::SubAgentOther), - _ => None, - } - } -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum ThreadMemoryMode { - Enabled = 0, - Disabled = 1, -} -impl ThreadMemoryMode { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Enabled => "THREAD_MEMORY_MODE_ENABLED", - Self::Disabled => "THREAD_MEMORY_MODE_DISABLED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "THREAD_MEMORY_MODE_ENABLED" => Some(Self::Enabled), - "THREAD_MEMORY_MODE_DISABLED" => Some(Self::Disabled), - _ => None, - } - } -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum OptionalStringPatchKind { - Unset = 0, - Clear = 1, - Set = 2, -} -impl OptionalStringPatchKind { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Unset => "OPTIONAL_STRING_PATCH_KIND_UNSET", - Self::Clear => "OPTIONAL_STRING_PATCH_KIND_CLEAR", - Self::Set => "OPTIONAL_STRING_PATCH_KIND_SET", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "OPTIONAL_STRING_PATCH_KIND_UNSET" => Some(Self::Unset), - "OPTIONAL_STRING_PATCH_KIND_CLEAR" => Some(Self::Clear), - "OPTIONAL_STRING_PATCH_KIND_SET" => Some(Self::Set), - _ => None, - } - } -} -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum ThreadEventPersistenceMode { - Limited = 0, - Extended = 1, -} -impl ThreadEventPersistenceMode { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Limited => "THREAD_EVENT_PERSISTENCE_MODE_LIMITED", - Self::Extended => "THREAD_EVENT_PERSISTENCE_MODE_EXTENDED", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "THREAD_EVENT_PERSISTENCE_MODE_LIMITED" => Some(Self::Limited), - "THREAD_EVENT_PERSISTENCE_MODE_EXTENDED" => Some(Self::Extended), - _ => None, - } - } -} -/// Generated client implementations. -pub mod thread_store_client { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value - )] - use tonic::codegen::http::Uri; - use tonic::codegen::*; - #[derive(Debug, Clone)] - pub struct ThreadStoreClient { - inner: tonic::client::Grpc, - } - impl ThreadStoreClient { - /// Attempt to create a new client by connecting to a given endpoint. - pub async fn connect(dst: D) -> Result - where - D: TryInto, - D::Error: Into, - { - let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; - Ok(Self::new(conn)) - } - } - impl ThreadStoreClient - where - T: tonic::client::GrpcService, - T::Error: Into, - T::ResponseBody: Body + std::marker::Send + 'static, - ::Error: Into + std::marker::Send, - { - pub fn new(inner: T) -> Self { - let inner = tonic::client::Grpc::new(inner); - Self { inner } - } - pub fn with_origin(inner: T, origin: Uri) -> Self { - let inner = tonic::client::Grpc::with_origin(inner, origin); - Self { inner } - } - pub fn with_interceptor( - inner: T, - interceptor: F, - ) -> ThreadStoreClient> - where - F: tonic::service::Interceptor, - T::ResponseBody: Default, - T: tonic::codegen::Service< - http::Request, - Response = http::Response< - >::ResponseBody, - >, - >, - >>::Error: - Into + std::marker::Send + std::marker::Sync, - { - ThreadStoreClient::new(InterceptedService::new(inner, interceptor)) - } - /// Compress requests with the given encoding. - /// - /// This requires the server to support it otherwise it might respond with an - /// error. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.send_compressed(encoding); - self - } - /// Enable decompressing responses. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.inner = self.inner.accept_compressed(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_decoding_message_size(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.inner = self.inner.max_encoding_message_size(limit); - self - } - pub async fn create_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/CreateThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "CreateThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn resume_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/ResumeThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "ResumeThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn append_items( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/AppendItems", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "AppendItems", - )); - self.inner.unary(req, path, codec).await - } - pub async fn persist_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/PersistThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "PersistThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn flush_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/FlushThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "FlushThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn shutdown_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/ShutdownThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "ShutdownThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn discard_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/DiscardThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "DiscardThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn load_history( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> - { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/LoadHistory", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "LoadHistory", - )); - self.inner.unary(req, path, codec).await - } - pub async fn read_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> - { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/ReadThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "ReadThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn list_threads( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> - { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/ListThreads", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "ListThreads", - )); - self.inner.unary(req, path, codec).await - } - pub async fn update_thread_metadata( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> - { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/UpdateThreadMetadata", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "UpdateThreadMetadata", - )); - self.inner.unary(req, path, codec).await - } - pub async fn archive_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/ArchiveThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "ArchiveThread", - )); - self.inner.unary(req, path, codec).await - } - pub async fn unarchive_thread( - &mut self, - request: impl tonic::IntoRequest, - ) -> std::result::Result, tonic::Status> - { - self.inner.ready().await.map_err(|e| { - tonic::Status::unknown(format!("Service was not ready: {}", e.into())) - })?; - let codec = tonic_prost::ProstCodec::default(); - let path = http::uri::PathAndQuery::from_static( - "/codex.thread_store.v1.ThreadStore/UnarchiveThread", - ); - let mut req = request.into_request(); - req.extensions_mut().insert(GrpcMethod::new( - "codex.thread_store.v1.ThreadStore", - "UnarchiveThread", - )); - self.inner.unary(req, path, codec).await - } - } -} -/// Generated server implementations. -pub mod thread_store_server { - #![allow( - unused_variables, - dead_code, - missing_docs, - clippy::wildcard_imports, - clippy::let_unit_value - )] - use tonic::codegen::*; - /// Generated trait containing gRPC methods that should be implemented for use with ThreadStoreServer. - #[async_trait] - pub trait ThreadStore: std::marker::Send + std::marker::Sync + 'static { - async fn create_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn resume_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn append_items( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn persist_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn flush_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn shutdown_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn discard_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn load_history( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> - { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn read_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> - { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn list_threads( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status>; - async fn update_thread_metadata( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> - { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn archive_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - async fn unarchive_thread( - &self, - request: tonic::Request, - ) -> std::result::Result, tonic::Status> - { - let _ = request; - Err(tonic::Status::unimplemented("not implemented")) - } - } - #[derive(Debug)] - pub struct ThreadStoreServer { - inner: Arc, - accept_compression_encodings: EnabledCompressionEncodings, - send_compression_encodings: EnabledCompressionEncodings, - max_decoding_message_size: Option, - max_encoding_message_size: Option, - } - impl ThreadStoreServer { - pub fn new(inner: T) -> Self { - Self::from_arc(Arc::new(inner)) - } - pub fn from_arc(inner: Arc) -> Self { - Self { - inner, - accept_compression_encodings: Default::default(), - send_compression_encodings: Default::default(), - max_decoding_message_size: None, - max_encoding_message_size: None, - } - } - pub fn with_interceptor(inner: T, interceptor: F) -> InterceptedService - where - F: tonic::service::Interceptor, - { - InterceptedService::new(Self::new(inner), interceptor) - } - /// Enable decompressing requests with the given encoding. - #[must_use] - pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.accept_compression_encodings.enable(encoding); - self - } - /// Compress responses with the given encoding, if the client supports it. - #[must_use] - pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { - self.send_compression_encodings.enable(encoding); - self - } - /// Limits the maximum size of a decoded message. - /// - /// Default: `4MB` - #[must_use] - pub fn max_decoding_message_size(mut self, limit: usize) -> Self { - self.max_decoding_message_size = Some(limit); - self - } - /// Limits the maximum size of an encoded message. - /// - /// Default: `usize::MAX` - #[must_use] - pub fn max_encoding_message_size(mut self, limit: usize) -> Self { - self.max_encoding_message_size = Some(limit); - self - } - } - impl tonic::codegen::Service> for ThreadStoreServer - where - T: ThreadStore, - B: Body + std::marker::Send + 'static, - B::Error: Into + std::marker::Send + 'static, - { - type Response = http::Response; - type Error = std::convert::Infallible; - type Future = BoxFuture; - fn poll_ready( - &mut self, - _cx: &mut Context<'_>, - ) -> Poll> { - Poll::Ready(Ok(())) - } - fn call(&mut self, req: http::Request) -> Self::Future { - macro_rules! unary_service { - ($svc:ident, $request:ty, $response:ty, $method:ident) => {{ - #[allow(non_camel_case_types)] - struct $svc(pub Arc); - impl tonic::server::UnaryService<$request> for $svc { - type Response = $response; - type Future = BoxFuture, tonic::Status>; - fn call(&mut self, request: tonic::Request<$request>) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = - async move { ::$method(&inner, request).await }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = $svc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - }}; - } - match req.uri().path() { - "/codex.thread_store.v1.ThreadStore/CreateThread" => unary_service!( - CreateThreadSvc, - super::CreateThreadRequest, - super::Empty, - create_thread - ), - "/codex.thread_store.v1.ThreadStore/ResumeThread" => unary_service!( - ResumeThreadSvc, - super::ResumeThreadRequest, - super::Empty, - resume_thread - ), - "/codex.thread_store.v1.ThreadStore/AppendItems" => unary_service!( - AppendItemsSvc, - super::AppendThreadItemsRequest, - super::Empty, - append_items - ), - "/codex.thread_store.v1.ThreadStore/PersistThread" => unary_service!( - PersistThreadSvc, - super::ThreadIdRequest, - super::Empty, - persist_thread - ), - "/codex.thread_store.v1.ThreadStore/FlushThread" => unary_service!( - FlushThreadSvc, - super::ThreadIdRequest, - super::Empty, - flush_thread - ), - "/codex.thread_store.v1.ThreadStore/ShutdownThread" => unary_service!( - ShutdownThreadSvc, - super::ThreadIdRequest, - super::Empty, - shutdown_thread - ), - "/codex.thread_store.v1.ThreadStore/DiscardThread" => unary_service!( - DiscardThreadSvc, - super::ThreadIdRequest, - super::Empty, - discard_thread - ), - "/codex.thread_store.v1.ThreadStore/LoadHistory" => unary_service!( - LoadHistorySvc, - super::LoadThreadHistoryRequest, - super::StoredThreadHistory, - load_history - ), - "/codex.thread_store.v1.ThreadStore/ReadThread" => unary_service!( - ReadThreadSvc, - super::ReadThreadRequest, - super::StoredThreadResponse, - read_thread - ), - "/codex.thread_store.v1.ThreadStore/ListThreads" => { - #[allow(non_camel_case_types)] - struct ListThreadsSvc(pub Arc); - impl tonic::server::UnaryService for ListThreadsSvc { - type Response = super::ListThreadsResponse; - type Future = BoxFuture, tonic::Status>; - fn call( - &mut self, - request: tonic::Request, - ) -> Self::Future { - let inner = Arc::clone(&self.0); - let fut = async move { - ::list_threads(&inner, request).await - }; - Box::pin(fut) - } - } - let accept_compression_encodings = self.accept_compression_encodings; - let send_compression_encodings = self.send_compression_encodings; - let max_decoding_message_size = self.max_decoding_message_size; - let max_encoding_message_size = self.max_encoding_message_size; - let inner = self.inner.clone(); - let fut = async move { - let method = ListThreadsSvc(inner); - let codec = tonic_prost::ProstCodec::default(); - let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config( - accept_compression_encodings, - send_compression_encodings, - ) - .apply_max_message_size_config( - max_decoding_message_size, - max_encoding_message_size, - ); - let res = grpc.unary(method, req).await; - Ok(res) - }; - Box::pin(fut) - } - "/codex.thread_store.v1.ThreadStore/UpdateThreadMetadata" => unary_service!( - UpdateThreadMetadataSvc, - super::UpdateThreadMetadataRequest, - super::StoredThreadResponse, - update_thread_metadata - ), - "/codex.thread_store.v1.ThreadStore/ArchiveThread" => unary_service!( - ArchiveThreadSvc, - super::ArchiveThreadRequest, - super::Empty, - archive_thread - ), - "/codex.thread_store.v1.ThreadStore/UnarchiveThread" => unary_service!( - UnarchiveThreadSvc, - super::ArchiveThreadRequest, - super::StoredThreadResponse, - unarchive_thread - ), - _ => Box::pin(async move { - let mut response = http::Response::new(tonic::body::Body::default()); - let headers = response.headers_mut(); - headers.insert( - tonic::Status::GRPC_STATUS, - (tonic::Code::Unimplemented as i32).into(), - ); - headers.insert( - http::header::CONTENT_TYPE, - tonic::metadata::GRPC_CONTENT_TYPE, - ); - Ok(response) - }), - } - } - } - impl Clone for ThreadStoreServer { - fn clone(&self) -> Self { - let inner = self.inner.clone(); - Self { - inner, - accept_compression_encodings: self.accept_compression_encodings, - send_compression_encodings: self.send_compression_encodings, - max_decoding_message_size: self.max_decoding_message_size, - max_encoding_message_size: self.max_encoding_message_size, - } - } - } - /// Generated gRPC service name - pub const SERVICE_NAME: &str = "codex.thread_store.v1.ThreadStore"; - impl tonic::server::NamedService for ThreadStoreServer { - const NAME: &'static str = SERVICE_NAME; - } -}