diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index e079e3af0e..56d2b3a04b 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 c656a791a6..fe156e07b4 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 c06ff8599a..754d1f9467 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 b04eb12a45..e5c0b2c53f 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 8394f9839e..3eb262bd2b 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 7d7de25515..2b0eafd00a 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 d2eeaf927f..0a82eaf536 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 c50c4d97af..ecbd73093c 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 f39c9a1826..079ee61f01 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 368ad769db..25f6697c7f 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 cf0ccbe544..e27002aefe 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 a19832717d..003f2786b0 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 4da4c1d378..0f8e83fe60 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 0b4afb54f9..0000000000 --- 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 4045467cac..0000000000 --- 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 a5daeff44a..c7f6b4eaed 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 b2b2b6417b..0000000000 --- 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 3322ecd142..0000000000 --- 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 cf562497f4..0000000000 --- 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 013b74c933..0000000000 --- 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 a5755afee0..0000000000 --- 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 c5b8fdc1d6..0000000000 --- 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; - } -}