From 27ec3c5ddce7b61352a40113c2e3827190e130da Mon Sep 17 00:00:00 2001 From: Caik Date: Sun, 22 Mar 2026 20:57:07 -0400 Subject: [PATCH 1/2] ci: upgrade container base image to Debian 13 (Trixie) Co-Authored-By: Claude Opus 4.6 (1M context) --- Dockerfile.artifacts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Dockerfile.artifacts b/Dockerfile.artifacts index 8fa876c7..996b5002 100644 --- a/Dockerfile.artifacts +++ b/Dockerfile.artifacts @@ -11,21 +11,20 @@ # # Build (CI): docker buildx build -f Dockerfile.artifacts --platform linux/amd64,linux/arm64 . # -# Runtime uses debian:bookworm-slim (same as Dockerfile.test) so the same binary that -# works in the test container works in CI/CD; avoids glibc/distroless compatibility issues. +# Runtime uses debian:trixie-slim (Debian 13) for latest glibc and security patches. # Stage: binary + permissions + writable data dir ARG TARGETARCH -FROM debian:bookworm-slim AS base +FROM debian:trixie-slim AS base ARG TARGETARCH COPY binaries/linux-${TARGETARCH}/vectorizer /vectorizer/vectorizer RUN chmod +x /vectorizer/vectorizer && \ mkdir -p /vectorizer/data && chown -R 65532:65532 /vectorizer # ============================================================================ -# RUNTIME IMAGE - Debian slim (same base as Dockerfile.test, proven to work) +# RUNTIME IMAGE - Debian 13 (Trixie) slim # ============================================================================ -FROM debian:bookworm-slim AS vectorizer +FROM debian:trixie-slim AS vectorizer ARG BUILD_DATE ARG GIT_COMMIT_ID From c29e2ffd2d5d7453dcf129c181c557d2568f61c7 Mon Sep 17 00:00:00 2001 From: Caik Date: Tue, 24 Mar 2026 11:44:21 -0400 Subject: [PATCH 2/2] =?UTF-8?q?release:=20v2.5.1=20=E2=80=94=20HA=20failov?= =?UTF-8?q?er=20watcher,=20dependency=20upgrades,=20bug=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Features: - Add Raft leadership watcher (src/cluster/raft_watcher.rs) that bridges openraft consensus elections to HaManager role transitions, enabling automatic master/replica failover in Kubernetes clusters - Watcher uses zero-cost tokio::sync::watch subscription (no polling) - Leader address resolved from Raft state machine with K8s env var support (HOSTNAME, VECTORIZER_SERVICE_NAME, POD_IP) Bug fixes: - Fix snapshot spam on empty replicas: early-exit when .vecdb doesn't exist, downgrade "no data" errors to debug level in auto_save - Add exponential backoff (5s→60s cap) to replica reconnect, reducing log noise from ~12/min to ~1/min when master is unreachable - Add 5s TCP connection timeout to replica, replacing OS-level timeout (30-120s) for faster failure detection in Kubernetes Dependency upgrades (all Dependabot PRs resolved): - bincode 1.3→2.0.1 with codec wrapper module for wire-format compatibility - tonic 0.12→0.14.5, prost 0.13→0.14.3 (coordinated upgrade, eliminates duplicate crate versions), tonic-prost/tonic-prost-build added - uuid 1.19→1.22, nix 0.30→0.31, hyper-util 0.1.19→0.1.20 - tar, openssl, futures, tempfile, rustls (patch bumps via cargo update) - docker/metadata-action v5→v6 in CI workflow Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/release-artifacts.yml | 2 +- Cargo.lock | 3091 +++++++++++----------- Cargo.toml | 20 +- README.md | 31 +- build.rs | 6 +- docs/users/guides/HA_CLUSTER.md | 437 +++ src/cluster/grpc_service.rs | 14 +- src/cluster/mod.rs | 2 + src/cluster/raft_node.rs | 14 +- src/cluster/raft_watcher.rs | 228 ++ src/codec.rs | 63 + src/db/auto_save.rs | 14 +- src/embedding/cache.rs | 4 +- src/error.rs | 4 +- src/grpc/qdrant/qdrant.rs | 582 ++-- src/grpc/vectorizer.cluster.rs | 126 +- src/grpc/vectorizer.rs | 122 +- src/lib.rs | 1 + src/normalization/cache/blob_store.rs | 4 +- src/normalization/cache/warm_store.rs | 4 +- src/normalization/hasher.rs | 6 +- src/persistence/mod.rs | 4 +- src/quantization/storage.rs | 19 +- src/replication/durable_log.rs | 6 +- src/replication/master.rs | 8 +- src/replication/replica.rs | 46 +- src/replication/sync.rs | 926 +++---- src/replication/tests.rs | 6 +- src/replication/types.rs | 2 +- src/server/mod.rs | 12 +- src/storage/advanced.rs | 6 +- src/storage/snapshot.rs | 75 +- tests/integration/cluster_multitenant.rs | 12 +- 33 files changed, 3256 insertions(+), 2641 deletions(-) create mode 100644 docs/users/guides/HA_CLUSTER.md create mode 100644 src/cluster/raft_watcher.rs create mode 100644 src/codec.rs mode change 100755 => 100644 src/grpc/qdrant/qdrant.rs mode change 100755 => 100644 src/grpc/vectorizer.cluster.rs mode change 100755 => 100644 src/grpc/vectorizer.rs diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml index a3cd36c4..3fa6aa4e 100755 --- a/.github/workflows/release-artifacts.yml +++ b/.github/workflows/release-artifacts.yml @@ -294,7 +294,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Docker metadata (tags + labels) id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ghcr.io/${{ github.repository }} tags: | diff --git a/Cargo.lock b/Cargo.lock index 5366fe04..60638534 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,10 +7,6 @@ name = "Inflector" version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] [[package]] name = "ab_glyph" @@ -28,15 +24,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -99,7 +86,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "version_check", ] @@ -121,13 +108,22 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.6.4" @@ -184,9 +180,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anndists" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4bbb2296f2525e53a52680f5c2df6de9a83b8a94cc22a8cc629301a27b5e0b7" +checksum = "8238f99889a837cd6641360f9f3ead18f70b07bf6ce1f04a319bc6bd8a2f48f1" dependencies = [ "anyhow", "cfg-if", @@ -201,9 +197,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -216,37 +212,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -260,12 +256,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" -dependencies = [ - "backtrace", -] +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "approx" @@ -287,9 +280,12 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.7.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "a07d1f37ff60921c83bdfc7407723bdefe89b44b98a9b772f225c8f9d67141a6" +dependencies = [ + "rustversion", +] [[package]] name = "arg_enum_proc_macro" @@ -299,7 +295,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -316,9 +312,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "arrow" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb372a7cbcac02a35d3fb7b3fc1f969ec078e871f9bb899bf00a2e1809bec8a3" +checksum = "e4754a624e5ae42081f464514be454b39711daae0458906dacde5f4c632f33a8" dependencies = [ "arrow-arith", "arrow-array", @@ -337,9 +333,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f377dcd19e440174596d83deb49cd724886d91060c07fec4f67014ef9d54049" +checksum = "f7b3141e0ec5145a22d8694ea8b6d6f69305971c4fa1c1a13ef0195aef2d678b" dependencies = [ "arrow-array", "arrow-buffer", @@ -351,9 +347,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eaff85a44e9fa914660fb0d0bb00b79c4a3d888b5334adb3ea4330c84f002" +checksum = "4c8955af33b25f3b175ee10af580577280b4bd01f7e823d94c7cdef7cf8c9aef" dependencies = [ "ahash 0.8.12", "arrow-buffer", @@ -361,7 +357,7 @@ dependencies = [ "arrow-schema", "chrono", "half 2.7.1", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "num-complex", "num-integer", "num-traits", @@ -369,9 +365,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2819d893750cb3380ab31ebdc8c68874dd4429f90fd09180f3c93538bd21626" +checksum = "c697ddca96183182f35b3a18e50b9110b11e916d7b7799cbfd4d34662f2c56c2" dependencies = [ "bytes", "half 2.7.1", @@ -381,9 +377,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d131abb183f80c450d4591dc784f8d7750c50c6e2bc3fcaad148afc8361271" +checksum = "646bbb821e86fd57189c10b4fcdaa941deaf4181924917b0daa92735baa6ada5" dependencies = [ "arrow-array", "arrow-buffer", @@ -402,9 +398,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275877a0e5e7e7c76954669366c2aa1a829e340ab1f612e647507860906fb6b" +checksum = "8da746f4180004e3ce7b83c977daf6394d768332349d3d913998b10a120b790a" dependencies = [ "arrow-array", "arrow-cast", @@ -417,9 +413,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05738f3d42cb922b9096f7786f606fcb8669260c2640df8490533bb2fa38c9d3" +checksum = "1fdd994a9d28e6365aa78e15da3f3950c0fdcea6b963a12fa1c391afb637b304" dependencies = [ "arrow-buffer", "arrow-schema", @@ -430,9 +426,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d09446e8076c4b3f235603d9ea7c5494e73d441b01cd61fb33d7254c11964b3" +checksum = "abf7df950701ab528bf7c0cf7eeadc0445d03ef5d6ffc151eaae6b38a58feff1" dependencies = [ "arrow-array", "arrow-buffer", @@ -444,9 +440,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "371ffd66fa77f71d7628c63f209c9ca5341081051aa32f9c8020feb0def787c0" +checksum = "0ff8357658bedc49792b13e2e862b80df908171275f8e6e075c460da5ee4bf86" dependencies = [ "arrow-array", "arrow-buffer", @@ -455,7 +451,7 @@ dependencies = [ "arrow-schema", "chrono", "half 2.7.1", - "indexmap 2.11.4", + "indexmap", "itoa", "lexical-core", "memchr", @@ -468,9 +464,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc94fc7adec5d1ba9e8cd1b1e8d6f72423b33fe978bf1f46d970fafab787521" +checksum = "f7d8f1870e03d4cbed632959498bcc84083b5a24bded52905ae1695bd29da45b" dependencies = [ "arrow-array", "arrow-buffer", @@ -481,9 +477,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "169676f317157dc079cc5def6354d16db63d8861d61046d2f3883268ced6f99f" +checksum = "18228633bad92bff92a95746bbeb16e5fc318e8382b75619dec26db79e4de4c0" dependencies = [ "arrow-array", "arrow-buffer", @@ -494,15 +490,15 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27609cd7dd45f006abae27995c2729ef6f4b9361cde1ddd019dc31a5aa017e0" +checksum = "8c872d36b7bf2a6a6a2b40de9156265f0242910791db366a2c17476ba8330d68" [[package]] name = "arrow-select" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae980d021879ea119dd6e2a13912d81e64abed372d53163e804dfe84639d8010" +checksum = "68bf3e3efbd1278f770d67e5dc410257300b161b93baedb3aae836144edcaf4b" dependencies = [ "ahash 0.8.12", "arrow-array", @@ -514,9 +510,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf35e8ef49dcf0c5f6d175edee6b8af7b45611805333129c541a8b89a0fc0534" +checksum = "85e968097061b3c0e9fe3079cf2e703e487890700546b5b0647f60fca1b5a8d8" dependencies = [ "arrow-array", "arrow-buffer", @@ -529,33 +525,81 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ascii_utils" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" +[[package]] +name = "asn1-rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom 7.1.3", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "async-graphql" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036618f842229ba0b89652ffe425f96c7c16a49f7e3cb23b56fca7f61fd74980" +checksum = "1057a9f7ccf2404d94571dec3451ade1cb524790df6f1ada0d19c2a49f6b0f40" dependencies = [ "async-graphql-derive", "async-graphql-parser", "async-graphql-value", - "async-stream", + "async-io", "async-trait", + "asynk-strim", "base64 0.22.1", "bytes", "chrono", "fast_chemail", "fnv", - "futures-timer", "futures-util", "handlebars", "http", - "indexmap 2.11.4", + "indexmap", "mime", "multer", "num-traits", @@ -566,18 +610,18 @@ dependencies = [ "serde_urlencoded", "static_assertions_next", "tempfile", - "thiserror 1.0.69", + "thiserror 2.0.18", "uuid", ] [[package]] name = "async-graphql-axum" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725874ecfbf399e071150b8619c4071d7b2b7a2f117e173dddef53c6bdb6bb1" +checksum = "a1e37c5532e4b686acf45e7162bc93da91fc2c702fb0d465efc2c20c8f973795" dependencies = [ "async-graphql", - "axum 0.8.7", + "axum", "bytes", "futures-util", "serde_json", @@ -589,26 +633,26 @@ dependencies = [ [[package]] name = "async-graphql-derive" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd45deb3dbe5da5cdb8d6a670a7736d735ba65b455328440f236dfb113727a3d" +checksum = "2e6cbeadc8515e66450fba0985ce722192e28443697799988265d86304d7cc68" dependencies = [ "Inflector", "async-graphql-parser", - "darling 0.20.11", + "darling 0.23.0", "proc-macro-crate", "proc-macro2", "quote", "strum", - "syn 2.0.106", - "thiserror 1.0.69", + "syn 2.0.117", + "thiserror 2.0.18", ] [[package]] name = "async-graphql-parser" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b7607e59424a35dadbc085b0d513aa54ec28160ee640cf79ec3b634eba66d3" +checksum = "e64ef70f77a1c689111e52076da1cd18f91834bcb847de0a9171f83624b07fbf" dependencies = [ "async-graphql-value", "pest", @@ -618,47 +662,53 @@ dependencies = [ [[package]] name = "async-graphql-value" -version = "7.0.17" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecdaff7c9cffa3614a9f9999bf9ee4c3078fe3ce4d6a6e161736b56febf2de" +checksum = "3e3ef112905abea9dea592fc868a6873b10ebd3f983e83308f995d6284e9ba41" dependencies = [ "bytes", - "indexmap 2.11.4", + "indexmap", "serde", "serde_json", ] [[package]] -name = "async-stream" -version = "0.3.6" +name = "async-io" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", ] [[package]] -name = "async-stream-impl" -version = "0.3.6" +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] -name = "async-trait" -version = "0.1.89" +name = "asynk-strim" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "52697735bdaac441a29391a9e97102c74c6ef0f9b60a40cf109b1b404e29d2f6" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "futures-core", + "pin-project-lite", ] [[package]] @@ -682,34 +732,54 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey 0.1.1", + "rayon", + "thiserror 2.0.18", + "v_frame", + "y4m", +] + [[package]] name = "av1-grain" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ "anyhow", "arrayvec", "log", - "nom", + "nom 8.0.0", "num-rational", "v_frame", ] [[package]] name = "avif-serialize" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" dependencies = [ "arrayvec", ] [[package]] name = "aws-lc-rs" -version = "1.14.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", "zeroize", @@ -717,11 +787,10 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.32.3" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "107a4e9d9cab9963e04e84bb8dee0e25f2a987f9a8bad5ed054abd439caa8f8c" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" dependencies = [ - "bindgen", "cc", "cmake", "dunce", @@ -730,38 +799,11 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core 0.4.5", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ - "axum-core 0.5.5", + "axum-core", "base64 0.22.1", "bytes", "form_urlencoded", @@ -772,7 +814,7 @@ dependencies = [ "hyper", "hyper-util", "itoa", - "matchit 0.8.4", + "matchit", "memchr", "mime", "multer", @@ -786,7 +828,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-tungstenite 0.28.0", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", @@ -794,29 +836,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", @@ -831,21 +853,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link 0.2.1", -] - [[package]] name = "base16ct" version = "0.2.0" @@ -866,9 +873,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bcrypt" @@ -893,32 +900,23 @@ dependencies = [ ] [[package]] -name = "bindgen" -version = "0.72.1" +name = "bincode" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" dependencies = [ - "bitflags 2.9.4", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.106", + "bincode_derive", + "serde", + "unty", ] [[package]] -name = "bit-set" -version = "0.5.3" +name = "bincode_derive" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" dependencies = [ - "bit-vec 0.6.3", + "virtue", ] [[package]] @@ -927,15 +925,9 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec 0.8.0", + "bit-vec", ] -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bit-vec" version = "0.8.0" @@ -956,24 +948,27 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "bitpacking" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c1d3e2bfd8d06048a179f7b17afc3188effa10385e7b00dc65af6aae732ea92" +checksum = "96a7139abd3d9cebf8cd6f920a389cf3dc9576172e32f4563f188cae3c3eb019" dependencies = [ "crunchy", ] [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] [[package]] name = "bitvec" @@ -989,15 +984,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", - "constant_time_eq", + "constant_time_eq 0.4.2", + "cpufeatures", ] [[package]] @@ -1024,6 +1020,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "blowfish" version = "0.9.1" @@ -1036,9 +1041,9 @@ dependencies = [ [[package]] name = "bon" -version = "3.8.1" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebeb9aaf9329dff6ceb65c689ca3db33dbf15f324909c60e4e5eef5701ce31b1" +checksum = "f47dbe92550676ee653353c310dfb9cf6ba17ee70396e1f7cf0a2020ad49b2fe" dependencies = [ "bon-macros", "rustversion", @@ -1046,17 +1051,17 @@ dependencies = [ [[package]] name = "bon-macros" -version = "3.8.1" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e9d642a7e3a318e37c2c9427b5a6a48aa1ad55dcd986f3034ab2239045a645" +checksum = "519bd3116aeeb42d5372c29d982d16d0170d3d4a5ed85fc7dd91642ffff3c67c" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "ident_case", "prettyplease", "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -1080,7 +1085,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -1106,15 +1111,15 @@ dependencies = [ [[package]] name = "built" -version = "0.7.7" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byte-unit" @@ -1158,9 +1163,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -1173,7 +1178,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -1190,9 +1195,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" dependencies = [ "serde", ] @@ -1208,13 +1213,15 @@ dependencies = [ [[package]] name = "candle-core" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f51e2ecf6efe9737af8f993433c839f956d2b6ed4fd2dd4a7c6d8b0fa667ff" +checksum = "c15b675b80d994b2eadb20a4bbe434eabeb454eac3ee5e2b4cf6f147ee9be091" dependencies = [ "byteorder", - "gemm 0.17.1", + "float8", + "gemm", "half 2.7.1", + "libm", "memmap2", "num-traits", "num_cpus", @@ -1222,37 +1229,37 @@ dependencies = [ "rand_distr 0.5.1", "rayon", "safetensors", - "thiserror 1.0.69", - "ug", - "yoke 0.7.5", - "zip 1.1.4", + "thiserror 2.0.18", + "yoke", + "zip 7.2.0", ] [[package]] name = "candle-nn" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1980d53280c8f9e2c6cbe1785855d7ff8010208b46e21252b978badf13ad69d" +checksum = "3045fa9e7aef8567d209a27d56b692f60b96f4d0569f4c3011f8ca6715c65e03" dependencies = [ "candle-core", "half 2.7.1", + "libc", "num-traits", "rayon", "safetensors", "serde", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "candle-transformers" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186cb80045dbe47e0b387ea6d3e906f02fb3056297080d9922984c90e90a72b0" +checksum = "b538ec4aa807c416a2ddd3621044888f188827862e2a6fcacba4738e89795d01" dependencies = [ "byteorder", "candle-core", "candle-nn", - "fancy-regex 0.13.0", + "fancy-regex 0.17.0", "num-traits", "rand 0.9.2", "rayon", @@ -1297,9 +1304,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.49" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "jobserver", @@ -1313,15 +1320,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f4c707c6a209cbe82d10abd08e1ea8995e9ea937d2550646e02798948992be0" -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfb" version = "0.10.0" @@ -1333,16 +1331,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec 1.15.1", - "target-lexicon", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -1357,9 +1345,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -1406,22 +1394,11 @@ dependencies = [ "inout", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" -version = "4.5.49" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4512b90fa68d3a9932cea5184017c5d200f5921df706d45e853537dea51508f" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -1429,9 +1406,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.49" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0025e98baa12e766c67ba13ff4695a887a1eba19569aad00a472546795bd6730" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -1442,27 +1419,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "clap_lex" -version = "0.7.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" dependencies = [ "cc", ] @@ -1475,9 +1452,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" @@ -1525,6 +1502,15 @@ dependencies = [ "xdg", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.11" @@ -1540,13 +1526,12 @@ dependencies = [ [[package]] name = "console" -version = "0.16.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "once_cell", "unicode-width", "windows-sys 0.61.2", ] @@ -1592,7 +1577,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -1603,6 +1588,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + [[package]] name = "convert_case" version = "0.10.0" @@ -1622,6 +1613,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1635,7 +1636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "libc", ] @@ -1669,9 +1670,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] @@ -1693,9 +1694,9 @@ dependencies = [ [[package]] name = "criterion" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d883447757bb0ee46f233e9dc22eb84d93a9508c9b868687b274fc431d886bf" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" dependencies = [ "alloca", "anes", @@ -1719,9 +1720,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed943f81ea2faa8dcecbbfa50164acf95d555afec96a27871663b300e387b2e4" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" dependencies = [ "cast", "itertools 0.13.0", @@ -1803,9 +1804,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -1822,7 +1823,7 @@ dependencies = [ "dtoa-short", "itoa", "phf", - "smallvec 1.15.1", + "smallvec", ] [[package]] @@ -1832,26 +1833,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "csv" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -1867,12 +1868,12 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" dependencies = [ - "dispatch", - "nix 0.30.1", + "dispatch2", + "nix 0.31.2", "windows-sys 0.61.2", ] @@ -1900,7 +1901,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -1923,6 +1924,16 @@ dependencies = [ "darling_macro 0.21.3", ] +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + [[package]] name = "darling_core" version = "0.20.11" @@ -1934,7 +1945,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -1948,7 +1959,20 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", ] [[package]] @@ -1959,7 +1983,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -1970,7 +1994,18 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.117", ] [[package]] @@ -1998,15 +2033,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "deflate64" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" [[package]] name = "der" @@ -2015,15 +2050,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", - "pem-rfc7468", + "pem-rfc7468 0.7.0", "zeroize", ] +[[package]] +name = "der" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" +dependencies = [ + "pem-rfc7468 1.0.0", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom 7.1.3", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", "serde_core", @@ -2037,7 +2096,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2058,7 +2117,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2068,7 +2127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2079,7 +2138,7 @@ checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2101,7 +2160,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.106", + "syn 2.0.117", "unicode-xid", ] @@ -2166,10 +2225,16 @@ dependencies = [ ] [[package]] -name = "dispatch" -version = "0.2.0" +name = "dispatch2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] [[package]] name = "displaydoc" @@ -2179,26 +2244,26 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "doc-comment" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "docx-rs" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f21be13b97bd2924f30323d674f5a8db382964972825abd93f30d08f21dad98" +checksum = "70395eb132dcc1761533e62c54878a9deb2b637863ecb52e9c5f66148616398e" dependencies = [ "base64 0.22.1", - "image 0.24.9", + "image", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", "xml-rs", "zip 0.6.6", ] @@ -2211,9 +2276,9 @@ checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" [[package]] name = "dtoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" [[package]] name = "dtoa-short" @@ -2236,16 +2301,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" -[[package]] -name = "dyn-stack" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" -dependencies = [ - "bytemuck", - "reborrow", -] - [[package]] name = "dyn-stack" version = "0.13.2" @@ -2268,7 +2323,7 @@ version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.10", "digest", "elliptic-curve", "rfc6979", @@ -2325,7 +2380,7 @@ dependencies = [ "generic-array", "group", "hkdf", - "pem-rfc7468", + "pem-rfc7468 0.7.0", "pkcs8", "rand_core 0.6.4", "sec1", @@ -2363,14 +2418,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "env_filter" -version = "0.1.4" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" dependencies = [ "log", "regex", @@ -2378,9 +2433,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" dependencies = [ "anstream", "anstyle", @@ -2406,7 +2461,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2445,48 +2500,48 @@ dependencies = [ [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half 2.7.1", "lebe", "miniz_oxide", "rayon-core", - "smallvec 1.15.1", + "smallvec", "zune-inflate", ] [[package]] name = "fancy-regex" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" +checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" dependencies = [ - "bit-set 0.5.3", + "bit-set", "regex-automata", "regex-syntax", ] [[package]] name = "fancy-regex" -version = "0.14.0" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" +checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" dependencies = [ - "bit-set 0.8.0", + "bit-set", "regex-automata", "regex-syntax", ] [[package]] name = "fancy-regex" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" dependencies = [ - "bit-set 0.8.0", + "bit-set", "regex-automata", "regex-syntax", ] @@ -2508,15 +2563,17 @@ checksum = "9afc2bd4d5a73106dd53d10d73d3401c2f32730ba2c0b93ddb888a8983680471" [[package]] name = "fastembed" -version = "5.4.0" +version = "5.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d719825156b62586040fd0e5653a4f7bc0ad9caf6c7ec38cb18f1a08ee0384" +checksum = "3688aa7e02113db24e0f83aba1edee912f36f515b52cffc9b3c550bbfc3eab87" dependencies = [ "anyhow", "hf-hub", - "image 0.25.8", - "ndarray 0.16.1", + "image", + "ndarray 0.17.2", "ort", + "safetensors", + "serde", "serde_json", "tokenizers", ] @@ -2544,7 +2601,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2580,21 +2637,20 @@ checksum = "e7ef3d5e8ae27277c8285ac43ed153158178ef0f79567f32024ca8140a0c7cd8" [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.60.2", ] [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixedbitset" @@ -2604,23 +2660,35 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flatbuffers" -version = "25.9.23" +version = "25.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b6620799e7340ebd9968d2e0708eb82cf1971e9a16821e2091b6d6e475eed5" +checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "rustc_version", ] [[package]] name = "flate2" -version = "1.1.4" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", - "libz-rs-sys", "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "float8" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719a903cc23e4a89e87962c2a80fdb45cdaad0983a89bd150bb57b4c8571a7d5" +dependencies = [ + "half 2.7.1", + "num-traits", + "rand 0.9.2", + "rand_distr 0.5.1", ] [[package]] @@ -2668,7 +2736,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -2745,9 +2813,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -2760,9 +2828,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -2770,15 +2838,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -2787,32 +2855,42 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "futures-core", + "pin-project-lite", +] [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" @@ -2822,9 +2900,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2834,7 +2912,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2849,246 +2926,128 @@ dependencies = [ [[package]] name = "gemm" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-c32 0.17.1", - "gemm-c64 0.17.1", - "gemm-common 0.17.1", - "gemm-f16 0.17.1", - "gemm-f32 0.17.1", - "gemm-f64 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" -dependencies = [ - "dyn-stack 0.13.2", - "gemm-c32 0.18.2", - "gemm-c64 0.18.2", - "gemm-common 0.18.2", - "gemm-f16 0.18.2", - "gemm-f32 0.18.2", - "gemm-f64 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.6.0", - "seq-macro", -] - -[[package]] -name = "gemm-c32" -version = "0.17.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" +checksum = "aa0673db364b12263d103b68337a68fbecc541d6f6b61ba72fe438654709eacb" dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", + "dyn-stack", + "gemm-c32", + "gemm-c64", + "gemm-common", + "gemm-f16", + "gemm-f32", + "gemm-f64", "num-complex", "num-traits", "paste", - "raw-cpuid 10.7.0", + "raw-cpuid", "seq-macro", ] [[package]] name = "gemm-c32" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" +checksum = "086936dbdcb99e37aad81d320f98f670e53c1e55a98bee70573e83f95beb128c" dependencies = [ - "dyn-stack 0.13.2", - "gemm-common 0.18.2", + "dyn-stack", + "gemm-common", "num-complex", "num-traits", "paste", - "raw-cpuid 11.6.0", + "raw-cpuid", "seq-macro", ] [[package]] name = "gemm-c64" -version = "0.17.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" +checksum = "20c8aeeeec425959bda4d9827664029ba1501a90a0d1e6228e48bef741db3a3f" dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", + "dyn-stack", + "gemm-common", "num-complex", "num-traits", "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-c64" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" -dependencies = [ - "dyn-stack 0.13.2", - "gemm-common 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.6.0", + "raw-cpuid", "seq-macro", ] [[package]] name = "gemm-common" -version = "0.17.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" +checksum = "88027625910cc9b1085aaaa1c4bc46bb3a36aad323452b33c25b5e4e7c8e2a3e" dependencies = [ "bytemuck", - "dyn-stack 0.10.0", - "half 2.7.1", - "num-complex", - "num-traits", - "once_cell", - "paste", - "pulp 0.18.22", - "raw-cpuid 10.7.0", - "rayon", - "seq-macro", - "sysctl 0.5.5", -] - -[[package]] -name = "gemm-common" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" -dependencies = [ - "bytemuck", - "dyn-stack 0.13.2", + "dyn-stack", "half 2.7.1", "libm", "num-complex", "num-traits", "once_cell", "paste", - "pulp 0.21.5", - "raw-cpuid 11.6.0", + "pulp", + "raw-cpuid", "rayon", "seq-macro", - "sysctl 0.6.0", + "sysctl", ] [[package]] name = "gemm-f16" -version = "0.17.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" +checksum = "e3df7a55202e6cd6739d82ae3399c8e0c7e1402859b30e4cb780e61525d9486e" dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "gemm-f32 0.17.1", + "dyn-stack", + "gemm-common", + "gemm-f32", "half 2.7.1", "num-complex", "num-traits", "paste", - "raw-cpuid 10.7.0", + "raw-cpuid", "rayon", "seq-macro", ] -[[package]] -name = "gemm-f16" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" -dependencies = [ - "dyn-stack 0.13.2", - "gemm-common 0.18.2", - "gemm-f32 0.18.2", - "half 2.7.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.6.0", - "rayon", - "seq-macro", -] - -[[package]] -name = "gemm-f32" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" -dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - [[package]] name = "gemm-f32" -version = "0.18.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" +checksum = "02e0b8c9da1fbec6e3e3ab2ce6bc259ef18eb5f6f0d3e4edf54b75f9fd41a81c" dependencies = [ - "dyn-stack 0.13.2", - "gemm-common 0.18.2", + "dyn-stack", + "gemm-common", "num-complex", "num-traits", "paste", - "raw-cpuid 11.6.0", + "raw-cpuid", "seq-macro", ] [[package]] name = "gemm-f64" -version = "0.17.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" +checksum = "056131e8f2a521bfab322f804ccd652520c79700d81209e9d9275bbdecaadc6a" dependencies = [ - "dyn-stack 0.10.0", - "gemm-common 0.17.1", + "dyn-stack", + "gemm-common", "num-complex", "num-traits", "paste", - "raw-cpuid 10.7.0", - "seq-macro", -] - -[[package]] -name = "gemm-f64" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" -dependencies = [ - "dyn-stack 0.13.2", - "gemm-common 0.18.2", - "num-complex", - "num-traits", - "paste", - "raw-cpuid 11.6.0", + "raw-cpuid", "seq-macro", ] [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -3106,9 +3065,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -3126,11 +3085,24 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + [[package]] name = "ghash" version = "0.5.1" @@ -3143,19 +3115,13 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.3" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" dependencies = [ "color_quant", - "weezl", -] - -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + "weezl", +] [[package]] name = "glob" @@ -3165,9 +3131,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "governor" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e23d5986fd4364c2fb7498523540618b4b8d92eec6c36a02e565f66748e2f79" +checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8" dependencies = [ "cfg-if", "dashmap", @@ -3175,13 +3141,13 @@ dependencies = [ "futures-timer", "futures-util", "getrandom 0.3.4", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "nonzero_ext", "parking_lot", "portable-atomic", "quanta", "rand 0.9.2", - "smallvec 1.15.1", + "smallvec", "spinning_top", "web-time", ] @@ -3199,9 +3165,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", @@ -3209,7 +3175,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.4", + "indexmap", "slab", "tokio", "tokio-util", @@ -3242,16 +3208,18 @@ dependencies = [ [[package]] name = "handlebars" -version = "5.1.2" +version = "6.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +checksum = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e" dependencies = [ + "derive_builder", "log", + "num-order", "pest", "pest_derive", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] @@ -3282,13 +3250,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", + "serde", + "serde_core", ] [[package]] @@ -3335,9 +3305,9 @@ dependencies = [ [[package]] name = "hive-gpu" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d136aeb6e198a47681d4d415c76d842ab26cd1be491b8b63dfd822f17d5f1181" +checksum = "08575b83e79d3d09faa8291121069505d6a5531c041a14664716194cd4bb2e90" dependencies = [ "bytemuck", "half 1.8.3", @@ -3387,20 +3357,26 @@ dependencies = [ "digest", ] +[[package]] +name = "hmac-sha256" +version = "1.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9d92d097f4749b64e8cc33d924d9f40a2d4eb91402b458014b781f5733d60f" + [[package]] name = "hnsw_rs" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53dc5b9b07424143d016ba843c9b510f424e239118697f5d5d582f2d437df41" +checksum = "43a5258f079b97bf2e8311ff9579e903c899dcbac0d9a138d62e9a066778bd07" dependencies = [ "anndists", "anyhow", - "bincode", + "bincode 1.3.3", "cfg-if", "cpu-time", "env_logger", "hashbrown 0.15.5", - "indexmap 2.11.4", + "indexmap", "lazy_static", "log", "mmap-rs", @@ -3447,12 +3423,11 @@ checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -3515,7 +3490,7 @@ dependencies = [ "itoa", "pin-project-lite", "pin-utils", - "smallvec 1.15.1", + "smallvec", "tokio", "want", ] @@ -3534,7 +3509,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.3", + "webpki-roots 1.0.6", ] [[package]] @@ -3568,14 +3543,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -3584,7 +3558,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2", "system-configuration", "tokio", "tower-service", @@ -3603,9 +3577,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3627,22 +3601,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", - "yoke 0.8.0", + "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -3653,64 +3627,65 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", - "smallvec 1.15.1", + "smallvec", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", - "yoke 0.8.0", + "yoke", "zerofrom", "zerotrie", "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -3724,7 +3699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", - "smallvec 1.15.1", + "smallvec", "utf8_iter", ] @@ -3740,25 +3715,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "gif", - "jpeg-decoder", - "num-traits", - "png 0.17.16", - "tiff 0.9.1", -] - -[[package]] -name = "image" -version = "0.25.8" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", @@ -3768,12 +3727,12 @@ dependencies = [ "image-webp", "moxcms", "num-traits", - "png 0.18.0", + "png", "qoi", "ravif", "rayon", "rgb", - "tiff 0.10.3", + "tiff", "zune-core", "zune-jpeg", ] @@ -3796,8 +3755,8 @@ checksum = "2393fb7808960751a52e8a154f67e7dd3f8a2ef9bd80d1553078a7b4e8ed3f0d" dependencies = [ "ab_glyph", "approx", - "getrandom 0.2.16", - "image 0.25.8", + "getrandom 0.2.17", + "image", "itertools 0.12.1", "nalgebra", "num", @@ -3820,36 +3779,32 @@ checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" [[package]] name = "include-flate" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01b7cb6ca682a621e7cda1c358c9724b53a7b4409be9be1dd443b7f3a26f998" +checksum = "8a05fb00d9abc625268e0573a519506b264a7d6965de09bac13201bfb44e723d" dependencies = [ "include-flate-codegen", "include-flate-compress", - "libflate", - "zstd", ] [[package]] name = "include-flate-codegen" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f49bf5274aebe468d6e6eba14a977eaf1efa481dc173f361020de70c1c48050" +checksum = "92c3c319a7527668538a8530c541e74e881e94c4f41e1425622d0a41c16468af" dependencies = [ "include-flate-compress", - "libflate", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", - "zstd", + "syn 2.0.117", ] [[package]] name = "include-flate-compress" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae6a40e716bcd5931f5dbb79cd921512a4f647e2e9413fded3171fca3824dbc" +checksum = "ed0bd9ea81b94169d61c5a397e9faef02153d3711fc62d3270bcde3ac85380d9" dependencies = [ "libflate", "zstd", @@ -3857,22 +3812,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.11.4" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -3892,11 +3837,11 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" dependencies = [ - "console 0.16.1", + "console 0.16.3", "portable-atomic", "unicode-width", "unit-prefix", @@ -3905,11 +3850,11 @@ dependencies = [ [[package]] name = "inotify" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "inotify-sys", "libc", ] @@ -3947,20 +3892,20 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" dependencies = [ "memchr", "serde", @@ -3968,9 +3913,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -4001,32 +3946,32 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.15" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "log", "portable-atomic", "portable-atomic-util", - "serde", + "serde_core", ] [[package]] name = "jiff-static" -version = "0.2.15" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -4039,17 +3984,11 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" - [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -4057,13 +3996,13 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "10.2.0" +version = "10.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" +checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" dependencies = [ "base64 0.22.1", "ed25519-dalek", - "getrandom 0.2.16", + "getrandom 0.2.17", "hmac", "js-sys", "p256", @@ -4107,6 +4046,12 @@ dependencies = [ "spin", ] +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "lebe" version = "0.5.3" @@ -4184,9 +4129,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.178" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libflate" @@ -4208,15 +4153,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a599cb10a9cd92b1300debcef28da8f70b935ec937f44fcd1b70a7c986a11c5c" dependencies = [ "core2", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "rle-decode-fast", ] [[package]] name = "libfuzzer-sys" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" dependencies = [ "arbitrary", "cc", @@ -4224,9 +4169,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.9" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" dependencies = [ "cfg-if", "windows-link 0.2.1", @@ -4234,28 +4179,20 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "libc", - "redox_syscall", -] - -[[package]] -name = "libz-rs-sys" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" -dependencies = [ - "zlib-rs", + "plain", + "redox_syscall 0.7.3", ] [[package]] @@ -4266,15 +4203,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" @@ -4287,9 +4224,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loop9" @@ -4308,11 +4245,11 @@ checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff" dependencies = [ "encoding_rs", "flate2", - "indexmap 2.11.4", + "indexmap", "itoa", "log", "md-5", - "nom", + "nom 7.1.3", "rangemap", "time", "weezl", @@ -4329,11 +4266,11 @@ dependencies = [ "chrono", "encoding_rs", "flate2", - "indexmap 2.11.4", + "indexmap", "itoa", "log", "md-5", - "nom", + "nom 7.1.3", "nom_locate", "rangemap", "rayon", @@ -4353,11 +4290,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.16.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96051b46fc183dc9cd4a223960ef37b9af631b55191852a8274bfef064cda20f" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" dependencies = [ - "hashbrown 0.16.0", + "hashbrown 0.16.1", ] [[package]] @@ -4368,15 +4305,15 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a" +checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" [[package]] name = "lz4_flex" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6473172471198271ff72e9379150e9dfd70d8e533e0752a27e515b48dd375e" +checksum = "98c23545df7ecf1b16c303910a69b079e8e251d60f7dd2cc9b4177f2afaf1746" dependencies = [ "twox-hash", ] @@ -4391,6 +4328,12 @@ dependencies = [ "sha2", ] +[[package]] +name = "lzma-rust2" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1670343e58806300d87950e3401e820b519b9384281bbabfb15e3636689ffd69" + [[package]] name = "mac" version = "0.1.1" @@ -4459,7 +4402,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -4471,12 +4414,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "matchit" version = "0.8.4" @@ -4530,29 +4467,20 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" dependencies = [ "libc", "stable_deref_trait", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memory-stats" version = "1.2.0" @@ -4569,7 +4497,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -4612,29 +4540,29 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "mmap-rs" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86968d85441db75203c34deefd0c88032f275aaa85cee19a1dcfff6ae9df56da" +checksum = "4ecce9d566cb9234ae3db9e249c8b55665feaaf32b0859ff1e27e310d2beb3d8" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.11.0", "combine", "libc", "mach2", - "nix 0.26.4", - "sysctl 0.5.5", - "thiserror 1.0.69", + "nix 0.30.1", + "sysctl", + "thiserror 2.0.18", "widestring", "windows 0.48.0", ] @@ -4658,14 +4586,14 @@ checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "moxcms" -version = "0.7.7" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c588e11a3082784af229e23e8e4ecf5bcc6fbe4f69101e0421ce8d79da7f0b40" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -4717,9 +4645,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", @@ -4749,9 +4677,9 @@ dependencies = [ [[package]] name = "ndarray" -version = "0.17.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7c9125e8f6f10c9da3aad044cc918cf8784fa34de857b1aa68038eb05a50a9" +checksum = "520080814a7a6b4a6e9070823bb24b4531daac8c4627e08ba5de8c5ef2f2752d" dependencies = [ "matrixmultiply", "num-complex", @@ -4770,24 +4698,23 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.26.4" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.11.0", "cfg-if", + "cfg_aliases", "libc", - "memoffset", - "pin-utils", ] [[package]] name = "nix" -version = "0.30.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -4803,6 +4730,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nom_locate" version = "4.2.0" @@ -4811,7 +4747,7 @@ checksum = "1e3c83c053b0713da60c5b8de47fe8e494fe3ece5267b2f23090a07a053ba8f3" dependencies = [ "bytecount", "memchr", - "nom", + "nom 7.1.3", ] [[package]] @@ -4838,7 +4774,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "fsevent-sys", "inotify", "kqueue", @@ -4852,15 +4788,18 @@ dependencies = [ [[package]] name = "notify-types" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +dependencies = [ + "bitflags 2.11.0", +] [[package]] name = "ntapi" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" dependencies = [ "winapi", ] @@ -4900,18 +4839,17 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", "num-iter", "num-traits", "rand 0.8.5", - "smallvec 1.15.1", + "smallvec", "zeroize", ] @@ -4927,9 +4865,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -4939,7 +4877,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -4962,6 +4900,21 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-modular" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" + +[[package]] +name = "num-order" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" +dependencies = [ + "num-modular", +] + [[package]] name = "num-rational" version = "0.4.2" @@ -4993,28 +4946,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "number_prefix" version = "0.4.0" @@ -5031,15 +4962,30 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-core-foundation" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", ] +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + [[package]] name = "objc2-io-kit" version = "0.3.2" @@ -5060,31 +5006,31 @@ dependencies = [ ] [[package]] -name = "object" -version = "0.37.3" +name = "oid-registry" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" dependencies = [ - "memchr", + "asn1-rs", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "oneshot" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" +checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107" [[package]] name = "onig" @@ -5092,7 +5038,7 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "libc", "once_cell", "onig_sys", @@ -5154,7 +5100,7 @@ dependencies = [ "proc-macro2", "quote", "semver", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -5198,11 +5144,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.74" +version = "0.10.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" +checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -5219,29 +5165,29 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-src" -version = "300.5.3+3.5.4" +version = "300.5.5+3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bad8cd0233b63971e232cc9c5e83039375b8586d2312f31fda85db8f888c2" +checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.110" +version = "0.9.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" +checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" dependencies = [ "cc", "libc", @@ -5293,20 +5239,20 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" +checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" dependencies = [ "http", "opentelemetry 0.31.0", "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk 0.31.0", - "prost 0.14.1", + "prost", "reqwest", "thiserror 2.0.18", "tokio", - "tonic 0.14.2", + "tonic", "tracing", ] @@ -5331,8 +5277,8 @@ checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" dependencies = [ "opentelemetry 0.31.0", "opentelemetry_sdk 0.31.0", - "prost 0.14.1", - "tonic 0.14.2", + "prost", + "tonic", "tonic-prost", ] @@ -5384,28 +5330,27 @@ dependencies = [ [[package]] name = "ort" -version = "2.0.0-rc.10" +version = "2.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa7e49bd669d32d7bc2a15ec540a527e7764aec722a45467814005725bcd721" +checksum = "4a5df903c0d2c07b56950f1058104ab0c8557159f2741782223704de9be73c3c" dependencies = [ "half 2.7.1", - "ndarray 0.16.1", + "ndarray 0.17.2", "ort-sys", - "smallvec 2.0.0-alpha.10", + "smallvec", "tracing", + "ureq 3.3.0", ] [[package]] name = "ort-sys" -version = "2.0.0-rc.10" +version = "2.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2aba9f5c7c479925205799216e7e5d07cc1d4fa76ea8058c60a9a30f6a4e890" +checksum = "06503bb33f294c5f1ba484011e053bfa6ae227074bdb841e9863492dc5960d4b" dependencies = [ - "flate2", - "pkg-config", - "sha2", - "tar", - "ureq 3.1.2", + "hmac-sha256", + "lzma-rust2 0.15.7", + "ureq 3.3.0", ] [[package]] @@ -5460,6 +5405,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -5478,16 +5429,16 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", - "smallvec 1.15.1", + "redox_syscall 0.5.18", + "smallvec", "windows-link 0.2.1", ] [[package]] name = "parquet" -version = "57.1.0" +version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be3e4f6d320dd92bfa7d612e265d7d08bba0a240bab86af3425e1d255a511d89" +checksum = "6ee96b29972a257b855ff2341b37e61af5f12d6af1158b6dcdb5b31ea07bb3cb" dependencies = [ "ahash 0.8.12", "arrow-array", @@ -5503,8 +5454,8 @@ dependencies = [ "chrono", "flate2", "half 2.7.1", - "hashbrown 0.16.0", - "lz4_flex 0.12.0", + "hashbrown 0.16.1", + "lz4_flex 0.12.1", "num-bigint", "num-integer", "num-traits", @@ -5525,9 +5476,15 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pastey" -version = "0.2.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pastey" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d6c094ee800037dff99e02cab0eaf3142826586742a270ab3d7a62656bd27a" +checksum = "b867cad97c0791bbd3aaa6472142568c6c9e8f71937e98379f584cfb0cf35bec" [[package]] name = "pbkdf2" @@ -5556,17 +5513,17 @@ dependencies = [ [[package]] name = "pdfium-render" -version = "0.8.35" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8fa6e8ceaad45c9fed63db09045c45f2cccd4a8b92a826bd3f8e901a98b14c6" +checksum = "6553f6604a52b3203db7b4e9d51eb4dd193cf455af9e56d40cab6575b547b679" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "bytemuck", "bytes", "chrono", "console_error_panic_hook", "console_log", - "image 0.25.8", + "image", "itertools 0.14.0", "js-sys", "libloading", @@ -5605,6 +5562,15 @@ dependencies = [ "base64ct", ] +[[package]] +name = "pem-rfc7468" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -5613,9 +5579,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -5623,9 +5589,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -5633,22 +5599,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "pest_meta" -version = "2.8.3" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", "sha2", @@ -5656,12 +5622,13 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.7.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", - "indexmap 2.11.4", + "hashbrown 0.15.5", + "indexmap", ] [[package]] @@ -5704,7 +5671,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -5718,29 +5685,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -5760,7 +5727,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der", + "der 0.7.10", "pkcs8", "spki", ] @@ -5771,7 +5738,7 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", + "der 0.7.10", "spki", ] @@ -5781,6 +5748,12 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "plist" version = "1.8.0" @@ -5788,8 +5761,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", - "indexmap 2.11.4", - "quick-xml 0.38.3", + "indexmap", + "quick-xml 0.38.4", "serde", "time", ] @@ -5824,11 +5797,11 @@ dependencies = [ [[package]] name = "png" -version = "0.17.16" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.11.0", "crc32fast", "fdeflate", "flate2", @@ -5836,16 +5809,17 @@ dependencies = [ ] [[package]] -name = "png" -version = "0.18.0" +name = "polling" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ - "bitflags 2.9.4", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", ] [[package]] @@ -5868,15 +5842,15 @@ checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] @@ -5889,9 +5863,9 @@ checksum = "78451badbdaebaf17f053fd9152b3ffb33b516104eacb45e7864aaa9c712f306" [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -5904,9 +5878,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.2.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c834641d8ad1b348c9ee86dec3b9840d805acd5f24daa5f90c788951a52ff59b" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" [[package]] name = "ppv-lite86" @@ -5930,7 +5904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -5944,42 +5918,40 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.7", + "toml_edit", ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.117", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -6000,7 +5972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -6020,13 +5992,13 @@ dependencies = [ [[package]] name = "proptest" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" dependencies = [ - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.9.4", + "bit-set", + "bit-vec", + "bitflags 2.11.0", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -6039,77 +6011,55 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive 0.13.5", -] - -[[package]] -name = "prost" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" dependencies = [ "bytes", - "prost-derive 0.14.1", + "prost-derive", ] [[package]] name = "prost-build" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ "heck", "itertools 0.14.0", "log", "multimap", - "once_cell", "petgraph", "prettyplease", - "prost 0.13.5", + "prost", "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", "regex", - "syn 2.0.106", + "syn 2.0.117", "tempfile", ] [[package]] name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "prost-derive" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "prost-types" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" dependencies = [ - "prost 0.13.5", + "prost", ] [[package]] @@ -6218,11 +6168,11 @@ dependencies = [ [[package]] name = "pulldown-cmark" -version = "0.13.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "getopts", "memchr", "pulldown-cmark-escape", @@ -6236,39 +6186,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" [[package]] -name = "pulp" -version = "0.18.22" +name = "pulldown-cmark-to-cmark" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0a01a0dc67cf4558d279f0c25b0962bd08fc6dec0137699eae304103e882fe6" +checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" dependencies = [ - "bytemuck", - "libm", - "num-complex", - "reborrow", + "pulldown-cmark", ] [[package]] name = "pulp" -version = "0.21.5" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" +checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" dependencies = [ "bytemuck", "cfg-if", "libm", "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", "reborrow", "version_check", ] +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" + [[package]] name = "pxfm" -version = "0.1.25" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" -dependencies = [ - "num-traits", -] +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" [[package]] name = "qoi" @@ -6288,7 +6241,7 @@ dependencies = [ "crossbeam-utils", "libc", "once_cell", - "raw-cpuid 11.6.0", + "raw-cpuid", "wasi", "web-sys", "winapi", @@ -6318,9 +6271,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.3" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", ] @@ -6338,7 +6291,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.1", + "socket2", "thiserror 2.0.18", "tokio", "tracing", @@ -6347,9 +6300,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "bytes", "getrandom 0.3.4", @@ -6375,16 +6328,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -6395,6 +6348,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -6419,7 +6378,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -6439,7 +6398,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -6448,14 +6407,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -6486,30 +6445,32 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] name = "rangemap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", - "itertools 0.12.1", + "itertools 0.14.0", "libc", "libfuzzer-sys", "log", @@ -6518,23 +6479,21 @@ dependencies = [ "noop_proc_macro", "num-derive", "num-traits", - "once_cell", "paste", "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.2", + "rand_chacha 0.9.0", "simd_helpers", - "system-deps", - "thiserror 1.0.69", + "thiserror 2.0.18", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.20" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ "avif-serialize", "imgref", @@ -6545,22 +6504,13 @@ dependencies = [ "rgb", ] -[[package]] -name = "raw-cpuid" -version = "10.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "raw-cpuid" version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", ] [[package]] @@ -6602,14 +6552,15 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fae430c6b28f1ad601274e78b7dffa0546de0b73b4cd32f46723c0c2a16f7a5" +checksum = "10b99e0098aa4082912d4c649628623db6aba77335e4f4569ff5083a6448b32e" dependencies = [ "pem", "ring", "rustls-pki-types", "time", + "x509-parser", "yasna", ] @@ -6625,7 +6576,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags 2.11.0", ] [[package]] @@ -6634,7 +6594,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -6645,7 +6605,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 2.0.18", ] @@ -6667,14 +6627,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -6684,9 +6644,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -6695,9 +6655,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rend" @@ -6710,9 +6670,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", @@ -6746,7 +6706,7 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tokio-util", - "tower 0.5.2", + "tower", "tower-http", "tower-service", "url", @@ -6754,7 +6714,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.3", + "webpki-roots 1.0.6", ] [[package]] @@ -6769,9 +6729,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" [[package]] name = "ring" @@ -6781,7 +6741,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -6836,7 +6796,7 @@ dependencies = [ "http", "http-body", "http-body-util", - "pastey", + "pastey 0.2.1", "pin-project-lite", "rand 0.9.2", "rmcp-macros", @@ -6863,7 +6823,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -6874,9 +6834,9 @@ checksum = "921d248b3185e0c0c37a83446ef8bdc4361ccd13b6d6d85fa36da5e672bc1561" [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid", "digest", @@ -6894,9 +6854,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.9.0" +version = "8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" dependencies = [ "include-flate", "rust-embed-impl", @@ -6906,22 +6866,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.9.0" +version = "8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.106", + "syn 2.0.117", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.9.0" +version = "8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" dependencies = [ "mime_guess", "sha2", @@ -6960,12 +6920,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -6981,13 +6935,22 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom 7.1.3", +] + [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys", @@ -6996,9 +6959,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "aws-lc-rs", "log", @@ -7021,9 +6984,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "web-time", "zeroize", @@ -7031,9 +6994,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", @@ -7061,9 +7024,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "safe_arch" @@ -7076,10 +7039,11 @@ dependencies = [ [[package]] name = "safetensors" -version = "0.4.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" +checksum = "675656c1eabb620b921efea4f9199f97fc86e36dd6ffd1fbbe48d0f59a4987f5" dependencies = [ + "hashbrown 0.16.1", "serde", "serde_json", ] @@ -7095,18 +7059,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "schemars" -version = "1.0.4" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "chrono", "dyn-clone", @@ -7118,14 +7082,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.0.4" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -7163,7 +7127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", - "der", + "der 0.7.10", "generic-array", "pkcs8", "subtle", @@ -7172,12 +7136,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.9.4", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -7185,9 +7149,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -7199,7 +7163,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd568a4c9bb598e291a08244a5c1f5a8a6650bee243b5b0f8dbb3d9cc1d87fe8" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "cssparser", "derive_more 0.99.20", "fxhash", @@ -7209,7 +7173,7 @@ dependencies = [ "phf_codegen", "precomputed-hash", "servo_arc", - "smallvec 1.15.1", + "smallvec", ] [[package]] @@ -7251,7 +7215,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -7262,20 +7226,20 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -7298,15 +7262,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -7325,7 +7280,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap", "itoa", "ryu", "serde", @@ -7334,9 +7289,9 @@ dependencies = [ [[package]] name = "servo_arc" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "204ea332803bd95a0b60388590d59cf6468ec9becf626e2451f1d26a1d972de4" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" dependencies = [ "stable_deref_trait", ] @@ -7374,9 +7329,9 @@ dependencies = [ [[package]] name = "shell-words" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" @@ -7386,10 +7341,11 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -7418,9 +7374,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simd_helpers" @@ -7439,9 +7395,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple_asn1" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" dependencies = [ "num-bigint", "num-traits", @@ -7451,24 +7407,24 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "sketches-ddsketch" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" +checksum = "0c6f73aeb92d671e0cc4dca167e59b2deb6387c375391bc99ee743f326994a2b" dependencies = [ "serde", ] [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slug" @@ -7486,12 +7442,6 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "smallvec" -version = "2.0.0-alpha.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d44cfb396c3caf6fbfd0ab422af02631b69ddd96d2eff0b0f0724f9024051b" - [[package]] name = "snap" version = "1.1.1" @@ -7500,22 +7450,12 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -7551,7 +7491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.10", ] [[package]] @@ -7561,7 +7501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" dependencies = [ "base64 0.13.1", - "nom", + "nom 7.1.3", "serde", "unicode-segmentation", ] @@ -7630,24 +7570,23 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.26.4" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -7669,9 +7608,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -7695,7 +7634,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -7704,7 +7643,7 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "656b45c05d95a5704399aeef6bd0ddec7b2b3531b7c9e900abbf7c4d2190c925" dependencies = [ - "bincode", + "bincode 1.3.3", "fancy-regex 0.16.2", "flate2", "fnv", @@ -7730,27 +7669,13 @@ dependencies = [ "libc", ] -[[package]] -name = "sysctl" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" -dependencies = [ - "bitflags 2.9.4", - "byteorder", - "enum-as-inner", - "libc", - "thiserror 1.0.69", - "walkdir", -] - [[package]] name = "sysctl" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "byteorder", "enum-as-inner", "libc", @@ -7774,12 +7699,12 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.9.4", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7793,19 +7718,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml 0.8.23", - "version-compare", -] - [[package]] name = "tantivy" version = "0.25.0" @@ -7831,7 +7743,7 @@ dependencies = [ "levenshtein_automata", "log", "lru 0.12.5", - "lz4_flex 0.11.5", + "lz4_flex 0.11.6", "measure_time", "memmap2", "once_cell", @@ -7843,7 +7755,7 @@ dependencies = [ "serde", "serde_json", "sketches-ddsketch", - "smallvec 1.15.1", + "smallvec", "tantivy-bitpacker", "tantivy-columnar", "tantivy-common", @@ -7913,7 +7825,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "768fccdc84d60d86235d42d7e4c33acf43c418258ff5952abf07bd7837fcd26b" dependencies = [ - "nom", + "nom 7.1.3", "serde", "serde_json", ] @@ -7960,29 +7872,23 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" dependencies = [ "filetime", "libc", "xattr", ] -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -8001,12 +7907,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" dependencies = [ "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -8041,7 +7947,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -8052,7 +7958,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -8083,20 +7989,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - -[[package]] -name = "tiff" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ "fax", "flate2", @@ -8108,30 +8003,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -8148,9 +8043,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -8168,9 +8063,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -8194,7 +8089,7 @@ dependencies = [ "derive_builder", "esaxx-rs", "getrandom 0.3.4", - "indicatif 0.18.3", + "indicatif 0.18.4", "itertools 0.14.0", "log", "macro_rules_attribute", @@ -8217,9 +8112,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.48.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -8227,7 +8122,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -8235,13 +8130,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -8266,9 +8161,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -8302,9 +8197,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -8323,108 +8218,44 @@ dependencies = [ "serde", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.11.4", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.7" +version = "0.25.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.7.3", + "indexmap", + "toml_datetime", "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" dependencies = [ "winnow", ] [[package]] name = "tonic" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" -dependencies = [ - "async-stream", - "async-trait", - "axum 0.7.9", - "base64 0.22.1", - "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost 0.13.5", - "socket2 0.5.10", - "tokio", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" dependencies = [ "async-trait", - "axum 0.8.7", + "axum", "base64 0.22.1", "bytes", "h2", @@ -8436,11 +8267,11 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "socket2 0.6.1", + "socket2", "sync_wrapper", "tokio", "tokio-stream", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", @@ -8448,58 +8279,52 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" dependencies = [ "prettyplease", "proc-macro2", - "prost-build", - "prost-types", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "tonic-prost" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" dependencies = [ "bytes", - "prost 0.14.1", - "tonic 0.14.2", + "prost", + "tonic", ] [[package]] -name = "tower" -version = "0.4.13" +name = "tonic-prost-build" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.117", + "tempfile", + "tonic-build", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.11.4", + "indexmap", "pin-project-lite", "slab", "sync_wrapper", @@ -8512,11 +8337,11 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.0", "bytes", "futures-core", "futures-util", @@ -8532,7 +8357,7 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-util", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", "tracing", @@ -8556,22 +8381,22 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44de9b94d849d3c46e06a883d72d408c2de6403367b39df2b1c9d9e7b6736fe6" dependencies = [ - "axum 0.8.7", + "axum", "forwarded-header-value", "governor", "http", "pin-project", "thiserror 2.0.18", - "tonic 0.14.2", - "tower 0.5.2", + "tonic", + "tower", "tracing", ] [[package]] name = "tracing" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -8587,14 +8412,14 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -8613,16 +8438,13 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6e5658463dd88089aba75c7791e1d3120633b1bfde22478b28f625a9bb1b8e" +checksum = "1ac28f2d093c6c477eaa76b23525478f38de514fa9aeb1285738d4b97a9552fc" dependencies = [ "js-sys", "opentelemetry 0.31.0", - "opentelemetry_sdk 0.31.0", - "rustversion", - "smallvec 1.15.1", - "thiserror 2.0.18", + "smallvec", "tracing", "tracing-core", "tracing-log", @@ -8642,9 +8464,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -8653,7 +8475,7 @@ dependencies = [ "serde", "serde_json", "sharded-slab", - "smallvec 1.15.1", + "smallvec", "thread_local", "tracing", "tracing-core", @@ -8663,9 +8485,9 @@ dependencies = [ [[package]] name = "transmutation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58e1986afced27128485bbae045506a212f479ae746865976aec297912ed0f9" +checksum = "043e6abc35e333be2b66c04f28b38ef6a29097ab53ace0cc84e2a9c9f833a7a4" dependencies = [ "anyhow", "async-trait", @@ -8676,7 +8498,7 @@ dependencies = [ "file-format", "futures", "html5ever", - "image 0.25.8", + "image", "imageproc", "lopdf 0.35.0", "mime", @@ -8700,7 +8522,6 @@ dependencies = [ "tracing-subscriber", "umya-spreadsheet", "walkdir", - "winres", "zip 6.0.0", ] @@ -8776,9 +8597,9 @@ checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "type1-encoding-parser" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d6cc09e1a99c7e01f2afe4953789311a1c50baebbdac5b477ecf78e2e92a5b" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" dependencies = [ "pom", ] @@ -8789,6 +8610,12 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typenum" version = "1.19.0" @@ -8801,27 +8628,6 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" -[[package]] -name = "ug" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90b70b37e9074642bc5f60bb23247fd072a84314ca9e71cdf8527593406a0dd3" -dependencies = [ - "gemm 0.18.2", - "half 2.7.1", - "libloading", - "memmap2", - "num", - "num-traits", - "num_cpus", - "rayon", - "safetensors", - "serde", - "thiserror 1.0.69", - "tracing", - "yoke 0.7.5", -] - [[package]] name = "umicp-core" version = "0.2.3" @@ -8830,7 +8636,7 @@ checksum = "011d3be8c6a322f3b511ba120190abe977fad7bdbac589109e7b4d90bdaf4190" dependencies = [ "anyhow", "async-trait", - "axum 0.8.7", + "axum", "base64 0.22.1", "chrono", "futures", @@ -8847,7 +8653,7 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-tungstenite 0.26.2", - "tower 0.5.2", + "tower", "tracing", "tungstenite 0.24.0", "url", @@ -8869,7 +8675,7 @@ dependencies = [ "chrono", "encoding_rs", "fancy-regex 0.14.0", - "getrandom 0.2.16", + "getrandom 0.2.17", "hmac", "html_parser", "imagesize", @@ -8891,21 +8697,21 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] @@ -8916,7 +8722,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de" dependencies = [ - "smallvec 1.15.1", + "smallvec", ] [[package]] @@ -8971,6 +8777,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "ureq" version = "2.12.1" @@ -8993,28 +8805,27 @@ dependencies = [ [[package]] name = "ureq" -version = "3.1.2" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64 0.22.1", - "der", + "der 0.8.0", "log", "native-tls", "percent-encoding", - "rustls-pemfile", "rustls-pki-types", "socks", "ureq-proto", - "utf-8", + "utf8-zero", "webpki-root-certs", ] [[package]] name = "ureq-proto" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64 0.22.1", "http", @@ -9024,9 +8835,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", @@ -9061,6 +8872,12 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -9075,11 +8892,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -9137,10 +8954,10 @@ dependencies = [ "async-graphql", "async-graphql-axum", "async-trait", - "axum 0.8.7", + "axum", "base64 0.22.1", "bcrypt", - "bincode", + "bincode 2.0.1", "blake3", "candle-core", "candle-nn", @@ -9171,13 +8988,13 @@ dependencies = [ "jsonwebtoken", "lazy_static", "libc", - "lru 0.16.2", - "lz4_flex 0.12.0", + "lru 0.16.3", + "lz4_flex 0.12.1", "memmap2", "memory-stats", "mime_guess", - "ndarray 0.17.1", - "nix 0.30.1", + "ndarray 0.17.2", + "nix 0.31.2", "notify", "num_cpus", "once_cell", @@ -9194,7 +9011,7 @@ dependencies = [ "parquet", "prometheus", "proptest", - "prost 0.13.5", + "prost", "prost-types", "protoc-bin-vendored", "rand 0.9.2", @@ -9225,9 +9042,11 @@ dependencies = [ "tokio-stream", "tokio-tungstenite 0.28.0", "tokio-util", - "tonic 0.12.3", + "tonic", "tonic-build", - "tower 0.5.2", + "tonic-prost", + "tonic-prost-build", + "tower", "tower-http", "tower_governor", "tracing", @@ -9245,18 +9064,18 @@ dependencies = [ "zstd", ] -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -9293,9 +9112,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen", ] @@ -9308,9 +9136,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -9319,27 +9147,14 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -9348,9 +9163,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9358,26 +9173,48 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" version = "0.4.2" @@ -9391,11 +9228,23 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -9413,9 +9262,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d651ec480de84b762e7be71e6efa7461699c19d9e2c272c8d93455f567786e" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" dependencies = [ "rustls-pki-types", ] @@ -9426,23 +9275,23 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.3", + "webpki-roots 1.0.6", ] [[package]] name = "webpki-roots" -version = "1.0.3" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "whoami" @@ -9578,7 +9427,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -9589,7 +9438,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -9616,13 +9465,13 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -9903,9 +9752,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] @@ -9916,20 +9765,102 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" dependencies = [ - "toml 0.5.11", + "toml", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wyz" @@ -9940,6 +9871,24 @@ dependencies = [ "tap", ] +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom 7.1.3", + "oid-registry", + "ring", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + [[package]] name = "xattr" version = "1.6.1" @@ -9958,9 +9907,9 @@ checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" [[package]] name = "xml-rs" -version = "0.8.27" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xxhash-rust" @@ -9968,6 +9917,12 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yaml-rust" version = "0.4.5" @@ -9988,70 +9943,45 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive 0.7.5", - "zerofrom", -] - -[[package]] -name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", - "yoke-derive 0.8.0", + "yoke-derive", "zerofrom", ] [[package]] name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", - "synstructure", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -10071,7 +10001,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", "synstructure", ] @@ -10086,46 +10016,46 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", - "yoke 0.8.0", + "yoke", "zerofrom", ] [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ - "yoke 0.8.0", + "yoke", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.117", ] [[package]] @@ -10140,21 +10070,6 @@ dependencies = [ "flate2", ] -[[package]] -name = "zip" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" -dependencies = [ - "arbitrary", - "crc32fast", - "crossbeam-utils", - "displaydoc", - "indexmap 2.11.4", - "num_enum", - "thiserror 1.0.69", -] - [[package]] name = "zip" version = "2.4.2" @@ -10166,7 +10081,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.11.4", + "indexmap", "memchr", "thiserror 2.0.18", "zopfli", @@ -10181,14 +10096,14 @@ dependencies = [ "aes", "arbitrary", "bzip2", - "constant_time_eq", + "constant_time_eq 0.3.1", "crc32fast", "deflate64", "flate2", "getrandom 0.3.4", "hmac", - "indexmap 2.11.4", - "lzma-rust2", + "indexmap", + "lzma-rust2 0.13.0", "memchr", "pbkdf2", "ppmd-rust", @@ -10199,17 +10114,35 @@ dependencies = [ "zstd", ] +[[package]] +name = "zip" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +dependencies = [ + "crc32fast", + "indexmap", + "memchr", + "typed-path", +] + [[package]] name = "zlib-rs" -version = "0.5.2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + +[[package]] +name = "zmij" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zopfli" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", @@ -10247,9 +10180,9 @@ dependencies = [ [[package]] name = "zune-core" -version = "0.4.12" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" [[package]] name = "zune-inflate" @@ -10262,9 +10195,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.21" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +checksum = "0b7a1c0af6e5d8d1363f4994b7a091ccf963d8b694f7da5b0b9cceb82da2c0a6" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index 52109c6c..44394043 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vectorizer" -version = "2.5.0" +version = "2.5.1" edition = "2024" authors = ["HiveLLM Contributors"] description = "High-performance, in-memory vector database written in Rust" @@ -24,7 +24,7 @@ tower-http = { version = "0.6.7", features = ["cors", "trace", "fs", "set-header serde = { version = "1.0", features = ["derive"], default-features = false } serde_json = { version = "1.0", default-features = false } serde_yaml = { version = "0.9", default-features = false } -bincode = { version = "1.3", default-features = false } +bincode = { version = "2.0", features = ["serde"] } glob = { version = "0.3", default-features = false } # Note: chrono is heavy but used in 166 places - consider migrating to time crate in future chrono = { version = "0.4", features = ["serde"], default-features = false } @@ -108,7 +108,7 @@ openssl = { version = "0.10", features = ["vendored"], optional = true } # Authentication and security jsonwebtoken = { version = "10.1", features = ["rust_crypto"] } -uuid = { version = "1.19", features = ["v4", "serde"] } +uuid = { version = "1.22", features = ["v4", "serde"] } rand = "0.9" hmac = "0.12" # HMAC for request signing base64 = "0.22" # Base64 encoding for signing secrets @@ -154,7 +154,7 @@ tokio-util = "0.7" async-trait = "0.1" lru = "0.16.1" hyper = { version = "1.8.1", features = ["server", "http1", "http2"] } -hyper-util = { version = "0.1.19", features = ["tokio", "server", "server-auto"] } +hyper-util = { version = "0.1.20", features = ["tokio", "server", "server-auto"] } # GraphQL API async-graphql = { version = "7.0", features = ["chrono", "uuid"] } @@ -169,9 +169,10 @@ opentelemetry-otlp = { version = "0.31", features = ["metrics", "trace", "tokio" tracing-opentelemetry = "0.32" # gRPC support -tonic = { version = "0.12", features = [] } -prost = "0.13" -prost-types = "0.13" +tonic = { version = "0.14", features = [] } +tonic-prost = "0.14" +prost = "0.14" +prost-types = "0.14" # Transmutation - Document conversion engine (optional) transmutation = { version = "0.3.1", optional = true, features = ["office", "pdf-to-image"] } @@ -179,7 +180,8 @@ transmutation = { version = "0.3.1", optional = true, features = ["office", "pdf [build-dependencies] cc = { version = "1.2.49", features = ["parallel"] } winres = "0.1" -tonic-build = "0.12" +tonic-build = "0.14" +tonic-prost-build = "0.14" # Vendored protoc for cross-compilation (e.g. aarch64-unknown-linux-musl in CI where container has no protoc) protoc-bin-vendored = "3.2" @@ -350,7 +352,7 @@ full = ["real-models", "onnx-models", "arrow", "parquet", "transmutation"] # Unix-specific dependencies (for signal handling) [target.'cfg(unix)'.dependencies] -nix = { version = "0.30", features = ["signal"] } +nix = { version = "0.31", features = ["signal"] } # [[bin]] # name = "gpu_scale_benchmark" diff --git a/README.md b/README.md index 2f2d632f..83e80c71 100755 --- a/README.md +++ b/README.md @@ -74,14 +74,17 @@ A high-performance vector database and search engine built in Rust, designed for - **🔒 Security**: JWT + API Key authentication with RBAC - **🔐 Payload Encryption**: Optional ECC-P256 + AES-256-GCM payload encryption with zero-knowledge architecture ([docs](docs/features/encryption/README.md)) -## 🎉 Latest Release: v2.4.0 - Transmutation Default & Enhanced File Upload +## 🎉 Latest Release: v2.5.1 - HA Cluster Failover & Dependency Upgrades -**New in v2.4.0:** +**New in v2.5.1:** +- **Automatic HA failover**: Raft leadership watcher bridges consensus elections to master/replica transitions in Kubernetes clusters +- **Exponential backoff**: Replica reconnect uses 5s→60s backoff, reducing log noise when master is unreachable +- **Dependency upgrades**: bincode 2.0, tonic 0.14, prost 0.14, and all Dependabot PRs resolved +- **Bug fixes**: Snapshot spam on empty replicas, TCP connection timeout for faster failure detection + +**Previous Release (v2.5.0):** +- **HA Cluster**: Hybrid Raft + TCP replication architecture for Kubernetes deployments - **Transmutation enabled by default**: Document conversion (PDF, DOCX, XLSX, PPTX, images) now included in default build -- **Increased file upload limits**: Support for files up to 200MB (previously 100MB) -- **Enhanced file upload configuration**: Improved config loading with better error handling and logging -- **Extended file format support**: Added PDF, DOCX, XLSX, PPTX, and image formats to allowed extensions -- **Improved upload validation**: Better error messages and config path detection **Previous Release (v2.3.0):** - **Embedded Dashboard**: All dashboard assets now embedded in binary (single executable, ~26MB) @@ -418,7 +421,7 @@ Comprehensive feature comparison with major vector database solutions: - **Milvus**: Large-scale deployments requiring advanced scalability features - **Chroma**: Python-first applications with simple setup requirements -## 🔧 Recent Improvements (v2.0.0 - v2.4.0) +## 🔧 Recent Improvements (v2.0.0 - v2.5.1) ### New Features (v2.0.0+) @@ -503,14 +506,14 @@ Cursor IDE configuration: ## 📦 Client SDKs -All SDKs are synchronized with server version **2.4.0**: +All SDKs are synchronized with server version **2.5.1**: -- **Python**: `pip install vectorizer-sdk` (v2.4.0) -- **TypeScript**: `npm install @hivehub/vectorizer-sdk` (v2.4.0) -- **Rust**: `cargo add vectorizer-sdk` (v2.4.0) -- **JavaScript**: `npm install @hivehub/vectorizer-sdk-js` (v2.4.0) -- **C#**: `dotnet add package Vectorizer.Sdk` (v2.4.0) -- **Go**: `go get github.com/hivellm/vectorizer-sdk-go` (v2.4.0) +- **Python**: `pip install vectorizer-sdk` (v2.5.1) +- **TypeScript**: `npm install @hivehub/vectorizer-sdk` (v2.5.1) +- **Rust**: `cargo add vectorizer-sdk` (v2.5.1) +- **JavaScript**: `npm install @hivehub/vectorizer-sdk-js` (v2.5.1) +- **C#**: `dotnet add package Vectorizer.Sdk` (v2.5.1) +- **Go**: `go get github.com/hivellm/vectorizer-sdk-go` (v2.5.1) ## 🔗 Workflow & LLM Integrations diff --git a/build.rs b/build.rs index d1a3614a..e1eec12f 100755 --- a/build.rs +++ b/build.rs @@ -10,10 +10,10 @@ fn main() -> Result<(), Box> { } // Compile protobuf definitions with tonic-build - // Using tonic-build 0.12 for stable API compatibility + // Using tonic-prost-build 0.14 (prost extracted from tonic-build in 0.14) // Note: This will recompile if proto files change (expected behavior) // To avoid unnecessary rebuilds, proto files should be committed and only changed when needed - tonic_build::configure() + tonic_prost_build::configure() .build_server(true) .build_client(true) // Enable client generation for tests .out_dir("src/grpc") @@ -25,7 +25,7 @@ fn main() -> Result<(), Box> { // Compile Qdrant-compatible gRPC proto definitions println!("cargo:rerun-if-changed=proto/qdrant/"); std::fs::create_dir_all("src/grpc/qdrant")?; - tonic_build::configure() + tonic_prost_build::configure() .build_server(true) .build_client(true) .out_dir("src/grpc/qdrant") diff --git a/docs/users/guides/HA_CLUSTER.md b/docs/users/guides/HA_CLUSTER.md new file mode 100644 index 00000000..f50cdd10 --- /dev/null +++ b/docs/users/guides/HA_CLUSTER.md @@ -0,0 +1,437 @@ +# High Availability Cluster Guide + +Complete guide to deploying Vectorizer in HA (High Availability) mode with automatic replication, write routing, and failover. + +## Overview + +Vectorizer v2.5.0 supports a master-replica HA architecture: + +``` +Your Application + │ + ▼ +┌─────────────┐ +│ Service URL │ ← single connection point +│ :15002 │ +└──────┬──────┘ + │ load balances across pods + │ + ┌────┼────────────────┐ + │ │ │ +┌─▼──┐ ┌──▼─┐ ┌───▼┐ +│Lead│ │Fol.│ │Fol.│ +│ │ │ │ │ │ +│R/W │ │ R │ │ R │ +└─┬──┘ └──▲─┘ └──▲─┘ + │ │ │ + └────────┴──────┘ + TCP Replication + (port 7001) +``` + +- **Leader (master)**: Accepts reads and writes. Replicates data to followers. +- **Followers (replicas)**: Serve reads locally. Redirect writes to the leader with HTTP 307. +- **Single URL**: Your application connects to one URL. Reads are served by any node; writes are automatically routed to the leader. + +## Quick Start + +### Docker Compose (recommended for local/dev) + +**1. Create `.env` file with credentials:** + +```bash +cat > .env << 'EOF' +VECTORIZER_ADMIN_PASSWORD=MySecurePassword123! +VECTORIZER_JWT_SECRET=my-jwt-secret-key-must-be-at-least-32-characters-long +EOF +``` + +**2. Create master config (`config.ha-master.yml`):** + +Copy from `config.example.yml` and change these sections: + +```yaml +# server section +server: + host: "0.0.0.0" + port: 15002 + mcp_port: 15002 + +# auth section - enable with shared JWT secret +auth: + enabled: true + jwt_secret: "${VECTORIZER_JWT_SECRET}" # from .env + +# replication section +replication: + enabled: true + role: "master" + bind_address: "0.0.0.0:7001" + heartbeat_interval_secs: 5 + log_size: 1000000 +``` + +**3. Create replica config (`config.ha-replica.yml`):** + +Same as master but with these differences: + +```yaml +# replication section +replication: + enabled: true + role: "replica" + master_address: "vz-ha-master:7001" # Docker service name + heartbeat_interval_secs: 5 +``` + +**4. Start the cluster:** + +```bash +docker-compose -f docker-compose.ha.yml up -d +``` + +**5. Connect your application:** + +``` +http://localhost:15002 +``` + +That's it. One URL for everything. + +### Kubernetes (production) + +**1. Install with Helm:** + +```bash +helm install vectorizer ./helm/vectorizer \ + --set replicaCount=3 \ + --set cluster.enabled=true \ + --set cluster.discovery=dns \ + --set auth.enabled=true \ + --set auth.jwt_secret="your-secret-minimum-32-chars" +``` + +**2. Connect your application:** + +``` +http://vectorizer.default.svc.cluster.local:15002 +``` + +The K8s Service distributes requests across all pods. Writes that land on a follower are redirected to the leader automatically. + +## How It Works + +### Write Routing (HTTP 307) + +When your application sends a write request (POST, PUT, DELETE, PATCH) to a follower node, it receives: + +``` +HTTP/1.1 307 Temporary Redirect +Location: http://leader-address:15002/your/original/path +X-Vectorizer-Leader: http://leader-address:15002 +X-Vectorizer-Role: follower + +{"redirect":"write operations must go to leader","leader_url":"http://leader-address:15002"} +``` + +Most HTTP clients follow 307 redirects automatically: + +| Client | Auto-follows 307? | +|---|---| +| `fetch` (JS/Node) | Yes (default) | +| `axios` | Yes (default) | +| Python `requests` | Yes (default) | +| Rust `reqwest` | Yes (default) | +| Go `net/http` | Yes (default) | +| `curl` | No (use `-L` flag) | + +### Replication Flow + +``` +1. Client writes to Leader +2. Leader stores data locally +3. Leader streams operation to all Followers via TCP (port 7001) +4. Followers apply the operation to their local store +5. Followers send ACK back to Leader +6. Leader tracks confirmed offset per replica +``` + +### Shared Authentication + +All nodes must share the same `jwt_secret` in their config. This means: + +- A JWT token obtained from any node works on all other nodes +- API keys created on the leader are replicated to followers +- You only need to authenticate once + +## Configuration Reference + +### Master Node + +```yaml +replication: + enabled: true + role: "master" + bind_address: "0.0.0.0:7001" # TCP listen address for replicas + heartbeat_interval_secs: 5 # Heartbeat frequency + replica_timeout_secs: 30 # Disconnect replica after this silence + log_size: 1000000 # Replication log buffer (operations) + reconnect_interval_secs: 5 # Unused on master + wal_enabled: true # Persist replication log to disk +``` + +### Replica Node + +```yaml +replication: + enabled: true + role: "replica" + master_address: "master-host:7001" # IP:port or hostname:port of master + heartbeat_interval_secs: 5 + replica_timeout_secs: 30 + log_size: 1000000 + reconnect_interval_secs: 5 # Retry interval on disconnect + wal_enabled: false # Replicas don't need WAL +``` + +### Cluster Mode (for Raft consensus + sharding) + +```yaml +cluster: + enabled: true # Enables Raft + cluster features + node_id: "node-1" # Unique node identifier + discovery: "static" # static | dns + timeout_ms: 5000 # gRPC timeout for inter-node ops + retry_count: 3 + + # Static node discovery + servers: + - id: "node-1" + address: "192.168.1.10" + grpc_port: 15003 + - id: "node-2" + address: "192.168.1.11" + grpc_port: 15003 + + # DNS discovery (Kubernetes) + # discovery: "dns" + # dns_name: "vectorizer-headless.default.svc.cluster.local" + # dns_resolve_interval: 30 +``` + +## API Endpoints + +### Cluster Status + +```bash +# Get leader info +GET /api/v1/cluster/leader + +# Get current node role +GET /api/v1/cluster/role + +# List cluster nodes +GET /api/v1/cluster/nodes + +# Shard distribution +GET /api/v1/cluster/shard-distribution +``` + +### Health Check + +```bash +GET /health +``` + +Returns: +```json +{ + "status": "healthy", + "version": "2.5.1" +} +``` + +## Examples + +### JavaScript / TypeScript + +```javascript +const VECTORIZER_URL = 'http://vectorizer:15002'; + +// Login (once) +const loginRes = await fetch(`${VECTORIZER_URL}/auth/login`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: 'admin', password: 'your-password' }) +}); +const { access_token } = await loginRes.json(); + +// Create collection (write → routed to leader automatically) +await fetch(`${VECTORIZER_URL}/collections`, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${access_token}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ name: 'products', dimension: 384, metric: 'cosine' }) +}); + +// Insert vectors (write → routed to leader) +await fetch(`${VECTORIZER_URL}/qdrant/collections/products/points`, { + method: 'PUT', + headers: { + 'Authorization': `Bearer ${access_token}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + points: [ + { id: 'prod-1', vector: [0.1, 0.2, ...], payload: { name: 'Widget' } }, + { id: 'prod-2', vector: [0.3, 0.4, ...], payload: { name: 'Gadget' } } + ] + }) +}); + +// Search (read → served by any node) +const searchRes = await fetch(`${VECTORIZER_URL}/qdrant/collections/products/points/search`, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${access_token}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ vector: [0.1, 0.2, ...], limit: 10 }) +}); +const { result } = await searchRes.json(); +``` + +### Python + +```python +import requests + +URL = 'http://vectorizer:15002' + +# Login +token = requests.post(f'{URL}/auth/login', json={ + 'username': 'admin', 'password': 'your-password' +}).json()['access_token'] + +headers = {'Authorization': f'Bearer {token}'} + +# Create collection +requests.post(f'{URL}/collections', json={ + 'name': 'docs', 'dimension': 768, 'metric': 'cosine' +}, headers=headers) + +# Insert +requests.put(f'{URL}/qdrant/collections/docs/points', json={ + 'points': [{'id': 'doc-1', 'vector': [0.1]*768, 'payload': {'text': 'hello'}}] +}, headers=headers) + +# Search +results = requests.post(f'{URL}/qdrant/collections/docs/points/search', json={ + 'vector': [0.1]*768, 'limit': 5 +}, headers=headers).json() +``` + +### curl + +```bash +# Login +TOKEN=$(curl -s -X POST http://vectorizer:15002/auth/login \ + -H 'Content-Type: application/json' \ + -d '{"username":"admin","password":"your-password"}' \ + | jq -r '.access_token') + +# Create collection (use -L to follow redirects if hitting a follower) +curl -L -X POST http://vectorizer:15002/collections \ + -H "Authorization: Bearer $TOKEN" \ + -H 'Content-Type: application/json' \ + -d '{"name":"my-collection","dimension":128,"metric":"cosine"}' + +# Insert vectors +curl -L -X PUT http://vectorizer:15002/qdrant/collections/my-collection/points \ + -H "Authorization: Bearer $TOKEN" \ + -H 'Content-Type: application/json' \ + -d '{"points":[{"id":"v1","vector":[0.1,0.2,...128 values...],"payload":{"key":"value"}}]}' + +# Search +curl -X POST http://vectorizer:15002/qdrant/collections/my-collection/points/search \ + -H "Authorization: Bearer $TOKEN" \ + -H 'Content-Type: application/json' \ + -d '{"vector":[0.1,0.2,...128 values...],"limit":5}' +``` + +## Dashboard + +The web dashboard is available at the leader URL: + +``` +http://vectorizer:15002 +``` + +The **Cluster** page (sidebar → Cluster) shows: +- Node status (healthy/unhealthy) +- Node roles (Leader/Follower) +- Replication status and lag +- Connected replicas count + +## Failover Behavior + +### When the leader dies: + +1. Followers lose the TCP replication connection +2. Followers continue serving **reads** with their existing data +3. Followers still **redirect writes** (307) to the leader URL +4. When the leader recovers, followers automatically reconnect +5. Leader sends full or partial sync to bring followers up to date + +### When a follower dies: + +1. Leader detects missing heartbeat after `replica_timeout_secs` +2. Leader continues serving reads and writes normally +3. When the follower recovers, it reconnects and receives missed data + +### When the leader recovers after downtime: + +1. Leader starts and resumes its configured role +2. Followers detect the leader is back and reconnect +3. Replication resumes from the last known offset +4. If the offset is too old, a full snapshot sync is performed + +## Troubleshooting + +### Writes returning 307 but not reaching the leader + +Your HTTP client may not be following redirects. Solutions: +- `curl`: Add `-L` flag +- Check that the leader URL in the 307 response is reachable from the client +- In Docker/K8s, the redirect uses internal network addresses + +### Replica not connecting to master + +Check: +- `master_address` in replica config points to the correct host:port +- Port 7001 is accessible between nodes (firewall/network policy) +- Master is running and healthy + +### Data not replicating + +Check master logs for: +``` +Replica connected from with offset +Performing full sync for replica +``` + +If you don't see these, the TCP connection is not established. + +### Different passwords on each node + +All nodes must share the same `jwt_secret`. Set it via: +- Config file: `auth.jwt_secret` +- Environment variable: `VECTORIZER_JWT_SECRET` + +## Related Documentation + +- [Cluster Deployment Guide](../../deployment/CLUSTER.md) +- [Master-Replica Routing](MASTER_REPLICA_ROUTING.md) +- [Configuration Reference](../configuration/CLUSTER.md) diff --git a/src/cluster/grpc_service.rs b/src/cluster/grpc_service.rs index 73fb9f78..6178ee54 100755 --- a/src/cluster/grpc_service.rs +++ b/src/cluster/grpc_service.rs @@ -745,7 +745,7 @@ impl ClusterServiceTrait for ClusterGrpcService { let data = request.into_inner().data; let vote_req: openraft::raft::VoteRequest = - bincode::deserialize(&data) + crate::codec::deserialize(&data) .map_err(|e| Status::invalid_argument(format!("deserialize vote: {}", e)))?; let resp = raft @@ -754,7 +754,7 @@ impl ClusterServiceTrait for ClusterGrpcService { .await .map_err(|e| Status::internal(format!("raft vote: {}", e)))?; - let resp_data = bincode::serialize(&resp) + let resp_data = crate::codec::serialize(&resp) .map_err(|e| Status::internal(format!("serialize vote response: {}", e)))?; Ok(Response::new(RaftVoteResponse { data: resp_data })) @@ -773,7 +773,7 @@ impl ClusterServiceTrait for ClusterGrpcService { let data = request.into_inner().data; let append_req: openraft::raft::AppendEntriesRequest< crate::cluster::raft_node::TypeConfig, - > = bincode::deserialize(&data) + > = crate::codec::deserialize(&data) .map_err(|e| Status::invalid_argument(format!("deserialize append_entries: {}", e)))?; let resp = raft @@ -782,7 +782,7 @@ impl ClusterServiceTrait for ClusterGrpcService { .await .map_err(|e| Status::internal(format!("raft append_entries: {}", e)))?; - let resp_data = bincode::serialize(&resp) + let resp_data = crate::codec::serialize(&resp) .map_err(|e| Status::internal(format!("serialize append_entries response: {}", e)))?; Ok(Response::new(RaftAppendEntriesResponse { data: resp_data })) @@ -803,11 +803,11 @@ impl ClusterServiceTrait for ClusterGrpcService { let inner = request.into_inner(); let vote: openraft::alias::VoteOf = - bincode::deserialize(&inner.vote_data) + crate::codec::deserialize(&inner.vote_data) .map_err(|e| Status::invalid_argument(format!("deserialize vote: {}", e)))?; let meta: openraft::alias::SnapshotMetaOf = - bincode::deserialize(&inner.snapshot_meta).map_err(|e| { + crate::codec::deserialize(&inner.snapshot_meta).map_err(|e| { Status::invalid_argument(format!("deserialize snapshot meta: {}", e)) })?; @@ -824,7 +824,7 @@ impl ClusterServiceTrait for ClusterGrpcService { .await .map_err(|e| Status::internal(format!("raft install_full_snapshot: {}", e)))?; - let resp_data = bincode::serialize(&resp) + let resp_data = crate::codec::serialize(&resp) .map_err(|e| Status::internal(format!("serialize snapshot response: {}", e)))?; Ok(Response::new(RaftSnapshotResponse { data: resp_data })) diff --git a/src/cluster/mod.rs b/src/cluster/mod.rs index 31d88050..a6941206 100755 --- a/src/cluster/mod.rs +++ b/src/cluster/mod.rs @@ -11,6 +11,7 @@ pub mod leader_router; mod manager; mod node; pub mod raft_node; +pub mod raft_watcher; mod server_client; pub mod shard_migrator; mod shard_router; @@ -30,6 +31,7 @@ use parking_lot::RwLock; pub use raft_node::{ ClusterCommand, ClusterResponse, ClusterStateMachine, RaftManager, TypeConfig, }; +pub use raft_watcher::RaftWatcher; pub use server_client::{ClusterClient, ClusterClientPool}; pub use shard_router::DistributedShardRouter; pub use state_sync::ClusterStateSynchronizer; diff --git a/src/cluster/raft_node.rs b/src/cluster/raft_node.rs index 639fa898..503c64af 100644 --- a/src/cluster/raft_node.rs +++ b/src/cluster/raft_node.rs @@ -512,7 +512,7 @@ impl openraft::network::v2::RaftNetworkV2 for ClusterRaftConnection _option: openraft::network::RPCOption, ) -> Result, openraft::error::RPCError> { - let data = bincode::serialize(&rpc).map_err(|e| { + let data = crate::codec::serialize(&rpc).map_err(|e| { openraft::error::RPCError::Unreachable(openraft::error::Unreachable::new(&e)) })?; @@ -539,7 +539,7 @@ impl openraft::network::v2::RaftNetworkV2 for ClusterRaftConnection })?; let resp: openraft::raft::VoteResponse = - bincode::deserialize(&response.into_inner().data).map_err(|e| { + crate::codec::deserialize(&response.into_inner().data).map_err(|e| { openraft::error::RPCError::Unreachable(openraft::error::Unreachable::new(&e)) })?; @@ -555,7 +555,7 @@ impl openraft::network::v2::RaftNetworkV2 for ClusterRaftConnection openraft::raft::AppendEntriesResponse, openraft::error::RPCError, > { - let data = bincode::serialize(&rpc).map_err(|e| { + let data = crate::codec::serialize(&rpc).map_err(|e| { openraft::error::RPCError::Unreachable(openraft::error::Unreachable::new(&e)) })?; @@ -582,7 +582,7 @@ impl openraft::network::v2::RaftNetworkV2 for ClusterRaftConnection })?; let resp: openraft::raft::AppendEntriesResponse = - bincode::deserialize(&response.into_inner().data).map_err(|e| { + crate::codec::deserialize(&response.into_inner().data).map_err(|e| { openraft::error::RPCError::Unreachable(openraft::error::Unreachable::new(&e)) })?; @@ -602,11 +602,11 @@ impl openraft::network::v2::RaftNetworkV2 for ClusterRaftConnection openraft::raft::SnapshotResponse, openraft::error::StreamingError, > { - let vote_data = bincode::serialize(&vote).map_err(|e| { + let vote_data = crate::codec::serialize(&vote).map_err(|e| { openraft::error::StreamingError::Unreachable(openraft::error::Unreachable::new(&e)) })?; - let snapshot_meta = bincode::serialize(&snapshot.meta).map_err(|e| { + let snapshot_meta = crate::codec::serialize(&snapshot.meta).map_err(|e| { openraft::error::StreamingError::Unreachable(openraft::error::Unreachable::new(&e)) })?; @@ -640,7 +640,7 @@ impl openraft::network::v2::RaftNetworkV2 for ClusterRaftConnection })?; let resp: openraft::raft::SnapshotResponse = - bincode::deserialize(&response.into_inner().data).map_err(|e| { + crate::codec::deserialize(&response.into_inner().data).map_err(|e| { openraft::error::StreamingError::Unreachable(openraft::error::Unreachable::new(&e)) })?; diff --git a/src/cluster/raft_watcher.rs b/src/cluster/raft_watcher.rs new file mode 100644 index 00000000..acd32fb0 --- /dev/null +++ b/src/cluster/raft_watcher.rs @@ -0,0 +1,228 @@ +//! Raft leadership watcher — bridges Raft consensus with HA role transitions. +//! +//! Subscribes to `openraft` server metrics via `Raft::server_metrics()` and +//! reacts to leadership changes by calling [`HaManager::on_become_leader`] or +//! [`HaManager::on_become_follower`], updating the [`LeaderRouter`], and +//! ensuring the replication data-plane always matches the Raft consensus role. + +use std::sync::Arc; + +use openraft::ServerState; +// WatchReceiver trait must be in scope for `borrow_watched()` and `changed()`. +use openraft::rt::WatchReceiver; +use tokio::task::JoinHandle; +use tracing::{error, info, warn}; + +use super::ha_manager::HaManager; +use super::raft_node::{RaftManager, TypeConfig}; + +/// Default replication port used by the master TCP listener. +const DEFAULT_REPLICATION_PORT: u16 = 7001; + +/// Default REST API port (used to build leader redirect URL). +const DEFAULT_HTTP_PORT: u16 = 15002; + +/// Watches Raft server metrics for leadership changes and drives HA transitions. +/// +/// Once started, the watcher runs a background task that: +/// 1. Subscribes to `raft.server_metrics()` (a `tokio::sync::watch` channel). +/// 2. Detects transitions: Follower → Leader, Leader → Follower, etc. +/// 3. Calls `HaManager::on_become_leader()` / `on_become_follower()` accordingly. +/// 4. Updates the `LeaderRouter` so write requests are routed correctly. +pub struct RaftWatcher { + raft_manager: Arc, + ha_manager: Arc, +} + +impl RaftWatcher { + pub fn new(raft_manager: Arc, ha_manager: Arc) -> Self { + Self { + raft_manager, + ha_manager, + } + } + + /// Spawn the background watcher task. + /// + /// Returns a `JoinHandle` that runs until the Raft node shuts down or the + /// metrics channel is closed. + pub fn start(&self) -> JoinHandle<()> { + let raft = self.raft_manager.raft.clone(); + let node_id = self.raft_manager.node_id; + let ha = self.ha_manager.clone(); + let state_machine = self.raft_manager.state_machine.clone(); + + tokio::spawn(async move { + info!( + node_id, + "🔭 Raft watcher started — monitoring leadership changes" + ); + + let mut rx = raft.server_metrics(); + + // Track previous state so we only react to actual transitions. + let mut prev_state: Option = None; + let mut prev_leader: Option = None; + + loop { + // Read current metrics snapshot. + let (current_state, current_leader) = { + let metrics = rx.borrow_watched(); + (metrics.state, metrics.current_leader) + }; + + let state_changed = prev_state.as_ref() != Some(¤t_state); + let leader_changed = prev_leader != current_leader; + + if state_changed || leader_changed { + info!( + node_id, + ?current_state, + ?current_leader, + ?prev_state, + ?prev_leader, + "🔄 Raft state transition detected" + ); + + match current_state { + ServerState::Leader => { + if prev_state != Some(ServerState::Leader) { + // This node just won an election. + info!(node_id, "👑 This node became LEADER — starting MasterNode"); + + // Update LeaderRouter first so writes are accepted immediately. + let self_url = build_self_http_url(); + ha.leader_router.set_leader(node_id, self_url); + + // Start MasterNode, stop ReplicaNode. + ha.on_become_leader().await; + } + } + ServerState::Follower => { + if prev_state != Some(ServerState::Follower) || leader_changed { + // Either we just stepped down, or the leader changed. + let leader_addr = + resolve_leader_addr(&state_machine, current_leader).await; + + if let Some(ref addr) = leader_addr { + let leader_id = current_leader.unwrap_or(0); + let leader_http_url = + format!("http://{}:{}", addr, DEFAULT_HTTP_PORT); + ha.leader_router.set_leader(leader_id, leader_http_url); + + info!( + node_id, + leader_id, + leader_addr = %addr, + "📡 Following new leader" + ); + } else if current_leader.is_some() { + warn!( + node_id, + ?current_leader, + "Leader elected but address not yet in state machine" + ); + } else { + ha.leader_router.clear_leader(); + } + + // Build the master replication address for the ReplicaNode. + let repl_addr = leader_addr + .map(|addr| format!("{}:{}", addr, DEFAULT_REPLICATION_PORT)); + + ha.on_become_follower(repl_addr).await; + } + } + ServerState::Candidate => { + if prev_state != Some(ServerState::Candidate) { + info!(node_id, "🗳️ Election in progress — node is Candidate"); + ha.leader_router.clear_leader(); + } + } + ServerState::Learner => { + info!(node_id, "📚 Node is Learner (non-voting)"); + } + ServerState::Shutdown => { + info!(node_id, "🛑 Raft shutting down — watcher exiting"); + break; + } + } + + prev_state = Some(current_state); + prev_leader = current_leader; + } + + // Wait for the next metrics change. This suspends the task + // (zero CPU) until openraft publishes a new value. + if rx.changed().await.is_err() { + info!(node_id, "Raft metrics channel closed — watcher exiting"); + break; + } + } + }) + } +} + +/// Resolve the leader's IP/hostname from the Raft state machine. +/// +/// The state machine's `nodes` map stores `node_id → (address, grpc_port)`. +/// We use the address portion to build both the HTTP URL and the replication +/// TCP address. +async fn resolve_leader_addr( + state_machine: &Arc, + leader_id: Option, +) -> Option { + let leader_id = leader_id?; + let state = state_machine.state().await; + + state + .nodes + .get(&leader_id) + .map(|(address, _grpc_port)| address.clone()) +} + +/// Build the HTTP URL for this node. +/// +/// In Kubernetes, the pod's hostname is typically set to the pod name, and +/// the headless service makes it resolvable as `...svc.cluster.local`. +/// We use `0.0.0.0` here because the LeaderRouter only needs this for the +/// "am I the leader?" check — followers get the leader URL from the state machine. +fn build_self_http_url() -> String { + // Try to use HOSTNAME env var (set by Kubernetes) for a routable address. + if let Ok(hostname) = std::env::var("HOSTNAME") { + // In K8s with a headless service, the hostname is the pod name. + // If VECTORIZER_SERVICE_NAME is set, build a fully qualified DNS name. + if let Ok(svc) = std::env::var("VECTORIZER_SERVICE_NAME") { + return format!("http://{}.{}:{}", hostname, svc, DEFAULT_HTTP_PORT); + } + return format!("http://{}:{}", hostname, DEFAULT_HTTP_PORT); + } + + // Fallback: use POD_IP if available (injected via Kubernetes downward API). + if let Ok(pod_ip) = std::env::var("POD_IP") { + return format!("http://{}:{}", pod_ip, DEFAULT_HTTP_PORT); + } + + // Last resort: localhost (only works for single-node testing). + format!("http://127.0.0.1:{}", DEFAULT_HTTP_PORT) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_build_self_http_url_fallback() { + // When no env vars are set, should fall back to localhost. + // SAFETY: test is single-threaded; no concurrent env access. + unsafe { + std::env::remove_var("HOSTNAME"); + std::env::remove_var("VECTORIZER_SERVICE_NAME"); + std::env::remove_var("POD_IP"); + } + + let url = build_self_http_url(); + assert!(url.contains("127.0.0.1")); + assert!(url.contains("15002")); + } +} diff --git a/src/codec.rs b/src/codec.rs new file mode 100644 index 00000000..da328a43 --- /dev/null +++ b/src/codec.rs @@ -0,0 +1,63 @@ +//! Binary codec helpers — thin wrappers around `bincode` v3. +//! +//! Provides `serialize` / `deserialize` functions that match the old `bincode` +//! v1 API signatures while using the v3 engine underneath with +//! [`bincode::config::legacy()`] for wire-format compatibility. +//! +//! All existing call sites can switch from `bincode::serialize` to +//! `crate::codec::serialize` (and likewise for `deserialize`) with no other +//! code changes. + +use serde::Serialize; +use serde::de::DeserializeOwned; + +// Re-export the error types so callers can keep `codec::Error` in their +// signatures without importing bincode directly. + +/// Unified error type covering both encode and decode failures. +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("encode error: {0}")] + Encode(#[from] bincode::error::EncodeError), + #[error("decode error: {0}")] + Decode(#[from] bincode::error::DecodeError), +} + +/// Bincode v1 used `Box` as its error type. +/// Many call sites propagate via `?` into `From`. +/// This type alias keeps those `From` impls working after migration. +pub type Result = std::result::Result; + +/// Wire-format-compatible configuration (matches bincode v1 defaults). +const fn legacy_config() -> bincode::config::Configuration< + bincode::config::LittleEndian, + bincode::config::Fixint, + bincode::config::NoLimit, +> { + bincode::config::legacy() +} + +/// Serialize `value` into a `Vec` using the bincode v1 wire format. +/// +/// Drop-in replacement for `bincode::serialize`. +pub fn serialize(value: &T) -> Result> { + Ok(bincode::serde::encode_to_vec(value, legacy_config())?) +} + +/// Deserialize a `T` from `bytes` using the bincode v1 wire format. +/// +/// Drop-in replacement for `bincode::deserialize`. +pub fn deserialize(bytes: &[u8]) -> Result { + let (val, _len) = bincode::serde::decode_from_slice(bytes, legacy_config())?; + Ok(val) +} + +/// Return the serialized size of `value` in the bincode v1 wire format. +/// +/// Drop-in replacement for `bincode::serialized_size`. +/// Implemented by performing a full serialize — slightly less efficient than +/// the old dedicated function, but correct and rarely called. +pub fn serialized_size(value: &T) -> Result { + let bytes = serialize(value)?; + Ok(bytes.len() as u64) +} diff --git a/src/db/auto_save.rs b/src/db/auto_save.rs index 54b739d3..d7efdfd5 100755 --- a/src/db/auto_save.rs +++ b/src/db/auto_save.rs @@ -6,7 +6,7 @@ use std::time::{Duration, Instant}; use tokio::sync::RwLock; use tokio::time::sleep; -use tracing::{error, info, warn}; +use tracing::{debug, error, info, warn}; use crate::db::VectorStore; use crate::error::Result; @@ -241,6 +241,18 @@ impl AutoSaveManager { let mut last = last_snapshot.write().await; *last = Instant::now(); } + } else if error_msg.contains("No data to snapshot") + || error_msg.contains("no data") + || error_msg.contains("does not exist") + { + // No .vecdb file yet — node is empty or still syncing. + // Log as debug and reset timer to avoid spamming. + debug!( + "📸 Snapshot: Skipped — no data to snapshot yet (data_dir: {:?})", + data_dir + ); + let mut last = last_snapshot.write().await; + *last = Instant::now(); } else { // Other errors are logged normally error!( diff --git a/src/embedding/cache.rs b/src/embedding/cache.rs index 448d6dc7..c900f81c 100755 --- a/src/embedding/cache.rs +++ b/src/embedding/cache.rs @@ -322,7 +322,7 @@ impl CacheShard { // Load existing index let entries = if index_file.exists() { let data = std::fs::read(&index_file)?; - bincode::deserialize(&data)? + crate::codec::deserialize(&data)? } else { HashMap::new() }; @@ -423,7 +423,7 @@ impl CacheShard { fn save_index(&self) -> Result<()> { let index_file = self.data_file.with_extension("idx"); - let data = bincode::serialize(&self.entries)?; + let data = crate::codec::serialize(&self.entries)?; std::fs::write(&index_file, data)?; Ok(()) } diff --git a/src/error.rs b/src/error.rs index f0500c75..fa0ac2ed 100755 --- a/src/error.rs +++ b/src/error.rs @@ -37,9 +37,9 @@ pub enum VectorizerError { #[error("Configuration error: {0}")] ConfigurationError(String), - /// Serialization error + /// Serialization error (bincode encode/decode) #[error("Serialization error: {0}")] - SerializationError(#[from] bincode::Error), + SerializationError(#[from] crate::codec::Error), /// IO error #[error("IO error: {0}")] diff --git a/src/grpc/qdrant/qdrant.rs b/src/grpc/qdrant/qdrant.rs old mode 100755 new mode 100644 index d12fa8ff..b42ddafc --- a/src/grpc/qdrant/qdrant.rs +++ b/src/grpc/qdrant/qdrant.rs @@ -65,7 +65,7 @@ pub struct ListValue { /// `NullValue` is a singleton enumeration to represent the null value for the /// `Value` type union. /// -/// The JSON representation for `NullValue` is JSON `null`. +/// The JSON representation for `NullValue` is JSON `null`. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum NullValue { @@ -90,14 +90,14 @@ impl NullValue { } } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct PointId { #[prost(oneof = "point_id::PointIdOptions", tags = "1, 2")] pub point_id_options: ::core::option::Option, } /// Nested message and enum types in `PointId`. pub mod point_id { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum PointIdOptions { /// Numerical ID of the point #[prost(uint64, tag = "1")] @@ -161,12 +161,12 @@ pub mod condition { HasVector(super::HasVectorCondition), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct IsEmptyCondition { #[prost(string, tag = "1")] pub key: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct IsNullCondition { #[prost(string, tag = "1")] pub key: ::prost::alloc::string::String, @@ -176,7 +176,7 @@ pub struct HasIdCondition { #[prost(message, repeated, tag = "1")] pub has_id: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct HasVectorCondition { #[prost(string, tag = "1")] pub has_vector: ::prost::alloc::string::String, @@ -222,14 +222,14 @@ pub struct FieldCondition { #[prost(bool, optional, tag = "10")] pub is_null: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct Match { #[prost(oneof = "r#match::MatchValue", tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10")] pub match_value: ::core::option::Option, } /// Nested message and enum types in `Match`. pub mod r#match { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum MatchValue { /// Match string keyword #[prost(string, tag = "1")] @@ -263,12 +263,12 @@ pub mod r#match { TextAny(::prost::alloc::string::String), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RepeatedStrings { #[prost(string, repeated, tag = "1")] pub strings: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RepeatedIntegers { #[prost(int64, repeated, tag = "1")] pub integers: ::prost::alloc::vec::Vec, @@ -284,7 +284,7 @@ pub struct Range { #[prost(double, optional, tag = "4")] pub lte: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct DatetimeRange { #[prost(message, optional, tag = "1")] pub lt: ::core::option::Option<::prost_types::Timestamp>, @@ -330,7 +330,7 @@ pub struct GeoPolygon { #[prost(message, repeated, tag = "2")] pub interiors: ::prost::alloc::vec::Vec, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ValuesCount { #[prost(uint64, optional, tag = "1")] pub lt: ::core::option::Option, @@ -420,7 +420,7 @@ pub mod vectors_config_diff { ParamsMap(super::VectorParamsDiffMap), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct SparseVectorParams { /// Configuration of sparse index #[prost(message, optional, tag = "1")] @@ -437,24 +437,24 @@ pub struct SparseVectorConfig { SparseVectorParams, >, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct MultiVectorConfig { /// Comparator for multi-vector search #[prost(enumeration = "MultiVectorComparator", tag = "1")] pub comparator: i32, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetCollectionInfoRequest { /// Name of the collection #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionExistsRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionExists { #[prost(bool, tag = "1")] pub exists: bool, @@ -467,9 +467,9 @@ pub struct CollectionExistsResponse { #[prost(double, tag = "2")] pub time: f64, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListCollectionsRequest {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionDescription { /// Name of the collection #[prost(string, tag = "1")] @@ -491,7 +491,7 @@ pub struct ListCollectionsResponse { #[prost(double, tag = "2")] pub time: f64, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct MaxOptimizationThreads { #[prost(oneof = "max_optimization_threads::Variant", tags = "1, 2")] pub variant: ::core::option::Option, @@ -531,7 +531,7 @@ pub mod max_optimization_threads { } } } - #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Variant { #[prost(uint64, tag = "1")] Value(u64), @@ -539,29 +539,26 @@ pub mod max_optimization_threads { Setting(i32), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct OptimizerStatus { #[prost(bool, tag = "1")] pub ok: bool, #[prost(string, tag = "2")] pub error: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionWarning { #[prost(string, tag = "1")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct HnswConfigDiff { - /// /// Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. #[prost(uint64, optional, tag = "1")] pub m: ::core::option::Option, - /// /// Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build the index. #[prost(uint64, optional, tag = "2")] pub ef_construct: ::core::option::Option, - /// /// Minimal size threshold (in KiloBytes) below which full-scan is preferred over HNSW search. /// This measures the total size of vectors being queried against. /// When the maximum estimated amount of points that a condition satisfies is smaller than @@ -570,22 +567,18 @@ pub struct HnswConfigDiff { /// Note: 1Kb = 1 vector of size 256 #[prost(uint64, optional, tag = "3")] pub full_scan_threshold: ::core::option::Option, - /// /// Number of parallel threads used for background index building. /// If 0 - automatically select from 8 to 16. /// Best to keep between 8 and 16 to prevent likelihood of building broken/inefficient HNSW graphs. /// On small CPUs, less threads are used. #[prost(uint64, optional, tag = "4")] pub max_indexing_threads: ::core::option::Option, - /// /// Store HNSW index on disk. If set to false, the index will be stored in RAM. #[prost(bool, optional, tag = "5")] pub on_disk: ::core::option::Option, - /// /// Number of additional payload-aware links per node in the index graph. If not set - regular M parameter will be used. #[prost(uint64, optional, tag = "6")] pub payload_m: ::core::option::Option, - /// /// Store copies of original and quantized vectors within the HNSW index file. Default: false. /// Enabling this option will trade the search speed for disk usage by reducing amount of /// random seeks during the search. @@ -593,23 +586,20 @@ pub struct HnswConfigDiff { #[prost(bool, optional, tag = "7")] pub inline_storage: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct SparseIndexConfig { - /// /// Prefer a full scan search upto (excluding) this number of vectors. /// Note: this is number of vectors, not KiloBytes. #[prost(uint64, optional, tag = "1")] pub full_scan_threshold: ::core::option::Option, - /// /// Store inverted index on disk. If set to false, the index will be stored in RAM. #[prost(bool, optional, tag = "2")] pub on_disk: ::core::option::Option, - /// /// Datatype used to store weights in the index. #[prost(enumeration = "Datatype", optional, tag = "3")] pub datatype: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct WalConfigDiff { /// Size of a single WAL block file #[prost(uint64, optional, tag = "1")] @@ -623,26 +613,22 @@ pub struct WalConfigDiff { } #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct OptimizersConfigDiff { - /// /// The minimal fraction of deleted vectors in a segment, required to perform segment optimization #[prost(double, optional, tag = "1")] pub deleted_threshold: ::core::option::Option, - /// /// The minimal number of vectors in a segment, required to perform segment optimization #[prost(uint64, optional, tag = "2")] pub vacuum_min_vector_number: ::core::option::Option, - /// /// Target amount of segments the optimizer will try to keep. /// Real amount of segments may vary depending on multiple parameters: /// - /// - Amount of stored points. - /// - Current write RPS. + /// * Amount of stored points. + /// * Current write RPS. /// /// It is recommended to select the default number of segments as a factor of the number of search threads, /// so that each segment would be handled evenly by one of the threads. #[prost(uint64, optional, tag = "3")] pub default_segment_number: ::core::option::Option, - /// /// Deprecated: /// /// Do not create segments larger this size (in kilobytes). @@ -655,7 +641,6 @@ pub struct OptimizersConfigDiff { /// If not set, will be automatically selected considering the number of available CPUs. #[prost(uint64, optional, tag = "4")] pub max_segment_size: ::core::option::Option, - /// /// Maximum size (in kilobytes) of vectors to store in-memory per segment. /// Segments larger than this threshold will be stored as read-only memmapped file. /// @@ -666,7 +651,6 @@ pub struct OptimizersConfigDiff { /// Note: 1Kb = 1 vector of size 256 #[prost(uint64, optional, tag = "5")] pub memmap_threshold: ::core::option::Option, - /// /// Maximum size (in kilobytes) of vectors allowed for plain index, exceeding this threshold will enable vector indexing /// /// Default value is 20,000, based on <.> @@ -676,14 +660,12 @@ pub struct OptimizersConfigDiff { /// Note: 1kB = 1 vector of size 256. #[prost(uint64, optional, tag = "6")] pub indexing_threshold: ::core::option::Option, - /// /// Interval between forced flushes. #[prost(uint64, optional, tag = "7")] pub flush_interval_sec: ::core::option::Option, /// Deprecated in favor of `max_optimization_threads` #[prost(uint64, optional, tag = "8")] pub deprecated_max_optimization_threads: ::core::option::Option, - /// /// Max number of threads (jobs) for running optimizations per shard. /// Note: each optimization job will also use `max_indexing_threads` threads by itself for index building. /// If "auto" - have no limit and choose dynamically to saturate CPU. @@ -703,7 +685,7 @@ pub struct ScalarQuantization { #[prost(bool, optional, tag = "3")] pub always_ram: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ProductQuantization { /// Compression ratio #[prost(enumeration = "CompressionRatio", tag = "1")] @@ -712,7 +694,7 @@ pub struct ProductQuantization { #[prost(bool, optional, tag = "2")] pub always_ram: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct BinaryQuantizationQueryEncoding { #[prost(oneof = "binary_quantization_query_encoding::Variant", tags = "4")] pub variant: ::core::option::Option, @@ -761,13 +743,13 @@ pub mod binary_quantization_query_encoding { } } } - #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Variant { #[prost(enumeration = "Setting", tag = "4")] Setting(i32), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct BinaryQuantization { /// If true - quantized vectors always will be stored in RAM, ignoring the config of main storage #[prost(bool, optional, tag = "1")] @@ -775,7 +757,6 @@ pub struct BinaryQuantization { /// Binary quantization encoding method #[prost(enumeration = "BinaryQuantizationEncoding", optional, tag = "2")] pub encoding: ::core::option::Option, - /// /// Asymmetric quantization configuration allows a query to have different quantization than stored vectors. /// It can increase the accuracy of search at the cost of performance. #[prost(message, optional, tag = "3")] @@ -798,7 +779,7 @@ pub mod quantization_config { Binary(super::BinaryQuantization), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct Disabled {} #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct QuantizationConfigDiff { @@ -887,7 +868,7 @@ pub struct StrictModeSparseConfig { StrictModeSparse, >, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct StrictModeSparse { /// Max length of sparse vector #[prost(uint64, optional, tag = "10")] @@ -901,7 +882,7 @@ pub struct StrictModeMultivectorConfig { StrictModeMultivector, >, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct StrictModeMultivector { /// Max number of vectors in a multivector #[prost(uint64, optional, tag = "1")] @@ -988,7 +969,7 @@ pub struct UpdateCollection { #[prost(map = "string, message", tag = "10")] pub metadata: ::std::collections::HashMap<::prost::alloc::string::String, Value>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteCollection { /// Name of the collection #[prost(string, tag = "1")] @@ -1033,7 +1014,7 @@ pub struct CollectionParams { #[prost(message, optional, tag = "10")] pub sparse_vectors_config: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionParamsDiff { /// Number of replicas of each shard that network tries to maintain #[prost(uint32, optional, tag = "1")] @@ -1072,7 +1053,7 @@ pub struct CollectionConfig { #[prost(map = "string, message", tag = "7")] pub metadata: ::std::collections::HashMap<::prost::alloc::string::String, Value>, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct KeywordIndexParams { /// If true - used for tenant optimization. #[prost(bool, optional, tag = "1")] @@ -1081,7 +1062,7 @@ pub struct KeywordIndexParams { #[prost(bool, optional, tag = "2")] pub on_disk: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct IntegerIndexParams { /// If true - support direct lookups. Default is true. #[prost(bool, optional, tag = "1")] @@ -1096,7 +1077,7 @@ pub struct IntegerIndexParams { #[prost(bool, optional, tag = "4")] pub on_disk: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct FloatIndexParams { /// If true - store index on disk. #[prost(bool, optional, tag = "1")] @@ -1105,13 +1086,13 @@ pub struct FloatIndexParams { #[prost(bool, optional, tag = "2")] pub is_principal: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct GeoIndexParams { /// If true - store index on disk. #[prost(bool, optional, tag = "1")] pub on_disk: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct StopwordsSet { /// List of languages to use stopwords from #[prost(string, repeated, tag = "1")] @@ -1120,7 +1101,7 @@ pub struct StopwordsSet { #[prost(string, repeated, tag = "2")] pub custom: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct TextIndexParams { /// Tokenizer type #[prost(enumeration = "TokenizerType", tag = "1")] @@ -1150,33 +1131,33 @@ pub struct TextIndexParams { #[prost(bool, optional, tag = "9")] pub ascii_folding: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct StemmingAlgorithm { #[prost(oneof = "stemming_algorithm::StemmingParams", tags = "1")] pub stemming_params: ::core::option::Option, } /// Nested message and enum types in `StemmingAlgorithm`. pub mod stemming_algorithm { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum StemmingParams { /// Parameters for snowball stemming #[prost(message, tag = "1")] Snowball(super::SnowballParams), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct SnowballParams { /// Which language the algorithm should stem. #[prost(string, tag = "1")] pub language: ::prost::alloc::string::String, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct BoolIndexParams { /// If true - store index on disk. #[prost(bool, optional, tag = "1")] pub on_disk: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct DatetimeIndexParams { /// If true - store index on disk. #[prost(bool, optional, tag = "1")] @@ -1185,7 +1166,7 @@ pub struct DatetimeIndexParams { #[prost(bool, optional, tag = "2")] pub is_principal: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct UuidIndexParams { /// If true - used for tenant optimization. #[prost(bool, optional, tag = "1")] @@ -1194,7 +1175,7 @@ pub struct UuidIndexParams { #[prost(bool, optional, tag = "2")] pub on_disk: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct PayloadIndexParams { #[prost( oneof = "payload_index_params::IndexParams", @@ -1204,7 +1185,7 @@ pub struct PayloadIndexParams { } /// Nested message and enum types in `PayloadIndexParams`. pub mod payload_index_params { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum IndexParams { /// Parameters for keyword index #[prost(message, tag = "3")] @@ -1232,7 +1213,7 @@ pub mod payload_index_params { UuidIndexParams(super::UuidIndexParams), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct PayloadSchemaInfo { /// Field data type #[prost(enumeration = "PayloadSchemaType", tag = "1")] @@ -1283,14 +1264,14 @@ pub struct ChangeAliases { #[prost(uint64, optional, tag = "2")] pub timeout: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct AliasOperations { #[prost(oneof = "alias_operations::Action", tags = "1, 2, 3")] pub action: ::core::option::Option, } /// Nested message and enum types in `AliasOperations`. pub mod alias_operations { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Action { #[prost(message, tag = "1")] CreateAlias(super::CreateAlias), @@ -1300,7 +1281,7 @@ pub mod alias_operations { DeleteAlias(super::DeleteAlias), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateAlias { /// Name of the collection #[prost(string, tag = "1")] @@ -1309,7 +1290,7 @@ pub struct CreateAlias { #[prost(string, tag = "2")] pub alias_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RenameAlias { /// Name of the alias to rename #[prost(string, tag = "1")] @@ -1318,21 +1299,21 @@ pub struct RenameAlias { #[prost(string, tag = "2")] pub new_alias_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteAlias { /// Name of the alias #[prost(string, tag = "1")] pub alias_name: ::prost::alloc::string::String, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListAliasesRequest {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListCollectionAliasesRequest { /// Name of the collection #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct AliasDescription { /// Name of the alias #[prost(string, tag = "1")] @@ -1349,20 +1330,20 @@ pub struct ListAliasesResponse { #[prost(double, tag = "2")] pub time: f64, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionClusterInfoRequest { /// Name of the collection #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ShardKey { #[prost(oneof = "shard_key::Key", tags = "1, 2")] pub key: ::core::option::Option, } /// Nested message and enum types in `ShardKey`. pub mod shard_key { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Key { /// String key #[prost(string, tag = "1")] @@ -1372,7 +1353,7 @@ pub mod shard_key { Number(u64), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct LocalShardInfo { /// Local shard id #[prost(uint32, tag = "1")] @@ -1387,7 +1368,7 @@ pub struct LocalShardInfo { #[prost(message, optional, tag = "4")] pub shard_key: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteShardInfo { /// Local shard id #[prost(uint32, tag = "1")] @@ -1402,7 +1383,7 @@ pub struct RemoteShardInfo { #[prost(message, optional, tag = "4")] pub shard_key: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ShardTransferInfo { /// Local shard id #[prost(uint32, tag = "1")] @@ -1417,7 +1398,7 @@ pub struct ShardTransferInfo { #[prost(bool, tag = "4")] pub sync: bool, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ReshardingInfo { #[prost(uint32, tag = "1")] pub shard_id: u32, @@ -1449,7 +1430,7 @@ pub struct CollectionClusterInfoResponse { #[prost(message, repeated, tag = "6")] pub resharding_operations: ::prost::alloc::vec::Vec, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct MoveShard { /// Local shard id #[prost(uint32, tag = "1")] @@ -1463,7 +1444,7 @@ pub struct MoveShard { #[prost(enumeration = "ShardTransferMethod", optional, tag = "4")] pub method: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ReplicateShard { /// Local shard id #[prost(uint32, tag = "1")] @@ -1477,7 +1458,7 @@ pub struct ReplicateShard { #[prost(enumeration = "ShardTransferMethod", optional, tag = "4")] pub method: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct AbortShardTransfer { /// Local shard id #[prost(uint32, tag = "1")] @@ -1489,7 +1470,7 @@ pub struct AbortShardTransfer { #[prost(uint64, tag = "3")] pub to_peer_id: u64, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct RestartTransfer { /// Local shard id #[prost(uint32, tag = "1")] @@ -1515,14 +1496,14 @@ pub struct ReplicatePoints { #[prost(message, optional, tag = "3")] pub filter: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct Replica { #[prost(uint32, tag = "1")] pub shard_id: u32, #[prost(uint64, tag = "2")] pub peer_id: u64, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateShardKey { /// User-defined shard key #[prost(message, optional, tag = "1")] @@ -1540,7 +1521,7 @@ pub struct CreateShardKey { #[prost(enumeration = "ReplicaState", optional, tag = "5")] pub initial_state: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteShardKey { /// Shard key to delete #[prost(message, optional, tag = "1")] @@ -1584,12 +1565,12 @@ pub mod update_collection_cluster_setup_request { ReplicatePoints(super::ReplicatePoints), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct UpdateCollectionClusterSetupResponse { #[prost(bool, tag = "1")] pub result: bool, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateShardKeyRequest { /// Name of the collection #[prost(string, tag = "1")] @@ -1601,7 +1582,7 @@ pub struct CreateShardKeyRequest { #[prost(uint64, optional, tag = "3")] pub timeout: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteShardKeyRequest { /// Name of the collection #[prost(string, tag = "1")] @@ -1613,12 +1594,12 @@ pub struct DeleteShardKeyRequest { #[prost(uint64, optional, tag = "3")] pub timeout: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateShardKeyResponse { #[prost(bool, tag = "1")] pub result: bool, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteShardKeyResponse { #[prost(bool, tag = "1")] pub result: bool, @@ -2039,7 +2020,6 @@ impl ReplicaState { } } } -/// /// Resharding direction, scale up or down in number of shards #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] @@ -2133,7 +2113,7 @@ pub mod collections_client { } impl CollectionsClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -2154,13 +2134,13 @@ pub mod collections_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { CollectionsClient::new(InterceptedService::new(inner, interceptor)) @@ -2196,7 +2176,6 @@ pub mod collections_client { self.inner = self.inner.max_encoding_message_size(limit); self } - /// /// Get detailed information about specified existing collection pub async fn get( &mut self, @@ -2213,13 +2192,12 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Collections/Get"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Collections", "Get")); self.inner.unary(req, path, codec).await } - /// /// Get list name of all existing collections pub async fn list( &mut self, @@ -2236,13 +2214,12 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Collections/List"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Collections", "List")); self.inner.unary(req, path, codec).await } - /// /// Create new collection with given parameters pub async fn create( &mut self, @@ -2259,7 +2236,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/Create", ); @@ -2267,7 +2244,6 @@ pub mod collections_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Collections", "Create")); self.inner.unary(req, path, codec).await } - /// /// Update parameters of the existing collection pub async fn update( &mut self, @@ -2284,7 +2260,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/Update", ); @@ -2292,7 +2268,6 @@ pub mod collections_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Collections", "Update")); self.inner.unary(req, path, codec).await } - /// /// Drop collection and all associated data pub async fn delete( &mut self, @@ -2309,7 +2284,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/Delete", ); @@ -2317,7 +2292,6 @@ pub mod collections_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Collections", "Delete")); self.inner.unary(req, path, codec).await } - /// /// Update Aliases of the existing collection pub async fn update_aliases( &mut self, @@ -2334,7 +2308,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/UpdateAliases", ); @@ -2343,7 +2317,6 @@ pub mod collections_client { .insert(GrpcMethod::new("qdrant.Collections", "UpdateAliases")); self.inner.unary(req, path, codec).await } - /// /// Get list of all aliases for a collection pub async fn list_collection_aliases( &mut self, @@ -2360,7 +2333,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/ListCollectionAliases", ); @@ -2369,7 +2342,6 @@ pub mod collections_client { .insert(GrpcMethod::new("qdrant.Collections", "ListCollectionAliases")); self.inner.unary(req, path, codec).await } - /// /// Get list of all aliases for all existing collections pub async fn list_aliases( &mut self, @@ -2386,7 +2358,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/ListAliases", ); @@ -2395,7 +2367,6 @@ pub mod collections_client { .insert(GrpcMethod::new("qdrant.Collections", "ListAliases")); self.inner.unary(req, path, codec).await } - /// /// Get cluster information for a collection pub async fn collection_cluster_info( &mut self, @@ -2412,7 +2383,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/CollectionClusterInfo", ); @@ -2421,7 +2392,6 @@ pub mod collections_client { .insert(GrpcMethod::new("qdrant.Collections", "CollectionClusterInfo")); self.inner.unary(req, path, codec).await } - /// /// Check the existence of a collection pub async fn collection_exists( &mut self, @@ -2438,7 +2408,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/CollectionExists", ); @@ -2447,7 +2417,6 @@ pub mod collections_client { .insert(GrpcMethod::new("qdrant.Collections", "CollectionExists")); self.inner.unary(req, path, codec).await } - /// /// Update cluster setup for a collection pub async fn update_collection_cluster_setup( &mut self, @@ -2464,7 +2433,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/UpdateCollectionClusterSetup", ); @@ -2475,7 +2444,6 @@ pub mod collections_client { ); self.inner.unary(req, path, codec).await } - /// /// Create shard key pub async fn create_shard_key( &mut self, @@ -2492,7 +2460,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/CreateShardKey", ); @@ -2501,7 +2469,6 @@ pub mod collections_client { .insert(GrpcMethod::new("qdrant.Collections", "CreateShardKey")); self.inner.unary(req, path, codec).await } - /// /// Delete shard key pub async fn delete_shard_key( &mut self, @@ -2518,7 +2485,7 @@ pub mod collections_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Collections/DeleteShardKey", ); @@ -2542,7 +2509,6 @@ pub mod collections_server { /// Generated trait containing gRPC methods that should be implemented for use with CollectionsServer. #[async_trait] pub trait Collections: std::marker::Send + std::marker::Sync + 'static { - /// /// Get detailed information about specified existing collection async fn get( &self, @@ -2551,7 +2517,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Get list name of all existing collections async fn list( &self, @@ -2560,7 +2525,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Create new collection with given parameters async fn create( &self, @@ -2569,7 +2533,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Update parameters of the existing collection async fn update( &self, @@ -2578,7 +2541,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Drop collection and all associated data async fn delete( &self, @@ -2587,7 +2549,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Update Aliases of the existing collection async fn update_aliases( &self, @@ -2596,7 +2557,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Get list of all aliases for a collection async fn list_collection_aliases( &self, @@ -2605,7 +2565,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Get list of all aliases for all existing collections async fn list_aliases( &self, @@ -2614,7 +2573,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Get cluster information for a collection async fn collection_cluster_info( &self, @@ -2623,7 +2581,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Check the existence of a collection async fn collection_exists( &self, @@ -2632,7 +2589,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Update cluster setup for a collection async fn update_collection_cluster_setup( &self, @@ -2641,7 +2597,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Create shard key async fn create_shard_key( &self, @@ -2650,7 +2605,6 @@ pub mod collections_server { tonic::Response, tonic::Status, >; - /// /// Delete shard key async fn delete_shard_key( &self, @@ -2725,7 +2679,7 @@ pub mod collections_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -2766,7 +2720,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = GetSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -2811,7 +2765,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = ListSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -2856,7 +2810,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = CreateSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -2901,7 +2855,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -2946,7 +2900,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -2991,7 +2945,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateAliasesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3037,7 +2991,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = ListCollectionAliasesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3082,7 +3036,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = ListAliasesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3128,7 +3082,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = CollectionClusterInfoSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3173,7 +3127,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = CollectionExistsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3225,7 +3179,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateCollectionClusterSetupSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3270,7 +3224,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = CreateShardKeySvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3315,7 +3269,7 @@ pub mod collections_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteShardKeySvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -3332,7 +3286,9 @@ pub mod collections_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( @@ -3368,20 +3324,20 @@ pub mod collections_server { const NAME: &'static str = SERVICE_NAME; } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct WriteOrdering { /// Write ordering guarantees #[prost(enumeration = "WriteOrderingType", tag = "1")] pub r#type: i32, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ReadConsistency { #[prost(oneof = "read_consistency::Value", tags = "1, 2")] pub value: ::core::option::Option, } /// Nested message and enum types in `ReadConsistency`. pub mod read_consistency { - #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Value { /// Common read consistency configurations #[prost(enumeration = "super::ReadConsistencyType", tag = "1")] @@ -3391,7 +3347,7 @@ pub mod read_consistency { Factor(u64), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct SparseIndices { #[prost(uint32, repeated, tag = "1")] pub data: ::prost::alloc::vec::Vec, @@ -3729,7 +3685,7 @@ pub struct ClearPayloadPoints { #[prost(message, optional, tag = "5")] pub shard_key_selector: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateFieldIndexCollection { /// name of the collection #[prost(string, tag = "1")] @@ -3750,7 +3706,7 @@ pub struct CreateFieldIndexCollection { #[prost(message, optional, tag = "6")] pub ordering: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteFieldIndexCollection { /// name of the collection #[prost(string, tag = "1")] @@ -3765,26 +3721,26 @@ pub struct DeleteFieldIndexCollection { #[prost(message, optional, tag = "4")] pub ordering: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct PayloadIncludeSelector { /// List of payload keys to include into result #[prost(string, repeated, tag = "1")] pub fields: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct PayloadExcludeSelector { /// List of payload keys to exclude from the result #[prost(string, repeated, tag = "1")] pub fields: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct WithPayloadSelector { #[prost(oneof = "with_payload_selector::SelectorOptions", tags = "1, 2, 3")] pub selector_options: ::core::option::Option, } /// Nested message and enum types in `WithPayloadSelector`. pub mod with_payload_selector { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum SelectorOptions { /// If `true` - return all payload, if `false` - none #[prost(bool, tag = "1")] @@ -3838,20 +3794,20 @@ pub mod vectors_output { Vectors(super::NamedVectorsOutput), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct VectorsSelector { /// List of vectors to include into result #[prost(string, repeated, tag = "1")] pub names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct WithVectorsSelector { #[prost(oneof = "with_vectors_selector::SelectorOptions", tags = "1, 2")] pub selector_options: ::core::option::Option, } /// Nested message and enum types in `WithVectorsSelector`. pub mod with_vectors_selector { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum SelectorOptions { /// If `true` - return all vectors, if `false` - none #[prost(bool, tag = "1")] @@ -3863,15 +3819,12 @@ pub mod with_vectors_selector { } #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct QuantizationSearchParams { - /// /// If set to true, search will ignore quantized vector data #[prost(bool, optional, tag = "1")] pub ignore: ::core::option::Option, - /// /// If true, use original vectors to re-score top-k results. If ignored, qdrant decides automatically does rescore enabled or not. #[prost(bool, optional, tag = "2")] pub rescore: ::core::option::Option, - /// /// Oversampling factor for quantization. /// /// Defines how many extra vectors should be pre-selected using quantized index, @@ -3884,7 +3837,6 @@ pub struct QuantizationSearchParams { } #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct AcornSearchParams { - /// /// If true, then ACORN may be used for the HNSW search based on filters /// selectivity. /// @@ -3892,7 +3844,6 @@ pub struct AcornSearchParams { /// payload filters, at cost of performance. #[prost(bool, optional, tag = "1")] pub enable: ::core::option::Option, - /// /// Maximum selectivity of filters to enable ACORN. /// /// If estimated filters selectivity is higher than this value, @@ -3905,26 +3856,21 @@ pub struct AcornSearchParams { } #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct SearchParams { - /// /// Params relevant to HNSW index. Size of the beam in a beam-search. /// Larger the value - more accurate the result, more time required for search. #[prost(uint64, optional, tag = "1")] pub hnsw_ef: ::core::option::Option, - /// /// Search without approximation. If set to true, search may run long but with exact results. #[prost(bool, optional, tag = "2")] pub exact: ::core::option::Option, - /// /// If set to true, search will ignore quantized vector data #[prost(message, optional, tag = "3")] pub quantization: ::core::option::Option, - /// /// If enabled, the engine will only perform search among indexed or small segments. /// Using this option prevents slow searches in case of delayed index, but does not /// guarantee that all uploaded vectors will be included in search results #[prost(bool, optional, tag = "4")] pub indexed_only: ::core::option::Option, - /// /// ACORN search params #[prost(message, optional, tag = "5")] pub acorn: ::core::option::Option, @@ -3987,7 +3933,7 @@ pub struct SearchBatchPoints { #[prost(uint64, optional, tag = "4")] pub timeout: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct WithLookup { /// Name of the collection to use for points lookup #[prost(string, tag = "1")] @@ -4563,7 +4509,7 @@ pub struct Mmr { pub candidates_limit: ::core::option::Option, } /// Parameterized reciprocal rank fusion -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct Rrf { /// K parameter for reciprocal rank fusion #[prost(uint32, optional, tag = "1")] @@ -4779,14 +4725,14 @@ pub struct FacetCounts { #[prost(message, optional, tag = "8")] pub shard_key_selector: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct FacetValue { #[prost(oneof = "facet_value::Variant", tags = "1, 2, 3")] pub variant: ::core::option::Option, } /// Nested message and enum types in `FacetValue`. pub mod facet_value { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Variant { /// String value from the facet #[prost(string, tag = "1")] @@ -4799,7 +4745,7 @@ pub mod facet_value { BoolValue(bool), } } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct FacetHit { /// Value from the facet #[prost(message, optional, tag = "1")] @@ -4980,6 +4926,7 @@ pub mod points_update_operation { pub enum Operation { #[prost(message, tag = "1")] Upsert(PointStructList), + #[deprecated] #[prost(message, tag = "2")] DeleteDeprecated(super::PointsSelector), #[prost(message, tag = "3")] @@ -4988,6 +4935,7 @@ pub mod points_update_operation { OverwritePayload(OverwritePayload), #[prost(message, tag = "5")] DeletePayload(DeletePayload), + #[deprecated] #[prost(message, tag = "6")] ClearPayloadDeprecated(super::PointsSelector), #[prost(message, tag = "7")] @@ -5024,7 +4972,7 @@ pub struct PointsOperationResponse { #[prost(message, optional, tag = "3")] pub usage: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct UpdateResult { /// Number of operation #[prost(uint64, optional, tag = "1")] @@ -5072,14 +5020,14 @@ pub struct ScoredPoint { #[prost(message, optional, tag = "8")] pub order_value: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GroupId { #[prost(oneof = "group_id::Kind", tags = "1, 2, 3")] pub kind: ::core::option::Option, } /// Nested message and enum types in `GroupId`. pub mod group_id { - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Kind { /// Represents a double value. #[prost(uint64, tag = "1")] @@ -5198,7 +5146,7 @@ pub struct ScrollResponse { #[prost(message, optional, tag = "4")] pub usage: ::core::option::Option, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CountResult { #[prost(uint64, tag = "1")] pub count: u64, @@ -5349,9 +5297,9 @@ pub struct PointStruct { #[prost(message, optional, tag = "4")] pub vectors: ::core::option::Option, } -/// --------------------------------------------- -/// ----------- Measurements collector ---------- -/// --------------------------------------------- +/// --- +/// +/// ## ----------- Measurements collector ---------- #[derive(Clone, PartialEq, ::prost::Message)] pub struct Usage { #[prost(message, optional, tag = "1")] @@ -5364,12 +5312,12 @@ pub struct InferenceUsage { #[prost(map = "string, message", tag = "1")] pub models: ::std::collections::HashMap<::prost::alloc::string::String, ModelUsage>, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ModelUsage { #[prost(uint64, tag = "1")] pub tokens: u64, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct HardwareUsage { #[prost(uint64, tag = "1")] pub cpu: u64, @@ -5676,7 +5624,7 @@ pub mod points_client { } impl PointsClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -5697,13 +5645,13 @@ pub mod points_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { PointsClient::new(InterceptedService::new(inner, interceptor)) @@ -5739,7 +5687,6 @@ pub mod points_client { self.inner = self.inner.max_encoding_message_size(limit); self } - /// /// Perform insert + updates on points. If a point with a given ID already exists - it will be overwritten. pub async fn upsert( &mut self, @@ -5756,13 +5703,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Upsert"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Upsert")); self.inner.unary(req, path, codec).await } - /// /// Delete points pub async fn delete( &mut self, @@ -5779,13 +5725,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Delete"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Delete")); self.inner.unary(req, path, codec).await } - /// /// Retrieve points pub async fn get( &mut self, @@ -5799,13 +5744,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Get"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Get")); self.inner.unary(req, path, codec).await } - /// /// Update named vectors for point pub async fn update_vectors( &mut self, @@ -5822,7 +5766,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/UpdateVectors", ); @@ -5831,7 +5775,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "UpdateVectors")); self.inner.unary(req, path, codec).await } - /// /// Delete named vectors for points pub async fn delete_vectors( &mut self, @@ -5848,7 +5791,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/DeleteVectors", ); @@ -5857,7 +5800,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "DeleteVectors")); self.inner.unary(req, path, codec).await } - /// /// Set payload for points pub async fn set_payload( &mut self, @@ -5874,13 +5816,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/SetPayload"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "SetPayload")); self.inner.unary(req, path, codec).await } - /// /// Overwrite payload for points pub async fn overwrite_payload( &mut self, @@ -5897,7 +5838,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/OverwritePayload", ); @@ -5906,7 +5847,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "OverwritePayload")); self.inner.unary(req, path, codec).await } - /// /// Delete specified key payload for points pub async fn delete_payload( &mut self, @@ -5923,7 +5863,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/DeletePayload", ); @@ -5932,7 +5872,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "DeletePayload")); self.inner.unary(req, path, codec).await } - /// /// Remove all payload for specified points pub async fn clear_payload( &mut self, @@ -5949,7 +5888,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/ClearPayload", ); @@ -5958,7 +5897,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "ClearPayload")); self.inner.unary(req, path, codec).await } - /// /// Create index for field in collection pub async fn create_field_index( &mut self, @@ -5975,7 +5913,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/CreateFieldIndex", ); @@ -5984,7 +5922,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "CreateFieldIndex")); self.inner.unary(req, path, codec).await } - /// /// Delete field index for collection pub async fn delete_field_index( &mut self, @@ -6001,7 +5938,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/DeleteFieldIndex", ); @@ -6010,7 +5947,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "DeleteFieldIndex")); self.inner.unary(req, path, codec).await } - /// /// Retrieve closest points based on vector similarity and given filtering conditions pub async fn search( &mut self, @@ -6024,13 +5960,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Search"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Search")); self.inner.unary(req, path, codec).await } - /// /// Retrieve closest points based on vector similarity and given filtering conditions pub async fn search_batch( &mut self, @@ -6047,7 +5982,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/SearchBatch", ); @@ -6055,7 +5990,6 @@ pub mod points_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "SearchBatch")); self.inner.unary(req, path, codec).await } - /// /// Retrieve closest points based on vector similarity and given filtering conditions, grouped by a given field pub async fn search_groups( &mut self, @@ -6072,7 +6006,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/SearchGroups", ); @@ -6081,7 +6015,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "SearchGroups")); self.inner.unary(req, path, codec).await } - /// /// Iterate over all or filtered points pub async fn scroll( &mut self, @@ -6095,13 +6028,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Scroll"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Scroll")); self.inner.unary(req, path, codec).await } - /// /// Look for the points which are closer to stored positive examples and at the same time further to negative examples. pub async fn recommend( &mut self, @@ -6118,13 +6050,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Recommend"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Recommend")); self.inner.unary(req, path, codec).await } - /// /// Look for the points which are closer to stored positive examples and at the same time further to negative examples. pub async fn recommend_batch( &mut self, @@ -6141,7 +6072,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/RecommendBatch", ); @@ -6150,7 +6081,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "RecommendBatch")); self.inner.unary(req, path, codec).await } - /// /// Look for the points which are closer to stored positive examples and at the same time further to negative examples, grouped by a given field pub async fn recommend_groups( &mut self, @@ -6167,7 +6097,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/RecommendGroups", ); @@ -6176,7 +6106,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "RecommendGroups")); self.inner.unary(req, path, codec).await } - /// /// Use context and a target to find the most similar points to the target, constrained by the context. /// /// When using only the context (without a target), a special search - called context search - is performed where @@ -6207,13 +6136,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Discover"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Discover")); self.inner.unary(req, path, codec).await } - /// /// Batch request points based on { positive, negative } pairs of examples, and/or a target pub async fn discover_batch( &mut self, @@ -6230,7 +6158,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/DiscoverBatch", ); @@ -6239,7 +6167,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "DiscoverBatch")); self.inner.unary(req, path, codec).await } - /// /// Count points in collection with given filtering conditions pub async fn count( &mut self, @@ -6253,13 +6180,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Count"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Count")); self.inner.unary(req, path, codec).await } - /// /// Perform multiple update operations in one request pub async fn update_batch( &mut self, @@ -6276,7 +6202,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/UpdateBatch", ); @@ -6284,7 +6210,6 @@ pub mod points_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "UpdateBatch")); self.inner.unary(req, path, codec).await } - /// /// Universally query points. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. pub async fn query( &mut self, @@ -6298,13 +6223,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Query"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Query")); self.inner.unary(req, path, codec).await } - /// /// Universally query points in a batch fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. pub async fn query_batch( &mut self, @@ -6321,13 +6245,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/QueryBatch"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "QueryBatch")); self.inner.unary(req, path, codec).await } - /// /// Universally query points in a group fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. pub async fn query_groups( &mut self, @@ -6344,7 +6267,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/QueryGroups", ); @@ -6352,7 +6275,6 @@ pub mod points_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "QueryGroups")); self.inner.unary(req, path, codec).await } - /// /// Perform facet counts. For each value in the field, count the number of points that have this value and match the conditions. pub async fn facet( &mut self, @@ -6366,13 +6288,12 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Points/Facet"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Points", "Facet")); self.inner.unary(req, path, codec).await } - /// /// Compute distance matrix for sampled points with a pair based output format pub async fn search_matrix_pairs( &mut self, @@ -6389,7 +6310,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/SearchMatrixPairs", ); @@ -6398,7 +6319,6 @@ pub mod points_client { .insert(GrpcMethod::new("qdrant.Points", "SearchMatrixPairs")); self.inner.unary(req, path, codec).await } - /// /// Compute distance matrix for sampled points with an offset based output format pub async fn search_matrix_offsets( &mut self, @@ -6415,7 +6335,7 @@ pub mod points_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Points/SearchMatrixOffsets", ); @@ -6439,7 +6359,6 @@ pub mod points_server { /// Generated trait containing gRPC methods that should be implemented for use with PointsServer. #[async_trait] pub trait Points: std::marker::Send + std::marker::Sync + 'static { - /// /// Perform insert + updates on points. If a point with a given ID already exists - it will be overwritten. async fn upsert( &self, @@ -6448,7 +6367,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Delete points async fn delete( &self, @@ -6457,13 +6375,11 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Retrieve points async fn get( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; - /// /// Update named vectors for point async fn update_vectors( &self, @@ -6472,7 +6388,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Delete named vectors for points async fn delete_vectors( &self, @@ -6481,7 +6396,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Set payload for points async fn set_payload( &self, @@ -6490,7 +6404,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Overwrite payload for points async fn overwrite_payload( &self, @@ -6499,7 +6412,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Delete specified key payload for points async fn delete_payload( &self, @@ -6508,7 +6420,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Remove all payload for specified points async fn clear_payload( &self, @@ -6517,7 +6428,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Create index for field in collection async fn create_field_index( &self, @@ -6526,7 +6436,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Delete field index for collection async fn delete_field_index( &self, @@ -6535,13 +6444,11 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Retrieve closest points based on vector similarity and given filtering conditions async fn search( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; - /// /// Retrieve closest points based on vector similarity and given filtering conditions async fn search_batch( &self, @@ -6550,7 +6457,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Retrieve closest points based on vector similarity and given filtering conditions, grouped by a given field async fn search_groups( &self, @@ -6559,13 +6465,11 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Iterate over all or filtered points async fn scroll( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; - /// /// Look for the points which are closer to stored positive examples and at the same time further to negative examples. async fn recommend( &self, @@ -6574,7 +6478,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Look for the points which are closer to stored positive examples and at the same time further to negative examples. async fn recommend_batch( &self, @@ -6583,7 +6486,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Look for the points which are closer to stored positive examples and at the same time further to negative examples, grouped by a given field async fn recommend_groups( &self, @@ -6592,7 +6494,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Use context and a target to find the most similar points to the target, constrained by the context. /// /// When using only the context (without a target), a special search - called context search - is performed where @@ -6615,7 +6516,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Batch request points based on { positive, negative } pairs of examples, and/or a target async fn discover_batch( &self, @@ -6624,13 +6524,11 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Count points in collection with given filtering conditions async fn count( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; - /// /// Perform multiple update operations in one request async fn update_batch( &self, @@ -6639,13 +6537,11 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Universally query points. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. async fn query( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; - /// /// Universally query points in a batch fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. async fn query_batch( &self, @@ -6654,7 +6550,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Universally query points in a group fashion. This endpoint covers all capabilities of search, recommend, discover, filters. But also enables hybrid and multi-stage queries. async fn query_groups( &self, @@ -6663,13 +6558,11 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Perform facet counts. For each value in the field, count the number of points that have this value and match the conditions. async fn facet( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; - /// /// Compute distance matrix for sampled points with a pair based output format async fn search_matrix_pairs( &self, @@ -6678,7 +6571,6 @@ pub mod points_server { tonic::Response, tonic::Status, >; - /// /// Compute distance matrix for sampled points with an offset based output format async fn search_matrix_offsets( &self, @@ -6753,7 +6645,7 @@ pub mod points_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -6792,7 +6684,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = UpsertSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -6835,7 +6727,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -6878,7 +6770,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = GetSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -6923,7 +6815,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateVectorsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -6968,7 +6860,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteVectorsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7011,7 +6903,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = SetPayloadSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7054,7 +6946,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = OverwritePayloadSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7099,7 +6991,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = DeletePayloadSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7144,7 +7036,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = ClearPayloadSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7189,7 +7081,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = CreateFieldIndexSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7234,7 +7126,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteFieldIndexSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7277,7 +7169,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = SearchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7320,7 +7212,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = SearchBatchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7363,7 +7255,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = SearchGroupsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7406,7 +7298,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = ScrollSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7449,7 +7341,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = RecommendSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7494,7 +7386,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = RecommendBatchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7539,7 +7431,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = RecommendGroupsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7582,7 +7474,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = DiscoverSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7627,7 +7519,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = DiscoverBatchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7670,7 +7562,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = CountSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7713,7 +7605,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateBatchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7756,7 +7648,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = QuerySvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7799,7 +7691,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = QueryBatchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7842,7 +7734,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = QueryGroupsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7885,7 +7777,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = FacetSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7930,7 +7822,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = SearchMatrixPairsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7975,7 +7867,7 @@ pub mod points_server { let inner = self.inner.clone(); let fut = async move { let method = SearchMatrixOffsetsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -7992,7 +7884,9 @@ pub mod points_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( @@ -8028,29 +7922,29 @@ pub mod points_server { const NAME: &'static str = SERVICE_NAME; } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateFullSnapshotRequest {} -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListFullSnapshotsRequest {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteFullSnapshotRequest { /// Name of the full snapshot #[prost(string, tag = "1")] pub snapshot_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateSnapshotRequest { /// Name of the collection #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListSnapshotsRequest { /// Name of the collection #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteSnapshotRequest { /// Name of the collection #[prost(string, tag = "1")] @@ -8059,7 +7953,7 @@ pub struct DeleteSnapshotRequest { #[prost(string, tag = "2")] pub snapshot_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct SnapshotDescription { /// Name of the snapshot #[prost(string, tag = "1")] @@ -8124,7 +8018,7 @@ pub mod snapshots_client { } impl SnapshotsClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -8145,13 +8039,13 @@ pub mod snapshots_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { SnapshotsClient::new(InterceptedService::new(inner, interceptor)) @@ -8187,7 +8081,6 @@ pub mod snapshots_client { self.inner = self.inner.max_encoding_message_size(limit); self } - /// /// Create collection snapshot pub async fn create( &mut self, @@ -8204,13 +8097,12 @@ pub mod snapshots_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Snapshots/Create"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Snapshots", "Create")); self.inner.unary(req, path, codec).await } - /// /// List collection snapshots pub async fn list( &mut self, @@ -8227,13 +8119,12 @@ pub mod snapshots_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Snapshots/List"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Snapshots", "List")); self.inner.unary(req, path, codec).await } - /// /// Delete collection snapshot pub async fn delete( &mut self, @@ -8250,13 +8141,12 @@ pub mod snapshots_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static("/qdrant.Snapshots/Delete"); let mut req = request.into_request(); req.extensions_mut().insert(GrpcMethod::new("qdrant.Snapshots", "Delete")); self.inner.unary(req, path, codec).await } - /// /// Create full storage snapshot pub async fn create_full( &mut self, @@ -8273,7 +8163,7 @@ pub mod snapshots_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Snapshots/CreateFull", ); @@ -8282,7 +8172,6 @@ pub mod snapshots_client { .insert(GrpcMethod::new("qdrant.Snapshots", "CreateFull")); self.inner.unary(req, path, codec).await } - /// /// List full storage snapshots pub async fn list_full( &mut self, @@ -8299,7 +8188,7 @@ pub mod snapshots_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Snapshots/ListFull", ); @@ -8307,7 +8196,6 @@ pub mod snapshots_client { req.extensions_mut().insert(GrpcMethod::new("qdrant.Snapshots", "ListFull")); self.inner.unary(req, path, codec).await } - /// /// Delete full storage snapshot pub async fn delete_full( &mut self, @@ -8324,7 +8212,7 @@ pub mod snapshots_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/qdrant.Snapshots/DeleteFull", ); @@ -8348,7 +8236,6 @@ pub mod snapshots_server { /// Generated trait containing gRPC methods that should be implemented for use with SnapshotsServer. #[async_trait] pub trait Snapshots: std::marker::Send + std::marker::Sync + 'static { - /// /// Create collection snapshot async fn create( &self, @@ -8357,7 +8244,6 @@ pub mod snapshots_server { tonic::Response, tonic::Status, >; - /// /// List collection snapshots async fn list( &self, @@ -8366,7 +8252,6 @@ pub mod snapshots_server { tonic::Response, tonic::Status, >; - /// /// Delete collection snapshot async fn delete( &self, @@ -8375,7 +8260,6 @@ pub mod snapshots_server { tonic::Response, tonic::Status, >; - /// /// Create full storage snapshot async fn create_full( &self, @@ -8384,7 +8268,6 @@ pub mod snapshots_server { tonic::Response, tonic::Status, >; - /// /// List full storage snapshots async fn list_full( &self, @@ -8393,7 +8276,6 @@ pub mod snapshots_server { tonic::Response, tonic::Status, >; - /// /// Delete full storage snapshot async fn delete_full( &self, @@ -8468,7 +8350,7 @@ pub mod snapshots_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -8509,7 +8391,7 @@ pub mod snapshots_server { let inner = self.inner.clone(); let fut = async move { let method = CreateSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -8554,7 +8436,7 @@ pub mod snapshots_server { let inner = self.inner.clone(); let fut = async move { let method = ListSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -8599,7 +8481,7 @@ pub mod snapshots_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -8644,7 +8526,7 @@ pub mod snapshots_server { let inner = self.inner.clone(); let fut = async move { let method = CreateFullSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -8689,7 +8571,7 @@ pub mod snapshots_server { let inner = self.inner.clone(); let fut = async move { let method = ListFullSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -8734,7 +8616,7 @@ pub mod snapshots_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteFullSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -8751,7 +8633,9 @@ pub mod snapshots_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/src/grpc/vectorizer.cluster.rs b/src/grpc/vectorizer.cluster.rs old mode 100755 new mode 100644 index 768f7141..df2ace02 --- a/src/grpc/vectorizer.cluster.rs +++ b/src/grpc/vectorizer.cluster.rs @@ -1,7 +1,7 @@ // This file is @generated by prost-build. /// Tenant context for multi-tenant operations /// Propagated across cluster nodes for user isolation -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct TenantContext { /// Tenant/user ID (UUID format) #[prost(string, tag = "1")] @@ -17,7 +17,7 @@ pub struct TenantContext { pub trace_id: ::core::option::Option<::prost::alloc::string::String>, } /// Cluster state messages -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetClusterStateRequest { #[prost(string, tag = "1")] pub node_id: ::prost::alloc::string::String, @@ -43,7 +43,7 @@ pub struct UpdateClusterStateRequest { #[prost(message, repeated, tag = "2")] pub shard_assignments: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct UpdateClusterStateResponse { #[prost(bool, tag = "1")] pub success: bool, @@ -79,7 +79,7 @@ pub struct NodeMetadata { #[prost(float, tag = "5")] pub cpu_usage: f32, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ShardAssignment { #[prost(uint32, tag = "1")] pub shard_id: u32, @@ -104,7 +104,7 @@ pub struct RemoteInsertVectorRequest { #[prost(message, optional, tag = "5")] pub tenant: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteInsertVectorResponse { #[prost(bool, tag = "1")] pub success: bool, @@ -125,14 +125,14 @@ pub struct RemoteUpdateVectorRequest { #[prost(message, optional, tag = "5")] pub tenant: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteUpdateVectorResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteDeleteVectorRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, @@ -142,7 +142,7 @@ pub struct RemoteDeleteVectorRequest { #[prost(message, optional, tag = "3")] pub tenant: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteDeleteVectorResponse { #[prost(bool, tag = "1")] pub success: bool, @@ -187,7 +187,7 @@ pub struct SearchResult { pub payload_json: ::core::option::Option<::prost::alloc::string::String>, } /// Remote collection operation messages -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteCreateCollectionRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, @@ -197,14 +197,14 @@ pub struct RemoteCreateCollectionRequest { #[prost(message, optional, tag = "3")] pub tenant: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteCreateCollectionResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteGetCollectionInfoRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, @@ -212,7 +212,7 @@ pub struct RemoteGetCollectionInfoRequest { #[prost(message, optional, tag = "2")] pub tenant: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteGetCollectionInfoResponse { #[prost(message, optional, tag = "1")] pub info: ::core::option::Option, @@ -221,7 +221,7 @@ pub struct RemoteGetCollectionInfoResponse { #[prost(string, tag = "3")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteDeleteCollectionRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, @@ -229,7 +229,7 @@ pub struct RemoteDeleteCollectionRequest { #[prost(message, optional, tag = "2")] pub tenant: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RemoteDeleteCollectionResponse { #[prost(bool, tag = "1")] pub success: bool, @@ -237,7 +237,7 @@ pub struct RemoteDeleteCollectionResponse { pub message: ::prost::alloc::string::String, } /// Health check messages -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct HealthCheckRequest { #[prost(string, tag = "1")] pub node_id: ::prost::alloc::string::String, @@ -252,7 +252,7 @@ pub struct HealthCheckResponse { pub metadata: ::core::option::Option, } /// Distributed quota check messages -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CheckQuotaRequest { /// Tenant to check quota for #[prost(message, optional, tag = "1")] @@ -264,7 +264,7 @@ pub struct CheckQuotaRequest { #[prost(uint64, tag = "3")] pub requested_amount: u64, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CheckQuotaResponse { /// Whether the quota allows the operation #[prost(bool, tag = "1")] @@ -283,7 +283,7 @@ pub struct CheckQuotaResponse { pub message: ::prost::alloc::string::String, } /// Shard vector migration messages -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetShardVectorsRequest { /// Name of the collection to fetch vectors from #[prost(string, tag = "1")] @@ -326,7 +326,7 @@ pub struct VectorData { pub payload_json: ::core::option::Option<::prost::alloc::string::String>, } /// Reused from vectorizer.proto (simplified for cluster service) -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionConfig { #[prost(uint32, tag = "1")] pub dimension: u32, @@ -334,7 +334,7 @@ pub struct CollectionConfig { #[prost(string, tag = "2")] pub metric: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionInfo { #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, @@ -344,31 +344,31 @@ pub struct CollectionInfo { #[prost(uint64, tag = "3")] pub document_count: u64, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RaftVoteRequest { /// bincode-serialized VoteRequest #[prost(bytes = "vec", tag = "1")] pub data: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RaftVoteResponse { /// bincode-serialized VoteResponse #[prost(bytes = "vec", tag = "1")] pub data: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RaftAppendEntriesRequest { /// bincode-serialized AppendEntriesRequest #[prost(bytes = "vec", tag = "1")] pub data: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RaftAppendEntriesResponse { /// bincode-serialized AppendEntriesResponse #[prost(bytes = "vec", tag = "1")] pub data: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RaftSnapshotRequest { #[prost(bytes = "vec", tag = "1")] pub vote_data: ::prost::alloc::vec::Vec, @@ -377,7 +377,7 @@ pub struct RaftSnapshotRequest { #[prost(bytes = "vec", tag = "3")] pub snapshot_data: ::prost::alloc::vec::Vec, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RaftSnapshotResponse { #[prost(bytes = "vec", tag = "1")] pub data: ::prost::alloc::vec::Vec, @@ -472,7 +472,7 @@ pub mod cluster_service_client { } impl ClusterServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -493,13 +493,13 @@ pub mod cluster_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { ClusterServiceClient::new(InterceptedService::new(inner, interceptor)) @@ -551,7 +551,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/GetClusterState", ); @@ -581,7 +581,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/UpdateClusterState", ); @@ -611,7 +611,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteInsertVector", ); @@ -640,7 +640,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteUpdateVector", ); @@ -669,7 +669,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteDeleteVector", ); @@ -698,7 +698,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteSearchVectors", ); @@ -728,7 +728,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteCreateCollection", ); @@ -757,7 +757,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteGetCollectionInfo", ); @@ -786,7 +786,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RemoteDeleteCollection", ); @@ -816,7 +816,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/HealthCheck", ); @@ -843,7 +843,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/CheckQuota", ); @@ -870,7 +870,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/GetShardVectors", ); @@ -900,7 +900,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RaftVote", ); @@ -926,7 +926,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RaftAppendEntries", ); @@ -955,7 +955,7 @@ pub mod cluster_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.cluster.ClusterService/RaftSnapshot", ); @@ -1161,7 +1161,7 @@ pub mod cluster_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -1203,7 +1203,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = GetClusterStateSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1249,7 +1249,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateClusterStateSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1295,7 +1295,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteInsertVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1341,7 +1341,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteUpdateVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1387,7 +1387,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteDeleteVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1436,7 +1436,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteSearchVectorsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1485,7 +1485,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteCreateCollectionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1536,7 +1536,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteGetCollectionInfoSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1585,7 +1585,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RemoteDeleteCollectionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1630,7 +1630,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = HealthCheckSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1675,7 +1675,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = CheckQuotaSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1721,7 +1721,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = GetShardVectorsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1766,7 +1766,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RaftVoteSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1812,7 +1812,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RaftAppendEntriesSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1857,7 +1857,7 @@ pub mod cluster_service_server { let inner = self.inner.clone(); let fut = async move { let method = RaftSnapshotSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1874,7 +1874,9 @@ pub mod cluster_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/src/grpc/vectorizer.rs b/src/grpc/vectorizer.rs old mode 100755 new mode 100644 index 0847421e..b5334770 --- a/src/grpc/vectorizer.rs +++ b/src/grpc/vectorizer.rs @@ -1,42 +1,42 @@ // This file is @generated by prost-build. /// Collection management messages -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListCollectionsRequest {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ListCollectionsResponse { #[prost(string, repeated, tag = "1")] pub collection_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateCollectionRequest { #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, #[prost(message, optional, tag = "2")] pub config: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateCollectionResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetCollectionInfoRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetCollectionInfoResponse { #[prost(message, optional, tag = "1")] pub info: ::core::option::Option, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteCollectionRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteCollectionResponse { #[prost(bool, tag = "1")] pub success: bool, @@ -58,14 +58,14 @@ pub struct InsertVectorRequest { ::prost::alloc::string::String, >, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct InsertVectorResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct InsertVectorsResponse { #[prost(uint32, tag = "1")] pub inserted_count: u32, @@ -74,7 +74,7 @@ pub struct InsertVectorsResponse { #[prost(string, repeated, tag = "3")] pub errors: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetVectorRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, @@ -107,21 +107,21 @@ pub struct UpdateVectorRequest { ::prost::alloc::string::String, >, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct UpdateVectorResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteVectorRequest { #[prost(string, tag = "1")] pub collection_name: ::prost::alloc::string::String, #[prost(string, tag = "2")] pub vector_id: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteVectorResponse { #[prost(bool, tag = "1")] pub success: bool, @@ -179,9 +179,9 @@ pub struct HybridSearchResponse { pub results: ::prost::alloc::vec::Vec, } /// Health and stats messages -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct HealthCheckRequest {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct HealthCheckResponse { #[prost(string, tag = "1")] pub status: ::prost::alloc::string::String, @@ -190,9 +190,9 @@ pub struct HealthCheckResponse { #[prost(int64, tag = "3")] pub timestamp: i64, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetStatsRequest {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetStatsResponse { #[prost(uint32, tag = "1")] pub collections_count: u32, @@ -204,7 +204,7 @@ pub struct GetStatsResponse { pub version: ::prost::alloc::string::String, } /// Common data structures -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionConfig { #[prost(uint32, tag = "1")] pub dimension: u32, @@ -217,7 +217,7 @@ pub struct CollectionConfig { #[prost(enumeration = "StorageType", tag = "5")] pub storage_type: i32, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CollectionInfo { #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, @@ -282,7 +282,7 @@ pub struct HybridSearchConfig { #[prost(enumeration = "HybridScoringAlgorithm", tag = "5")] pub algorithm: i32, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct HnswConfig { #[prost(uint32, tag = "1")] pub m: u32, @@ -293,14 +293,14 @@ pub struct HnswConfig { #[prost(uint64, tag = "4")] pub seed: u64, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct QuantizationConfig { #[prost(oneof = "quantization_config::Config", tags = "1, 2, 3")] pub config: ::core::option::Option, } /// Nested message and enum types in `QuantizationConfig`. pub mod quantization_config { - #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Config { #[prost(message, tag = "1")] Scalar(super::ScalarQuantization), @@ -310,19 +310,19 @@ pub mod quantization_config { Binary(super::BinaryQuantization), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ScalarQuantization { #[prost(uint32, tag = "1")] pub bits: u32, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ProductQuantization { #[prost(uint32, tag = "1")] pub subvectors: u32, #[prost(uint32, tag = "2")] pub centroids: u32, } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct BinaryQuantization {} #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] @@ -437,7 +437,7 @@ pub mod vectorizer_service_client { } impl VectorizerServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -458,13 +458,13 @@ pub mod vectorizer_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { VectorizerServiceClient::new(InterceptedService::new(inner, interceptor)) @@ -516,7 +516,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/ListCollections", ); @@ -542,7 +542,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/CreateCollection", ); @@ -568,7 +568,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/GetCollectionInfo", ); @@ -594,7 +594,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/DeleteCollection", ); @@ -621,7 +621,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/InsertVector", ); @@ -647,7 +647,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/InsertVectors", ); @@ -673,7 +673,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/GetVector", ); @@ -697,7 +697,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/UpdateVector", ); @@ -721,7 +721,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/DeleteVector", ); @@ -743,7 +743,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/Search", ); @@ -767,7 +767,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/BatchSearch", ); @@ -791,7 +791,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/HybridSearch", ); @@ -816,7 +816,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/HealthCheck", ); @@ -840,7 +840,7 @@ pub mod vectorizer_service_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/vectorizer.VectorizerService/GetStats", ); @@ -1030,7 +1030,7 @@ pub mod vectorizer_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -1072,7 +1072,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = ListCollectionsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1118,7 +1118,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = CreateCollectionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1167,7 +1167,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = GetCollectionInfoSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1213,7 +1213,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteCollectionSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1259,7 +1259,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = InsertVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1307,7 +1307,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = InsertVectorsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1352,7 +1352,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = GetVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1398,7 +1398,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = UpdateVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1444,7 +1444,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = DeleteVectorSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1489,7 +1489,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = SearchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1535,7 +1535,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = BatchSearchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1581,7 +1581,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = HybridSearchSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1627,7 +1627,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = HealthCheckSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1672,7 +1672,7 @@ pub mod vectorizer_service_server { let inner = self.inner.clone(); let fut = async move { let method = GetStatsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -1689,7 +1689,9 @@ pub mod vectorizer_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/src/lib.rs b/src/lib.rs index b76aa9a5..051d66ae 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ pub mod batch; pub mod cache; pub mod cli; pub mod cluster; +pub mod codec; pub mod config; pub mod db; pub mod discovery; diff --git a/src/normalization/cache/blob_store.rs b/src/normalization/cache/blob_store.rs index aa10805e..9df42e15 100755 --- a/src/normalization/cache/blob_store.rs +++ b/src/normalization/cache/blob_store.rs @@ -155,7 +155,7 @@ impl BlobStore { } let index: HashMap = - bincode::deserialize(&data).unwrap_or_default(); + crate::codec::deserialize(&data).unwrap_or_default(); *self.index.write() = index; @@ -167,7 +167,7 @@ impl BlobStore { let index_path = self.base_path.join("index.bin"); let index = self.index.read(); - let data = bincode::serialize(&*index)?; + let data = crate::codec::serialize(&*index)?; let mut file = File::create(&index_path)?; file.write_all(&data)?; diff --git a/src/normalization/cache/warm_store.rs b/src/normalization/cache/warm_store.rs index bf70365e..56db306f 100755 --- a/src/normalization/cache/warm_store.rs +++ b/src/normalization/cache/warm_store.rs @@ -168,7 +168,7 @@ impl WarmStore { } let index: HashMap = - bincode::deserialize(&data).unwrap_or_default(); + crate::codec::deserialize(&data).unwrap_or_default(); *self.index.write() = index; @@ -180,7 +180,7 @@ impl WarmStore { let index_path = self.base_path.join("index.bin"); let index = self.index.read(); - let data = bincode::serialize(&*index)?; + let data = crate::codec::serialize(&*index)?; let mut file = File::create(&index_path)?; file.write_all(&data)?; diff --git a/src/normalization/hasher.rs b/src/normalization/hasher.rs index 16fa2b7d..d5eb2439 100755 --- a/src/normalization/hasher.rs +++ b/src/normalization/hasher.rs @@ -117,12 +117,12 @@ impl VectorKey { /// Serialize to bytes for storage key pub fn to_bytes(&self) -> Vec { - bincode::serialize(self).expect("VectorKey serialization failed") + crate::codec::serialize(self).expect("VectorKey serialization failed") } /// Deserialize from bytes - pub fn from_bytes(bytes: &[u8]) -> Result { - bincode::deserialize(bytes) + pub fn from_bytes(bytes: &[u8]) -> Result { + crate::codec::deserialize(bytes) } } diff --git a/src/persistence/mod.rs b/src/persistence/mod.rs index 49f85ddc..3f71bc6e 100755 --- a/src/persistence/mod.rs +++ b/src/persistence/mod.rs @@ -311,7 +311,7 @@ impl PersistenceManager { /// Save data with optional compression pub fn save>(&self, data: &T, path: P) -> Result<()> { - let serialized = bincode::serialize(data)?; + let serialized = crate::codec::serialize(data)?; let final_data = if self.compress { debug!("Compressing data before saving"); @@ -345,7 +345,7 @@ impl PersistenceManager { data }; - let deserialized = bincode::deserialize(&decompressed)?; + let deserialized = crate::codec::deserialize(&decompressed)?; Ok(deserialized) } } diff --git a/src/quantization/storage.rs b/src/quantization/storage.rs index c3d77e33..f3a6246f 100755 --- a/src/quantization/storage.rs +++ b/src/quantization/storage.rs @@ -159,7 +159,7 @@ impl QuantizedVectorStorage { })?; // Write metadata header - let metadata_bytes = bincode::serialize(&metadata).map_err(|e| { + let metadata_bytes = crate::codec::serialize(&metadata).map_err(|e| { QuantizationError::SerializationFailed(format!("Failed to serialize metadata: {}", e)) })?; @@ -222,12 +222,13 @@ impl QuantizedVectorStorage { file.read_exact(&mut metadata_bytes) .map_err(|e| QuantizationError::Internal(format!("Failed to read metadata: {}", e)))?; - let metadata: StorageMetadata = bincode::deserialize(&metadata_bytes).map_err(|e| { - QuantizationError::DeserializationFailed(format!( - "Failed to deserialize metadata: {}", - e - )) - })?; + let metadata: StorageMetadata = + crate::codec::deserialize(&metadata_bytes).map_err(|e| { + QuantizationError::DeserializationFailed(format!( + "Failed to deserialize metadata: {}", + e + )) + })?; // Read compressed data let mut compressed_data = Vec::new(); @@ -404,13 +405,13 @@ impl QuantizedVectorStorage { } fn serialize_vectors(&self, vectors: &QuantizedVectors) -> QuantizationResult> { - bincode::serialize(vectors).map_err(|e| { + crate::codec::serialize(vectors).map_err(|e| { QuantizationError::SerializationFailed(format!("Failed to serialize vectors: {}", e)) }) } fn deserialize_vectors(&self, data: &[u8]) -> QuantizationResult { - bincode::deserialize(data).map_err(|e| { + crate::codec::deserialize(data).map_err(|e| { QuantizationError::DeserializationFailed(format!( "Failed to deserialize vectors: {}", e diff --git a/src/replication/durable_log.rs b/src/replication/durable_log.rs index b0c30c7c..7e77ceeb 100644 --- a/src/replication/durable_log.rs +++ b/src/replication/durable_log.rs @@ -85,7 +85,7 @@ impl DurableReplicationLog { replicated: false, }; - let encoded = bincode::serialize(&entry) + let encoded = crate::codec::serialize(&entry) .map_err(|e| super::types::ReplicationError::Serialization(e))?; let len = encoded.len() as u32; @@ -200,7 +200,7 @@ impl DurableReplicationLog { } } - let entry: ReplicationWalEntry = match bincode::deserialize(&data_buf) { + let entry: ReplicationWalEntry = match crate::codec::deserialize(&data_buf) { Ok(e) => e, Err(e) => { warn!("WAL: corrupt entry after offset {}: {}", last_offset, e); @@ -260,7 +260,7 @@ impl DurableReplicationLog { } // Peek at the offset without a full decode when possible - let entry: ReplicationWalEntry = match bincode::deserialize(&data_buf) { + let entry: ReplicationWalEntry = match crate::codec::deserialize(&data_buf) { Ok(e) => e, Err(_) => break, }; diff --git a/src/replication/master.rs b/src/replication/master.rs index 1c7bc1cf..dcba5f70 100755 --- a/src/replication/master.rs +++ b/src/replication/master.rs @@ -178,7 +178,7 @@ impl MasterNode { let mut data_buf = vec![0u8; len]; stream.read_exact(&mut data_buf).await?; - let replica_offset: u64 = bincode::deserialize(&data_buf)?; + let replica_offset: u64 = crate::codec::deserialize(&data_buf)?; info!( "Replica {} connected from {} with offset {}", @@ -286,7 +286,7 @@ impl MasterNode { break; } - match bincode::deserialize::(&data_buf) { + match crate::codec::deserialize::(&data_buf) { Ok(ReplicationCommand::Ack { replica_id, offset }) => { debug!( "Received ACK from replica {} for offset {}", @@ -353,7 +353,7 @@ impl MasterNode { ) -> ReplicationResult<()> { use crate::monitoring::metrics::METRICS; - let data = bincode::serialize(cmd)?; + let data = crate::codec::serialize(cmd)?; let len = (data.len() as u32).to_be_bytes(); let total_bytes = 4 + data.len(); @@ -375,7 +375,7 @@ impl MasterNode { ) -> ReplicationResult<()> { use crate::monitoring::metrics::METRICS; - let data = bincode::serialize(cmd)?; + let data = crate::codec::serialize(cmd)?; let len = (data.len() as u32).to_be_bytes(); let total_bytes = 4 + data.len(); diff --git a/src/replication/replica.rs b/src/replication/replica.rs index d4275bf5..5bc94e7f 100755 --- a/src/replication/replica.rs +++ b/src/replication/replica.rs @@ -84,13 +84,33 @@ impl ReplicaNode { master_addr ); + let base_interval = self.config.reconnect_duration(); + let max_interval = Duration::from_secs(60); // Cap at 60 seconds + let mut current_interval = base_interval; + let mut consecutive_failures: u32 = 0; + loop { match self.connect_and_sync(master_addr).await { Ok(_) => { info!("Disconnected from master, will reconnect..."); + // Reset backoff after a successful connection. + current_interval = base_interval; + consecutive_failures = 0; } Err(e) => { - error!("Replication error: {}, will retry...", e); + consecutive_failures = consecutive_failures.saturating_add(1); + if consecutive_failures <= 3 { + error!( + "Replication error: {}, will retry in {:?}...", + e, current_interval + ); + } else if consecutive_failures % 12 == 0 { + // Log every ~12 failures to reduce spam (roughly once per minute at max backoff). + warn!( + "Replication still failing after {} attempts: {} (retrying every {:?})", + consecutive_failures, e, current_interval + ); + } } } @@ -100,8 +120,9 @@ impl ReplicaNode { state.connected = false; } - // Wait before reconnecting - sleep(self.config.reconnect_duration()).await; + // Wait with exponential backoff (base * 2^min(failures-1, 4), capped at max_interval). + sleep(current_interval).await; + current_interval = (current_interval * 2).min(max_interval); } } @@ -109,7 +130,18 @@ impl ReplicaNode { async fn connect_and_sync(&self, master_addr: std::net::SocketAddr) -> ReplicationResult<()> { info!("Connecting to master at {}", master_addr); - let mut stream = TcpStream::connect(master_addr).await?; + // Use a 5-second connection timeout to fail fast when the master is + // unreachable (e.g., pod not ready in Kubernetes), instead of waiting + // for the OS TCP timeout which can be 30-120 seconds. + let mut stream = + tokio::time::timeout(Duration::from_secs(5), TcpStream::connect(master_addr)) + .await + .map_err(|_| { + ReplicationError::Connection(format!( + "Connection to master at {} timed out after 5s", + master_addr + )) + })??; // Update state { @@ -120,7 +152,7 @@ impl ReplicaNode { // Send current offset to master let current_offset = self.state.read().offset; - let data = bincode::serialize(¤t_offset)?; + let data = crate::codec::serialize(¤t_offset)?; let len = (data.len() as u32).to_be_bytes(); stream.write_all(&len).await?; @@ -241,7 +273,7 @@ impl ReplicaNode { replica_id: replica_id.to_string(), offset, }; - let data = bincode::serialize(&ack)?; + let data = crate::codec::serialize(&ack)?; let len = (data.len() as u32).to_be_bytes(); stream.write_all(&len).await?; stream.write_all(&data).await?; @@ -274,7 +306,7 @@ impl ReplicaNode { state.total_bytes += total_bytes as u64; drop(state); - let cmd: ReplicationCommand = bincode::deserialize(&data_buf)?; + let cmd: ReplicationCommand = crate::codec::deserialize(&data_buf)?; Ok(cmd) } diff --git a/src/replication/sync.rs b/src/replication/sync.rs index 6bb717ae..5caff955 100755 --- a/src/replication/sync.rs +++ b/src/replication/sync.rs @@ -1,462 +1,464 @@ -//! Synchronization utilities for replication -//! -//! This module provides helpers for: -//! - Snapshot creation and transfer -//! - Incremental sync -//! - Checksum verification - -use serde::{Deserialize, Serialize}; -use tracing::{debug, info}; - -use crate::db::VectorStore; - -/// Snapshot metadata -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SnapshotMetadata { - pub offset: u64, - pub timestamp: u64, - pub total_collections: usize, - pub total_vectors: usize, - pub compressed: bool, - pub checksum: u32, -} - -/// Create a snapshot of all collections for full sync -pub async fn create_snapshot(store: &VectorStore, offset: u64) -> Result, String> { - info!("Creating snapshot at offset {}", offset); - - // Get all collections - let collections = store.list_collections(); - let total_collections = collections.len(); - - // Serialize collection data - let mut collection_snapshots = Vec::new(); - let mut total_vectors = 0; - - for collection_name in collections { - // Get collection - if let Ok(collection) = store.get_collection(&collection_name) { - let config = collection.config(); - total_vectors += collection.vector_count(); - - // Get all vectors from collection - let all_vectors = collection.get_all_vectors(); - - // Convert to (id, data, payload) format - let vectors: Vec<(String, Vec, Option>)> = all_vectors - .into_iter() - .map(|v| { - let payload = v - .payload - .as_ref() - .map(|p| serde_json::to_vec(&p.data).unwrap_or_default()); - (v.id, v.data, payload) - }) - .collect(); - - collection_snapshots.push(CollectionSnapshot { - name: collection_name, - dimension: config.dimension, - metric: format!("{:?}", config.metric), - vectors, - }); - } - } - - // Serialize snapshot data - let snapshot_data = SnapshotData { - collections: collection_snapshots, - }; - - let data = bincode::serialize(&snapshot_data).map_err(|e| e.to_string())?; - - // Calculate checksum - let checksum = crc32fast::hash(&data); - - // Create metadata - let metadata = SnapshotMetadata { - offset, - timestamp: current_timestamp(), - total_collections, - total_vectors, - compressed: false, - checksum, - }; - - info!( - "Snapshot created: {} collections, {} vectors, {} bytes, checksum: {}", - total_collections, - total_vectors, - data.len(), - checksum - ); - - // Combine metadata + data - let mut result = bincode::serialize(&metadata).map_err(|e| e.to_string())?; - result.extend_from_slice(&data); - - Ok(result) -} - -/// Apply snapshot to vector store -pub async fn apply_snapshot(store: &VectorStore, snapshot: &[u8]) -> Result { - // Deserialize metadata - let metadata: SnapshotMetadata = bincode::deserialize(snapshot).map_err(|e| e.to_string())?; - - let metadata_size = bincode::serialized_size(&metadata).map_err(|e| e.to_string())? as usize; - let data = &snapshot[metadata_size..]; - - // Verify checksum - let checksum = crc32fast::hash(data); - if checksum != metadata.checksum { - return Err(format!( - "Checksum mismatch: expected {}, got {}", - metadata.checksum, checksum - )); - } - - // Deserialize snapshot data - let snapshot_data: SnapshotData = bincode::deserialize(data).map_err(|e| e.to_string())?; - - info!( - "Applying snapshot: {} collections, {} vectors, offset: {}", - snapshot_data.collections.len(), - metadata.total_vectors, - metadata.offset - ); - - // Apply each collection - for collection in snapshot_data.collections { - // Create collection with appropriate config - let config = crate::models::CollectionConfig { - dimension: collection.dimension, - metric: parse_distance_metric(&collection.metric), - hnsw_config: crate::models::HnswConfig::default(), - quantization: crate::models::QuantizationConfig::None, - compression: Default::default(), - normalization: None, - storage_type: Some(crate::models::StorageType::Memory), - sharding: None, - graph: None, - encryption: None, - }; - - // Create or recreate collection - let _ = store.delete_collection(&collection.name); - store - .create_collection(&collection.name, config) - .map_err(|e| e.to_string())?; - - // Insert vectors - let vector_count = collection.vectors.len(); - let vectors: Vec = collection - .vectors - .into_iter() - .map(|(id, data, payload)| { - let payload_obj = payload.map(|p| crate::models::Payload { - data: serde_json::from_slice(&p).unwrap_or_default(), - }); - crate::models::Vector { - id, - data, - sparse: None, - payload: payload_obj, - } - }) - .collect(); - - // Insert vectors and verify - if let Err(e) = store.insert(&collection.name, vectors) { - return Err(format!( - "Failed to insert vectors into collection {}: {}", - collection.name, e - )); - } - - // Verify insertion succeeded - if let Ok(col) = store.get_collection(&collection.name) { - debug!( - "Applied collection: {} with {} vectors (verified: {})", - collection.name, - vector_count, - col.vector_count() - ); - } else { - return Err(format!( - "Failed to verify collection {} after insertion", - collection.name - )); - } - } - - info!("Snapshot applied successfully"); - Ok(metadata.offset) -} - -/// Snapshot data structure -#[derive(Debug, Clone, Serialize, Deserialize)] -struct SnapshotData { - collections: Vec, -} - -/// Collection snapshot -#[derive(Debug, Clone, Serialize, Deserialize)] -struct CollectionSnapshot { - name: String, - dimension: usize, - metric: String, - vectors: Vec<(String, Vec, Option>)>, // (id, vector, payload) -} - -fn parse_distance_metric(metric: &str) -> crate::models::DistanceMetric { - match metric.to_lowercase().as_str() { - "euclidean" => crate::models::DistanceMetric::Euclidean, - "cosine" => crate::models::DistanceMetric::Cosine, - "dotproduct" | "dot_product" => crate::models::DistanceMetric::DotProduct, - _ => crate::models::DistanceMetric::Cosine, - } -} - -fn current_timestamp() -> u64 { - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_secs() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[tokio::test] - async fn test_snapshot_checksum_verification() { - let store = VectorStore::new(); - - let config = crate::models::CollectionConfig { - dimension: 3, - metric: crate::models::DistanceMetric::Cosine, - hnsw_config: crate::models::HnswConfig::default(), - quantization: crate::models::QuantizationConfig::None, - compression: Default::default(), - normalization: None, - storage_type: Some(crate::models::StorageType::Memory), - sharding: None, - graph: None, - encryption: None, - }; - store.create_collection("test", config).unwrap(); - - let vec1 = crate::models::Vector { - id: "vec1".to_string(), - data: vec![1.0, 0.0, 0.0], - sparse: None, - payload: None, - }; - store.insert("test", vec![vec1]).unwrap(); - - let mut snapshot = create_snapshot(&store, 0).await.unwrap(); - - // Corrupt data - if let Some(last) = snapshot.last_mut() { - *last = !*last; - } - - // Should fail checksum - let store2 = VectorStore::new(); - let result = apply_snapshot(&store2, &snapshot).await; - - assert!(result.is_err()); - assert!(result.unwrap_err().contains("Checksum mismatch")); - } - - #[tokio::test] - #[ignore = "Snapshot replication issue - vectors not being restored from snapshot. Same root cause as integration tests"] - async fn test_snapshot_with_payloads() { - // Use CPU-only for both stores to ensure consistent behavior across platforms - let store1 = VectorStore::new_cpu_only(); - - let config = crate::models::CollectionConfig { - dimension: 3, - metric: crate::models::DistanceMetric::Cosine, - hnsw_config: crate::models::HnswConfig::default(), - quantization: crate::models::QuantizationConfig::None, - compression: Default::default(), - normalization: None, - storage_type: Some(crate::models::StorageType::Memory), - sharding: None, - graph: None, - encryption: None, - }; - store1.create_collection("payload_test", config).unwrap(); - - // Insert vectors with different payload types - let vec1 = crate::models::Vector { - id: "vec1".to_string(), - data: vec![1.0, 0.0, 0.0], - sparse: None, - payload: Some(crate::models::Payload { - data: serde_json::json!({"type": "string", "value": "test"}), - }), - }; - - let vec2 = crate::models::Vector { - id: "vec2".to_string(), - data: vec![0.0, 1.0, 0.0], - sparse: None, - payload: Some(crate::models::Payload { - data: serde_json::json!({"type": "number", "value": 123}), - }), - }; - - let vec3 = crate::models::Vector { - id: "vec3".to_string(), - data: vec![0.0, 0.0, 1.0], - sparse: None, - payload: None, // No payload - }; - - store1 - .insert("payload_test", vec![vec1, vec2, vec3]) - .unwrap(); - - // Snapshot - let snapshot = create_snapshot(&store1, 100).await.unwrap(); - - // Apply - let store2 = VectorStore::new(); - apply_snapshot(&store2, &snapshot).await.unwrap(); - - // Verify payloads preserved - let v1 = store2.get_vector("payload_test", "vec1").unwrap(); - assert!(v1.payload.is_some()); - - let v3 = store2.get_vector("payload_test", "vec3").unwrap(); - assert!(v3.payload.is_none()); - } - - #[tokio::test] - async fn test_snapshot_with_different_metrics() { - let store1 = VectorStore::new(); - - // Euclidean - let config_euclidean = crate::models::CollectionConfig { - dimension: 3, - metric: crate::models::DistanceMetric::Euclidean, - hnsw_config: crate::models::HnswConfig::default(), - quantization: crate::models::QuantizationConfig::None, - compression: Default::default(), - normalization: None, - storage_type: Some(crate::models::StorageType::Memory), - sharding: None, - graph: None, - encryption: None, - }; - store1 - .create_collection("euclidean", config_euclidean) - .unwrap(); - - // DotProduct - let config_dot = crate::models::CollectionConfig { - dimension: 3, - metric: crate::models::DistanceMetric::DotProduct, - hnsw_config: crate::models::HnswConfig::default(), - quantization: crate::models::QuantizationConfig::None, - compression: Default::default(), - normalization: None, - storage_type: Some(crate::models::StorageType::Memory), - sharding: None, - graph: None, - encryption: None, - }; - store1.create_collection("dotproduct", config_dot).unwrap(); - - // Insert vectors - let vec = crate::models::Vector { - id: "test".to_string(), - data: vec![1.0, 2.0, 3.0], - sparse: None, - payload: None, - }; - store1.insert("euclidean", vec![vec.clone()]).unwrap(); - store1.insert("dotproduct", vec![vec]).unwrap(); - - // Snapshot - let snapshot = create_snapshot(&store1, 50).await.unwrap(); - - // Apply - let store2 = VectorStore::new(); - apply_snapshot(&store2, &snapshot).await.unwrap(); - - // Verify metrics preserved - let euc_col = store2.get_collection("euclidean").unwrap(); - assert_eq!( - euc_col.config().metric, - crate::models::DistanceMetric::Euclidean - ); - - let dot_col = store2.get_collection("dotproduct").unwrap(); - assert_eq!( - dot_col.config().metric, - crate::models::DistanceMetric::DotProduct - ); - } - - #[tokio::test] - async fn test_snapshot_empty_store() { - let store1 = VectorStore::new_cpu_only(); - - // Create snapshot of empty store - let snapshot = create_snapshot(&store1, 0).await.unwrap(); - assert!(!snapshot.is_empty()); // Metadata still exists - - // Apply to new store (CPU-only for consistent test behavior) - let store2 = VectorStore::new_cpu_only(); - let offset = apply_snapshot(&store2, &snapshot).await.unwrap(); - - assert_eq!(offset, 0); - // Note: VectorStore might auto-load collections from vecdb on creation - // The important test is that empty snapshot application doesn't crash - } - - #[tokio::test] - async fn test_snapshot_metadata_fields() { - let store = VectorStore::new_cpu_only(); - - // Create collection with data - let config = crate::models::CollectionConfig { - dimension: 3, - metric: crate::models::DistanceMetric::Cosine, - hnsw_config: crate::models::HnswConfig::default(), - quantization: crate::models::QuantizationConfig::None, - compression: Default::default(), - normalization: None, - storage_type: Some(crate::models::StorageType::Memory), - sharding: None, - graph: None, - encryption: None, - }; - store.create_collection("meta_test", config).unwrap(); - - let vec1 = crate::models::Vector { - id: "vec1".to_string(), - data: vec![1.0, 0.0, 0.0], - sparse: None, - payload: None, - }; - store.insert("meta_test", vec![vec1]).unwrap(); - - // Create snapshot - let snapshot = create_snapshot(&store, 999).await.unwrap(); - - // Deserialize metadata to verify fields - let metadata: SnapshotMetadata = bincode::deserialize(&snapshot).unwrap(); - - assert_eq!(metadata.offset, 999); - // Note: total_collections might include auto-loaded collections - assert!(metadata.total_collections >= 1); - assert!(metadata.total_vectors >= 1); - assert!(!metadata.compressed); - assert!(metadata.checksum > 0); - assert!(metadata.timestamp > 0); - } -} +//! Synchronization utilities for replication +//! +//! This module provides helpers for: +//! - Snapshot creation and transfer +//! - Incremental sync +//! - Checksum verification + +use serde::{Deserialize, Serialize}; +use tracing::{debug, info}; + +use crate::db::VectorStore; + +/// Snapshot metadata +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SnapshotMetadata { + pub offset: u64, + pub timestamp: u64, + pub total_collections: usize, + pub total_vectors: usize, + pub compressed: bool, + pub checksum: u32, +} + +/// Create a snapshot of all collections for full sync +pub async fn create_snapshot(store: &VectorStore, offset: u64) -> Result, String> { + info!("Creating snapshot at offset {}", offset); + + // Get all collections + let collections = store.list_collections(); + let total_collections = collections.len(); + + // Serialize collection data + let mut collection_snapshots = Vec::new(); + let mut total_vectors = 0; + + for collection_name in collections { + // Get collection + if let Ok(collection) = store.get_collection(&collection_name) { + let config = collection.config(); + total_vectors += collection.vector_count(); + + // Get all vectors from collection + let all_vectors = collection.get_all_vectors(); + + // Convert to (id, data, payload) format + let vectors: Vec<(String, Vec, Option>)> = all_vectors + .into_iter() + .map(|v| { + let payload = v + .payload + .as_ref() + .map(|p| serde_json::to_vec(&p.data).unwrap_or_default()); + (v.id, v.data, payload) + }) + .collect(); + + collection_snapshots.push(CollectionSnapshot { + name: collection_name, + dimension: config.dimension, + metric: format!("{:?}", config.metric), + vectors, + }); + } + } + + // Serialize snapshot data + let snapshot_data = SnapshotData { + collections: collection_snapshots, + }; + + let data = crate::codec::serialize(&snapshot_data).map_err(|e| e.to_string())?; + + // Calculate checksum + let checksum = crc32fast::hash(&data); + + // Create metadata + let metadata = SnapshotMetadata { + offset, + timestamp: current_timestamp(), + total_collections, + total_vectors, + compressed: false, + checksum, + }; + + info!( + "Snapshot created: {} collections, {} vectors, {} bytes, checksum: {}", + total_collections, + total_vectors, + data.len(), + checksum + ); + + // Combine metadata + data + let mut result = crate::codec::serialize(&metadata).map_err(|e| e.to_string())?; + result.extend_from_slice(&data); + + Ok(result) +} + +/// Apply snapshot to vector store +pub async fn apply_snapshot(store: &VectorStore, snapshot: &[u8]) -> Result { + // Deserialize metadata + let metadata: SnapshotMetadata = + crate::codec::deserialize(snapshot).map_err(|e| e.to_string())?; + + let metadata_size = + crate::codec::serialized_size(&metadata).map_err(|e| e.to_string())? as usize; + let data = &snapshot[metadata_size..]; + + // Verify checksum + let checksum = crc32fast::hash(data); + if checksum != metadata.checksum { + return Err(format!( + "Checksum mismatch: expected {}, got {}", + metadata.checksum, checksum + )); + } + + // Deserialize snapshot data + let snapshot_data: SnapshotData = crate::codec::deserialize(data).map_err(|e| e.to_string())?; + + info!( + "Applying snapshot: {} collections, {} vectors, offset: {}", + snapshot_data.collections.len(), + metadata.total_vectors, + metadata.offset + ); + + // Apply each collection + for collection in snapshot_data.collections { + // Create collection with appropriate config + let config = crate::models::CollectionConfig { + dimension: collection.dimension, + metric: parse_distance_metric(&collection.metric), + hnsw_config: crate::models::HnswConfig::default(), + quantization: crate::models::QuantizationConfig::None, + compression: Default::default(), + normalization: None, + storage_type: Some(crate::models::StorageType::Memory), + sharding: None, + graph: None, + encryption: None, + }; + + // Create or recreate collection + let _ = store.delete_collection(&collection.name); + store + .create_collection(&collection.name, config) + .map_err(|e| e.to_string())?; + + // Insert vectors + let vector_count = collection.vectors.len(); + let vectors: Vec = collection + .vectors + .into_iter() + .map(|(id, data, payload)| { + let payload_obj = payload.map(|p| crate::models::Payload { + data: serde_json::from_slice(&p).unwrap_or_default(), + }); + crate::models::Vector { + id, + data, + sparse: None, + payload: payload_obj, + } + }) + .collect(); + + // Insert vectors and verify + if let Err(e) = store.insert(&collection.name, vectors) { + return Err(format!( + "Failed to insert vectors into collection {}: {}", + collection.name, e + )); + } + + // Verify insertion succeeded + if let Ok(col) = store.get_collection(&collection.name) { + debug!( + "Applied collection: {} with {} vectors (verified: {})", + collection.name, + vector_count, + col.vector_count() + ); + } else { + return Err(format!( + "Failed to verify collection {} after insertion", + collection.name + )); + } + } + + info!("Snapshot applied successfully"); + Ok(metadata.offset) +} + +/// Snapshot data structure +#[derive(Debug, Clone, Serialize, Deserialize)] +struct SnapshotData { + collections: Vec, +} + +/// Collection snapshot +#[derive(Debug, Clone, Serialize, Deserialize)] +struct CollectionSnapshot { + name: String, + dimension: usize, + metric: String, + vectors: Vec<(String, Vec, Option>)>, // (id, vector, payload) +} + +fn parse_distance_metric(metric: &str) -> crate::models::DistanceMetric { + match metric.to_lowercase().as_str() { + "euclidean" => crate::models::DistanceMetric::Euclidean, + "cosine" => crate::models::DistanceMetric::Cosine, + "dotproduct" | "dot_product" => crate::models::DistanceMetric::DotProduct, + _ => crate::models::DistanceMetric::Cosine, + } +} + +fn current_timestamp() -> u64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_snapshot_checksum_verification() { + let store = VectorStore::new(); + + let config = crate::models::CollectionConfig { + dimension: 3, + metric: crate::models::DistanceMetric::Cosine, + hnsw_config: crate::models::HnswConfig::default(), + quantization: crate::models::QuantizationConfig::None, + compression: Default::default(), + normalization: None, + storage_type: Some(crate::models::StorageType::Memory), + sharding: None, + graph: None, + encryption: None, + }; + store.create_collection("test", config).unwrap(); + + let vec1 = crate::models::Vector { + id: "vec1".to_string(), + data: vec![1.0, 0.0, 0.0], + sparse: None, + payload: None, + }; + store.insert("test", vec![vec1]).unwrap(); + + let mut snapshot = create_snapshot(&store, 0).await.unwrap(); + + // Corrupt data + if let Some(last) = snapshot.last_mut() { + *last = !*last; + } + + // Should fail checksum + let store2 = VectorStore::new(); + let result = apply_snapshot(&store2, &snapshot).await; + + assert!(result.is_err()); + assert!(result.unwrap_err().contains("Checksum mismatch")); + } + + #[tokio::test] + #[ignore = "Snapshot replication issue - vectors not being restored from snapshot. Same root cause as integration tests"] + async fn test_snapshot_with_payloads() { + // Use CPU-only for both stores to ensure consistent behavior across platforms + let store1 = VectorStore::new_cpu_only(); + + let config = crate::models::CollectionConfig { + dimension: 3, + metric: crate::models::DistanceMetric::Cosine, + hnsw_config: crate::models::HnswConfig::default(), + quantization: crate::models::QuantizationConfig::None, + compression: Default::default(), + normalization: None, + storage_type: Some(crate::models::StorageType::Memory), + sharding: None, + graph: None, + encryption: None, + }; + store1.create_collection("payload_test", config).unwrap(); + + // Insert vectors with different payload types + let vec1 = crate::models::Vector { + id: "vec1".to_string(), + data: vec![1.0, 0.0, 0.0], + sparse: None, + payload: Some(crate::models::Payload { + data: serde_json::json!({"type": "string", "value": "test"}), + }), + }; + + let vec2 = crate::models::Vector { + id: "vec2".to_string(), + data: vec![0.0, 1.0, 0.0], + sparse: None, + payload: Some(crate::models::Payload { + data: serde_json::json!({"type": "number", "value": 123}), + }), + }; + + let vec3 = crate::models::Vector { + id: "vec3".to_string(), + data: vec![0.0, 0.0, 1.0], + sparse: None, + payload: None, // No payload + }; + + store1 + .insert("payload_test", vec![vec1, vec2, vec3]) + .unwrap(); + + // Snapshot + let snapshot = create_snapshot(&store1, 100).await.unwrap(); + + // Apply + let store2 = VectorStore::new(); + apply_snapshot(&store2, &snapshot).await.unwrap(); + + // Verify payloads preserved + let v1 = store2.get_vector("payload_test", "vec1").unwrap(); + assert!(v1.payload.is_some()); + + let v3 = store2.get_vector("payload_test", "vec3").unwrap(); + assert!(v3.payload.is_none()); + } + + #[tokio::test] + async fn test_snapshot_with_different_metrics() { + let store1 = VectorStore::new(); + + // Euclidean + let config_euclidean = crate::models::CollectionConfig { + dimension: 3, + metric: crate::models::DistanceMetric::Euclidean, + hnsw_config: crate::models::HnswConfig::default(), + quantization: crate::models::QuantizationConfig::None, + compression: Default::default(), + normalization: None, + storage_type: Some(crate::models::StorageType::Memory), + sharding: None, + graph: None, + encryption: None, + }; + store1 + .create_collection("euclidean", config_euclidean) + .unwrap(); + + // DotProduct + let config_dot = crate::models::CollectionConfig { + dimension: 3, + metric: crate::models::DistanceMetric::DotProduct, + hnsw_config: crate::models::HnswConfig::default(), + quantization: crate::models::QuantizationConfig::None, + compression: Default::default(), + normalization: None, + storage_type: Some(crate::models::StorageType::Memory), + sharding: None, + graph: None, + encryption: None, + }; + store1.create_collection("dotproduct", config_dot).unwrap(); + + // Insert vectors + let vec = crate::models::Vector { + id: "test".to_string(), + data: vec![1.0, 2.0, 3.0], + sparse: None, + payload: None, + }; + store1.insert("euclidean", vec![vec.clone()]).unwrap(); + store1.insert("dotproduct", vec![vec]).unwrap(); + + // Snapshot + let snapshot = create_snapshot(&store1, 50).await.unwrap(); + + // Apply + let store2 = VectorStore::new(); + apply_snapshot(&store2, &snapshot).await.unwrap(); + + // Verify metrics preserved + let euc_col = store2.get_collection("euclidean").unwrap(); + assert_eq!( + euc_col.config().metric, + crate::models::DistanceMetric::Euclidean + ); + + let dot_col = store2.get_collection("dotproduct").unwrap(); + assert_eq!( + dot_col.config().metric, + crate::models::DistanceMetric::DotProduct + ); + } + + #[tokio::test] + async fn test_snapshot_empty_store() { + let store1 = VectorStore::new_cpu_only(); + + // Create snapshot of empty store + let snapshot = create_snapshot(&store1, 0).await.unwrap(); + assert!(!snapshot.is_empty()); // Metadata still exists + + // Apply to new store (CPU-only for consistent test behavior) + let store2 = VectorStore::new_cpu_only(); + let offset = apply_snapshot(&store2, &snapshot).await.unwrap(); + + assert_eq!(offset, 0); + // Note: VectorStore might auto-load collections from vecdb on creation + // The important test is that empty snapshot application doesn't crash + } + + #[tokio::test] + async fn test_snapshot_metadata_fields() { + let store = VectorStore::new_cpu_only(); + + // Create collection with data + let config = crate::models::CollectionConfig { + dimension: 3, + metric: crate::models::DistanceMetric::Cosine, + hnsw_config: crate::models::HnswConfig::default(), + quantization: crate::models::QuantizationConfig::None, + compression: Default::default(), + normalization: None, + storage_type: Some(crate::models::StorageType::Memory), + sharding: None, + graph: None, + encryption: None, + }; + store.create_collection("meta_test", config).unwrap(); + + let vec1 = crate::models::Vector { + id: "vec1".to_string(), + data: vec![1.0, 0.0, 0.0], + sparse: None, + payload: None, + }; + store.insert("meta_test", vec![vec1]).unwrap(); + + // Create snapshot + let snapshot = create_snapshot(&store, 999).await.unwrap(); + + // Deserialize metadata to verify fields + let metadata: SnapshotMetadata = crate::codec::deserialize(&snapshot).unwrap(); + + assert_eq!(metadata.offset, 999); + // Note: total_collections might include auto-loaded collections + assert!(metadata.total_collections >= 1); + assert!(metadata.total_vectors >= 1); + assert!(!metadata.compressed); + assert!(metadata.checksum > 0); + assert!(metadata.timestamp > 0); + } +} diff --git a/src/replication/tests.rs b/src/replication/tests.rs index 8dbaa862..6428dfbf 100755 --- a/src/replication/tests.rs +++ b/src/replication/tests.rs @@ -219,10 +219,10 @@ mod tests { ]; for op in operations { - let serialized = bincode::serialize(&op).unwrap(); - let deserialized: VectorOperation = bincode::deserialize(&serialized).unwrap(); + let serialized = crate::codec::serialize(&op).unwrap(); + let deserialized: VectorOperation = crate::codec::deserialize(&serialized).unwrap(); // Just verify it round-trips without error - let _ = bincode::serialize(&deserialized).unwrap(); + let _ = crate::codec::serialize(&deserialized).unwrap(); } } diff --git a/src/replication/types.rs b/src/replication/types.rs index c68b57cd..84e2b03c 100755 --- a/src/replication/types.rs +++ b/src/replication/types.rs @@ -293,7 +293,7 @@ pub enum ReplicationError { Io(#[from] std::io::Error), #[error("Serialization error: {0}")] - Serialization(#[from] bincode::Error), + Serialization(#[from] crate::codec::Error), #[error("Connection error: {0}")] Connection(String), diff --git a/src/server/mod.rs b/src/server/mod.rs index 328f6710..bd08ace5 100755 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -906,7 +906,9 @@ impl VectorizerServer { repl_config.clone(), )); - // Set initial role based on replication config + // Set initial role based on replication config (before Raft + // watcher kicks in — provides a sane default while the + // first election is in progress). match repl_config.role { crate::replication::NodeRole::Master => { ha.leader_router @@ -914,14 +916,12 @@ impl VectorizerServer { info!("✅ Raft initialized as LEADER (node_id={})", node_id); } crate::replication::NodeRole::Replica => { - // Follower: will redirect writes to leader let leader_url = repl_config .master_address .map(|addr| format!("http://{}:{}", addr.ip(), 15002)) .unwrap_or_default(); if !leader_url.is_empty() { ha.leader_router.set_leader(0, leader_url.clone()); - // Override: this node is follower, not leader ha.leader_router.clear_leader(); } info!("✅ Raft initialized as FOLLOWER (node_id={})", node_id); @@ -931,6 +931,12 @@ impl VectorizerServer { } } + // Start Raft leadership watcher — bridges consensus + // elections to HA role transitions (MasterNode ↔ ReplicaNode). + let watcher = crate::cluster::RaftWatcher::new(mgr.clone(), ha.clone()); + let _watcher_handle = watcher.start(); + info!("🔭 Raft watcher started — automatic failover enabled"); + (Some(mgr), Some(ha)) } Err(e) => { diff --git a/src/storage/advanced.rs b/src/storage/advanced.rs index 6fdb9ae1..f755a766 100755 --- a/src/storage/advanced.rs +++ b/src/storage/advanced.rs @@ -117,7 +117,7 @@ impl AdvancedStorage { .map_err(|e| VectorizerError::Io(e))?; // Serialize vectors - let serialized = bincode::serialize(vectors).map_err(|e| { + let serialized = crate::codec::serialize(vectors).map_err(|e| { VectorizerError::Serialization(format!("Failed to serialize vectors: {}", e)) })?; @@ -177,7 +177,7 @@ impl AdvancedStorage { } // Deserialize from memory-mapped file - let vectors: Vec = bincode::deserialize(&**mmap).map_err(|e| { + let vectors: Vec = crate::codec::deserialize(&**mmap).map_err(|e| { VectorizerError::Deserialization(format!( "Failed to deserialize vectors: {}", e @@ -213,7 +213,7 @@ impl AdvancedStorage { }; // Deserialize from memory-mapped file - let vectors: Vec = bincode::deserialize(&*mmap).map_err(|e| { + let vectors: Vec = crate::codec::deserialize(&*mmap).map_err(|e| { VectorizerError::Deserialization(format!("Failed to deserialize vectors: {}", e)) })?; diff --git a/src/storage/snapshot.rs b/src/storage/snapshot.rs index 515ad588..8a2c4802 100755 --- a/src/storage/snapshot.rs +++ b/src/storage/snapshot.rs @@ -44,8 +44,23 @@ impl SnapshotManager { } } - /// Create a new snapshot + /// Create a new snapshot. + /// + /// Returns `Err` with a `Storage` variant containing "no data" if the + /// `.vecdb` file does not exist yet (e.g., fresh node with no vectors). + /// Callers should treat this as a non-fatal condition. pub fn create_snapshot(&self) -> Result { + // Early check: skip snapshot if there is no data file yet. + // This avoids creating empty snapshot directories on fresh/replica nodes + // that have not received any data. + let vecdb_src = self.data_dir.join(crate::storage::VECDB_FILE); + if !vecdb_src.exists() { + return Err(VectorizerError::Storage(format!( + "No data to snapshot — .vecdb file does not exist at {:?} (node may be empty or still syncing)", + vecdb_src + ))); + } + // Ensure data directory exists first (parent of snapshots) if let Some(parent) = self.snapshots_dir.parent() { fs::create_dir_all(parent).map_err(|e| { @@ -131,44 +146,34 @@ impl SnapshotManager { )) })?; - // Copy .vecdb file - let vecdb_src = self.data_dir.join(crate::storage::VECDB_FILE); + // Copy .vecdb file (existence already verified at the top of this function). let vecdb_dst = snapshot_dir.join(crate::storage::VECDB_FILE); - if vecdb_src.exists() { - // Check source file size and permissions - let src_metadata = fs::metadata(&vecdb_src).map_err(|e| { - VectorizerError::Io(std::io::Error::new( - e.kind(), - format!( - "Failed to read source file metadata {:?}: {} (kind: {:?})", - vecdb_src, - e, - e.kind() - ), - )) - })?; + let src_metadata = fs::metadata(&vecdb_src).map_err(|e| { + VectorizerError::Io(std::io::Error::new( + e.kind(), + format!( + "Failed to read source file metadata {:?}: {} (kind: {:?})", + vecdb_src, + e, + e.kind() + ), + )) + })?; - // Copy with better error handling - fs::copy(&vecdb_src, &vecdb_dst).map_err(|e| { - VectorizerError::Io(std::io::Error::new( + fs::copy(&vecdb_src, &vecdb_dst).map_err(|e| { + VectorizerError::Io(std::io::Error::new( + e.kind(), + format!( + "Failed to copy {:?} to {:?}: {} (kind: {:?}, src_size: {} bytes)", + vecdb_src, + vecdb_dst, + e, e.kind(), - format!( - "Failed to copy {:?} to {:?}: {} (kind: {:?}, src_size: {} bytes)", - vecdb_src, - vecdb_dst, - e, - e.kind(), - src_metadata.len() - ), - )) - })?; - } else { - return Err(VectorizerError::Storage(format!( - "No .vecdb file to snapshot at {:?}", - vecdb_src - ))); - } + src_metadata.len() + ), + )) + })?; // Copy .vecidx file let vecidx_src = self.data_dir.join(crate::storage::VECIDX_FILE); diff --git a/tests/integration/cluster_multitenant.rs b/tests/integration/cluster_multitenant.rs index 17eced5c..581bee63 100644 --- a/tests/integration/cluster_multitenant.rs +++ b/tests/integration/cluster_multitenant.rs @@ -175,8 +175,8 @@ fn test_replication_operation_serialization_with_owner() { }; // Serialize and deserialize - let serialized = bincode::serialize(&op).unwrap(); - let deserialized: VectorOperation = bincode::deserialize(&serialized).unwrap(); + let serialized = vectorizer::codec::serialize(&op).unwrap(); + let deserialized: VectorOperation = vectorizer::codec::deserialize(&serialized).unwrap(); // Verify owner_id is preserved if let VectorOperation::CreateCollection { name, owner_id, .. } = deserialized { @@ -200,8 +200,8 @@ fn test_replication_operation_without_owner_backward_compat() { owner_id: None, }; - let serialized = bincode::serialize(&op).unwrap(); - let deserialized: VectorOperation = bincode::deserialize(&serialized).unwrap(); + let serialized = vectorizer::codec::serialize(&op).unwrap(); + let deserialized: VectorOperation = vectorizer::codec::deserialize(&serialized).unwrap(); if let VectorOperation::InsertVector { id, owner_id, .. } = deserialized { assert_eq!(id, "vec-1"); @@ -253,8 +253,8 @@ fn test_all_operation_types_with_owner() { // All should serialize/deserialize correctly for op in operations { - let serialized = bincode::serialize(&op).unwrap(); - let _deserialized: VectorOperation = bincode::deserialize(&serialized).unwrap(); + let serialized = vectorizer::codec::serialize(&op).unwrap(); + let _deserialized: VectorOperation = vectorizer::codec::deserialize(&serialized).unwrap(); } }