diff --git a/Cargo.lock b/Cargo.lock index 4e5a799b9..4751a2bb1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" - [[package]] name = "adler2" version = "2.0.1" @@ -49,17 +43,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.12" @@ -67,7 +50,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "const-random", "getrandom 0.3.4", "once_cell", "serde", @@ -84,12 +66,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "aligned" version = "0.4.3" @@ -108,21 +84,6 @@ dependencies = [ "equator", ] -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -190,9 +151,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "arbitrary" @@ -202,9 +163,9 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "9ded5f9a03ac8f24d1b8a25101ee812cd32cdc8c50a4c50237de2c4915850e73" dependencies = [ "rustversion", ] @@ -223,7 +184,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -244,165 +205,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "arrow" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4754a624e5ae42081f464514be454b39711daae0458906dacde5f4c632f33a8" -dependencies = [ - "arrow-arith", - "arrow-array", - "arrow-buffer", - "arrow-cast", - "arrow-data", - "arrow-ord", - "arrow-row", - "arrow-schema", - "arrow-select", - "arrow-string", -] - -[[package]] -name = "arrow-arith" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b3141e0ec5145a22d8694ea8b6d6f69305971c4fa1c1a13ef0195aef2d678b" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "chrono", - "num-traits", -] - -[[package]] -name = "arrow-array" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8955af33b25f3b175ee10af580577280b4bd01f7e823d94c7cdef7cf8c9aef" -dependencies = [ - "ahash 0.8.12", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "chrono", - "half", - "hashbrown 0.16.1", - "num-complex", - "num-integer", - "num-traits", -] - -[[package]] -name = "arrow-buffer" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c697ddca96183182f35b3a18e50b9110b11e916d7b7799cbfd4d34662f2c56c2" -dependencies = [ - "bytes", - "half", - "num-bigint", - "num-traits", -] - -[[package]] -name = "arrow-cast" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "646bbb821e86fd57189c10b4fcdaa941deaf4181924917b0daa92735baa6ada5" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-ord", - "arrow-schema", - "arrow-select", - "atoi", - "base64 0.22.1", - "chrono", - "half", - "lexical-core", - "num-traits", - "ryu", -] - -[[package]] -name = "arrow-data" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fdd994a9d28e6365aa78e15da3f3950c0fdcea6b963a12fa1c391afb637b304" -dependencies = [ - "arrow-buffer", - "arrow-schema", - "half", - "num-integer", - "num-traits", -] - -[[package]] -name = "arrow-ord" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d8f1870e03d4cbed632959498bcc84083b5a24bded52905ae1695bd29da45b" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", -] - -[[package]] -name = "arrow-row" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18228633bad92bff92a95746bbeb16e5fc318e8382b75619dec26db79e4de4c0" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "half", -] - -[[package]] -name = "arrow-schema" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c872d36b7bf2a6a6a2b40de9156265f0242910791db366a2c17476ba8330d68" - -[[package]] -name = "arrow-select" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bf3e3efbd1278f770d67e5dc410257300b161b93baedb3aae836144edcaf4b" -dependencies = [ - "ahash 0.8.12", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "num-traits", -] - -[[package]] -name = "arrow-string" -version = "57.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e968097061b3c0e9fe3079cf2e703e487890700546b5b0647f60fca1b5a8d8" -dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", - "arrow-select", - "memchr", - "num-traits", - "regex", - "regex-syntax", -] - [[package]] name = "as-slice" version = "0.2.1" @@ -413,143 +215,51 @@ dependencies = [ ] [[package]] -name = "ascii_utils" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" - -[[package]] -name = "async-compression" -version = "0.4.40" +name = "async-lock" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d67d43201f4d20c78bcda740c142ca52482d81da80681533d33bf3f0596c8e2" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "compression-codecs", - "compression-core", + "event-listener", + "event-listener-strategy", "pin-project-lite", - "tokio", ] [[package]] -name = "async-graphql" -version = "7.2.1" +name = "async-nats" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1057a9f7ccf2404d94571dec3451ade1cb524790df6f1ada0d19c2a49f6b0f40" +checksum = "df5af9ebfb0a14481d3eaf6101e6391261e4f30d25b26a7635ade8a39482ded0" dependencies = [ - "async-graphql-derive", - "async-graphql-parser", - "async-graphql-value", - "async-io", - "async-trait", - "asynk-strim", "base64 0.22.1", "bytes", - "fast_chemail", - "fnv", - "futures-channel", "futures-util", - "handlebars", - "http", - "indexmap 2.13.0", - "lru", - "mime", - "multer", - "num-traits", - "pin-project-lite", + "memchr", + "nkeys", + "nuid", + "once_cell", + "pin-project", + "portable-atomic", + "rand 0.8.5", "regex", + "ring", + "rustls-native-certs 0.7.3", + "rustls-pki-types", + "rustls-webpki 0.102.8", "serde", "serde_json", - "serde_urlencoded", - "static_assertions_next", - "tempfile", - "thiserror 2.0.18", -] - -[[package]] -name = "async-graphql-axum" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e37c5532e4b686acf45e7162bc93da91fc2c702fb0d465efc2c20c8f973795" -dependencies = [ - "async-graphql", - "axum", - "bytes", - "futures-util", - "serde_json", + "serde_nanos", + "serde_repr", + "thiserror 1.0.69", + "time", "tokio", + "tokio-rustls 0.26.4", "tokio-stream", "tokio-util", - "tower-service", -] - -[[package]] -name = "async-graphql-derive" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6cbeadc8515e66450fba0985ce722192e28443697799988265d86304d7cc68" -dependencies = [ - "Inflector", - "async-graphql-parser", - "darling 0.23.0", - "proc-macro-crate", - "proc-macro2", - "quote", - "strum 0.27.2", - "syn 2.0.117", - "thiserror 2.0.18", -] - -[[package]] -name = "async-graphql-parser" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64ef70f77a1c689111e52076da1cd18f91834bcb847de0a9171f83624b07fbf" -dependencies = [ - "async-graphql-value", - "pest", - "serde", - "serde_json", -] - -[[package]] -name = "async-graphql-value" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3ef112905abea9dea592fc868a6873b10ebd3f983e83308f995d6284e9ba41" -dependencies = [ - "bytes", - "indexmap 2.13.0", - "serde", - "serde_json", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", + "tokio-websockets", + "tracing", + "tryhard", + "url", ] [[package]] @@ -571,7 +281,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -582,17 +292,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "asynk-strim" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52697735bdaac441a29391a9e97102c74c6ef0f9b60a40cf109b1b404e29d2f6" -dependencies = [ - "futures-core", - "pin-project-lite", + "syn 2.0.115", ] [[package]] @@ -604,6 +304,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "atomic" version = "0.6.1" @@ -679,9 +385,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" dependencies = [ "aws-lc-sys", "zeroize", @@ -689,9 +395,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" dependencies = [ "cc", "cmake", @@ -701,128 +407,69 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.8" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ + "async-trait", "axum-core", - "axum-macros", - "base64 0.22.1", + "bitflags 1.3.2", "bytes", - "form_urlencoded", "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "itoa", "matchit", "memchr", "mime", - "multer", "percent-encoding", "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sha1", - "sync_wrapper", - "tokio", - "tokio-tungstenite", - "tower", + "rustversion", + "serde", + "sync_wrapper 0.1.2", + "tower 0.4.13", "tower-layer", "tower-service", - "tracing", ] [[package]] name = "axum-core" -version = "0.5.6" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ + "async-trait", "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", "mime", - "pin-project-lite", - "sync_wrapper", + "rustversion", "tower-layer", "tower-service", - "tracing", ] [[package]] -name = "axum-extra" -version = "0.12.5" +name = "backon" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef252edff26ddba56bbcdf2ee3307b8129acb86f5749b68990c168a6fcc9c76" -dependencies = [ - "axum", - "axum-core", - "bytes", - "cookie", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "backon" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" dependencies = [ "fastrand", - "gloo-timers", - "tokio", -] - -[[package]] -name = "backtrace_printer" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d28de81c708c843640982b66573df0f0168d87e42854b563971f326745aab7" -dependencies = [ - "btparse-stable", - "colored 2.2.0", - "regex", - "thiserror 1.0.69", ] [[package]] -name = "base16ct" -version = "0.2.0" +name = "base64" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" @@ -850,18 +497,10 @@ dependencies = [ ] [[package]] -name = "bigdecimal" -version = "0.4.10" +name = "binascii" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" -dependencies = [ - "autocfg", - "libm", - "num-bigint", - "num-integer", - "num-traits", - "serde", -] +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" [[package]] name = "bit-set" @@ -892,9 +531,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ "serde_core", ] @@ -955,50 +594,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" -[[package]] -name = "borsh" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "brotli" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - [[package]] name = "bstr" version = "1.12.1" @@ -1009,12 +604,6 @@ dependencies = [ "serde", ] -[[package]] -name = "btparse-stable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d75b8252ed252f881d1dc4482ae3c3854df6ee8183c1906bac50ff358f4f89f" - [[package]] name = "built" version = "0.8.0" @@ -1023,43 +612,9 @@ checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" -version = "3.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" - -[[package]] -name = "byte-unit" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" -dependencies = [ - "rust_decimal", - "schemars 1.2.1", - "serde", - "utf8-width", -] - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytecount" @@ -1084,7 +639,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1162,9 +717,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "jobserver", @@ -1203,9 +758,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -1215,38 +770,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "chrono-tz" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf 0.11.3", -] - -[[package]] -name = "chrono-tz" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" -dependencies = [ - "chrono", - "phf 0.12.1", -] - -[[package]] -name = "chrono-tz-build" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" -dependencies = [ - "parse-zoneinfo", - "phf 0.11.3", - "phf_codegen", -] - [[package]] name = "cipher" version = "0.4.4" @@ -1259,9 +782,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" dependencies = [ "clap_builder", "clap_derive", @@ -1269,9 +792,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" dependencies = [ "anstream", "anstyle", @@ -1288,7 +811,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1327,25 +850,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[package]] -name = "colored" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" -dependencies = [ - "lazy_static", - "windows-sys 0.48.0", -] - -[[package]] -name = "colored" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" -dependencies = [ - "windows-sys 0.48.0", -] - [[package]] name = "combine" version = "4.6.7" @@ -1375,26 +879,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "compression-codecs" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" -dependencies = [ - "brotli", - "compression-core", - "flate2", - "memchr", - "zstd", - "zstd-safe", -] - -[[package]] -name = "compression-core" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1443,35 +927,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "cookie" version = "0.18.1" @@ -1566,17 +1021,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" -[[package]] -name = "croner" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa42bcd3d846ebf66e15bd528d1087f75d1c6c1c66ebff626178a106353c576" -dependencies = [ - "chrono", - "derive_builder", - "strum 0.27.2", -] - [[package]] name = "crossbeam" version = "0.8.4" @@ -1633,54 +1077,12 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" -[[package]] -name = "cruet" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113a9e83d8f614be76de8df1f25bf9d0ea6e85ea573710a3d3f3abe1438ae49c" -dependencies = [ - "once_cell", - "regex", -] - -[[package]] -name = "cruet" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6132609543972496bc97b1e01f1ce6586768870aeb4cabeb3385f4e05b5caead" -dependencies = [ - "once_cell", - "regex", -] - -[[package]] -name = "cruet" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a9ae414b9768aada1b316493261653e41af05c9d2ccc9c504a8fc051c6a790" -dependencies = [ - "once_cell", - "regex", -] - [[package]] name = "crunchy" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-common" version = "0.1.7" @@ -1714,7 +1116,6 @@ dependencies = [ "fiat-crypto", "rustc_version", "subtle", - "zeroize", ] [[package]] @@ -1725,7 +1126,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1738,16 +1139,6 @@ dependencies = [ "darling_macro 0.20.11", ] -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", -] - [[package]] name = "darling" version = "0.23.0" @@ -1769,21 +1160,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1796,7 +1173,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1807,18 +1184,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.117", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", - "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1829,7 +1195,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core 0.23.0", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1841,6 +1207,19 @@ dependencies = [ "serde", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "dashmap" version = "6.1.0" @@ -1861,17 +1240,6 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" -[[package]] -name = "delegate" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "der" version = "0.7.10" @@ -1885,9 +1253,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.8" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" dependencies = [ "powerfmt", "serde_core", @@ -1911,7 +1279,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -1921,37 +1289,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] -name = "derive_more" -version = "2.1.1" +name = "devise" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +checksum = "f1d90b0c4c777a2cad215e3c7be59ac7c15adf45cf76317009b7d096d46f651d" dependencies = [ - "derive_more-impl", + "devise_codegen", + "devise_core", ] [[package]] -name = "derive_more-impl" -version = "2.1.1" +name = "devise_codegen" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +checksum = "71b28680d8be17a570a2334922518be6adc3f58ecc880cbb404eaeb8624fd867" dependencies = [ - "convert_case", - "proc-macro2", + "devise_core", "quote", - "rustc_version", - "syn 2.0.117", - "unicode-xid", ] [[package]] -name = "deunicode" -version = "1.6.2" +name = "devise_core" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" +checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" +dependencies = [ + "bitflags 2.10.0", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.115", +] [[package]] name = "digest" @@ -1966,8 +1338,31 @@ dependencies = [ ] [[package]] -name = "dirs" -version = "6.0.0" +name = "dill" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c0318172d46b12727598ececda9f4991c984e31dcb1f57c38c94e3630a9df95" +dependencies = [ + "dill-impl", + "indoc", + "multimap", + "thiserror 2.0.18", +] + +[[package]] +name = "dill-impl" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0712552907f5fa56bd104c524e81c33f8d183338a150d42ccc5edeee03f61c32" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.115", +] + +[[package]] +name = "dirs" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ @@ -1994,7 +1389,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -2015,27 +1410,6 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" -[[package]] -name = "duct" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e66e9c0c03d094e1a0ba1be130b849034aa80c3a2ab8ee94316bc809f3fa684" -dependencies = [ - "libc", - "os_pipe", - "shared_child", - "shared_thread", -] - -[[package]] -name = "duct_sh" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8139179d1d133ab7153920ba3812915b17c61e2514a6f98b1fd03f2c07668d1" -dependencies = [ - "duct", -] - [[package]] name = "dunce" version = "1.0.5" @@ -2048,27 +1422,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - [[package]] name = "ed25519" version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8", "signature", ] @@ -2080,15 +1439,16 @@ checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", - "serde", "sha2", + "signature", "subtle", - "zeroize", ] [[package]] name = "edgevec" version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d046bde3f508677ef2343146f0feeca3c20d270b05ecc4aeb73bd580dca068e1" dependencies = [ "bitvec", "bytemuck", @@ -2096,19 +1456,19 @@ dependencies = [ "console_error_panic_hook", "console_log", "crc32fast", - "getrandom 0.4.1", + "getrandom 0.2.17", "js-sys", "log", "pest", "pest_derive", "postcard", - "rand 0.10.1", - "rand_chacha 0.10.0", + "rand 0.8.5", + "rand_chacha 0.3.1", "serde", "serde-wasm-bindgen", "serde_bytes", "serde_json", - "thiserror 2.0.18", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -2123,37 +1483,6 @@ dependencies = [ "serde", ] -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "email-encoding" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" -dependencies = [ - "base64 0.22.1", - "memchr", -] - [[package]] name = "email_address" version = "0.2.9" @@ -2190,15 +1519,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "english-to-cron" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3d16f6dc9dc43a9a2fd5bce09b6cf8df250dcf77cffdaa66be21c527e2d05c" -dependencies = [ - "regex", -] - [[package]] name = "equator" version = "0.4.2" @@ -2216,7 +1536,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -2305,20 +1625,11 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "fast_chemail" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495a39d30d624c2caabe6312bfead73e7717692b44e0b32df168c275a2e8e9e4" -dependencies = [ - "ascii_utils", -] - [[package]] name = "fastembed" -version = "5.11.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4339d45a80579ab8305616a501eacdbf18fb0f7def7fa6e4c0b75941416d5b0" +checksum = "f6f8b48452e32595e2fcb89d0c582490681ef4febca0ae037fc75a122525953a" dependencies = [ "anyhow", "hf-hub", @@ -2354,7 +1665,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -2366,16 +1677,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "fiat-crypto" version = "0.2.9" @@ -2388,7 +1689,7 @@ version = "0.10.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" dependencies = [ - "atomic", + "atomic 0.6.1", "pear", "serde", "toml 0.8.23", @@ -2402,6 +1703,12 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "fixedbitset" version = "0.5.7" @@ -2498,15 +1805,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" -[[package]] -name = "fs-err" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] - [[package]] name = "fs_extra" version = "1.3.0" @@ -2530,9 +1828,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -2545,9 +1843,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -2555,15 +1853,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -2583,42 +1881,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-lite" -version = "2.6.1" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "futures-core", - "pin-project-lite", -] +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -2628,9 +1916,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2640,9 +1928,23 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", + "pin-utils", "slab", ] +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2651,7 +1953,6 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] @@ -2697,13 +1998,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi", "rand_core 0.10.0", "wasip2", "wasip3", - "wasm-bindgen", ] [[package]] @@ -2732,7 +2031,7 @@ version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "libc", "libgit2-sys", "log", @@ -2761,37 +2060,22 @@ dependencies = [ ] [[package]] -name = "globwalk" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" -dependencies = [ - "bitflags 2.11.0", - "ignore", - "walkdir", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" +name = "h2" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ - "futures-channel", + "bytes", + "fnv", "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] @@ -2805,7 +2089,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http", + "http 1.4.0", "indexmap 2.13.0", "slab", "tokio", @@ -2821,7 +2105,6 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", - "num-traits", "zerocopy", ] @@ -2855,9 +2138,6 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" @@ -2955,12 +2235,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "629d8f3bbeda9d148036d6b0de0a3ab947abd08ce90626327fc3547a49d59d97" dependencies = [ "dirs", - "http", + "http 1.4.0", "indicatif", "libc", "log", "native-tls", - "rand 0.9.4", + "rand 0.9.2", "reqwest 0.12.28", "serde", "serde_json", @@ -2989,9 +2269,9 @@ dependencies = [ [[package]] name = "hmac-sha256" -version = "1.1.14" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9d92d097f4749b64e8cc33d924d9f40a2d4eb91402b458014b781f5733d60f" +checksum = "d0f0ae375a85536cac3a243e3a9cda80a47910348abdea7e2c22f8ec556d586d" [[package]] name = "home" @@ -3003,14 +2283,14 @@ dependencies = [ ] [[package]] -name = "hostname" -version = "0.4.2" +name = "http" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "cfg-if", - "libc", - "windows-link", + "bytes", + "fnv", + "itoa", ] [[package]] @@ -3023,6 +2303,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + [[package]] name = "http-body" version = "1.0.1" @@ -3030,7 +2321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.4.0", ] [[package]] @@ -3041,17 +2332,11 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.4.0", + "http-body 1.0.1", "pin-project-lite", ] -[[package]] -name = "http-range-header" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" - [[package]] name = "httparse" version = "1.10.1" @@ -3064,21 +2349,36 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humansize" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" -dependencies = [ - "libm", -] - [[package]] name = "humantime" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "hyper" version = "1.8.1" @@ -3089,11 +2389,10 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "httparse", - "httpdate", "itoa", "pin-project-lite", "pin-utils", @@ -3108,27 +2407,26 @@ version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http", - "hyper", + "http 1.4.0", + "hyper 1.8.1", "hyper-util", - "rustls", + "rustls 0.23.36", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.4", "tower-service", ] [[package]] name = "hyper-timeout" -version = "0.5.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", - "hyper-util", + "hyper 0.14.32", "pin-project-lite", "tokio", - "tower-service", + "tokio-io-timeout", ] [[package]] @@ -3139,7 +2437,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -3157,14 +2455,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http", - "http-body", - "hyper", + "http 1.4.0", + "http-body 1.0.1", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.2", "system-configuration", "tokio", "tower-service", @@ -3366,25 +2664,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" -[[package]] -name = "include_dir" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "indexmap" version = "1.9.3" @@ -3393,7 +2672,6 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde", ] [[package]] @@ -3430,17 +2708,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "inherent" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "inlinable_string" version = "0.1.15" @@ -3453,7 +2720,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "inotify-sys", "libc", ] @@ -3499,16 +2766,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "inventory" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ae045c87e7082cb72dab0ccd01ae075dd00141ddc108f43a0ea150a9e7227" -dependencies = [ - "rustversion", + "syn 2.0.115", ] [[package]] @@ -3517,12 +2775,6 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" -[[package]] -name = "ipnetwork" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf370abdafd54d13e54a620e8c3e1145f28e46cc9d704bc6d94414559df41763" - [[package]] name = "iri-string" version = "0.7.10" @@ -3534,66 +2786,45 @@ dependencies = [ ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.2" +name = "is-terminal" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "either", + "hermit-abi", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "itoa" -version = "1.0.17" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] -name = "jiff" -version = "0.2.21" +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e3d65f018c6ae946ab16e80944b97096ed73c35b221d1c478a6c81d8f57940" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "jiff-static", - "jiff-tzdb-platform", - "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", - "windows-sys 0.61.2", + "either", ] [[package]] -name = "jiff-static" -version = "0.2.21" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17c2b211d863c7fde02cbea8a3c1a439b98e109286554f2860bdded7ff83818" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "either", ] [[package]] -name = "jiff-tzdb" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" - -[[package]] -name = "jiff-tzdb-platform" -version = "0.1.3" +name = "itoa" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" -dependencies = [ - "jiff-tzdb", -] +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jni" @@ -3629,9 +2860,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.90" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dc6f6450b3f6d4ed5b16327f38fed626d375a886159ca555bd7822c0c3a5a6" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -3639,11 +2870,11 @@ dependencies = [ [[package]] name = "jsonschema" -version = "0.42.1" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6103dcd3815c9bd04239a6d0343dac2b7a18ee260e800d0a6e3eb5b9333504fb" +checksum = "9320368abda84a3aad44953d61e70515681fe43ae94529dff5567e0215b88438" dependencies = [ - "ahash 0.8.12", + "ahash", "bytecount", "data-encoding", "email_address", @@ -3659,36 +2890,13 @@ dependencies = [ "regex", "regex-syntax", "reqwest 0.13.2", - "rustls", + "rustls 0.23.36", "serde", "serde_json", "unicode-general-category", "uuid-simd", ] -[[package]] -name = "jsonwebtoken" -version = "10.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" -dependencies = [ - "base64 0.22.1", - "ed25519-dalek", - "getrandom 0.2.17", - "hmac", - "js-sys", - "p256", - "p384", - "pem", - "rand 0.8.6", - "rsa", - "serde", - "serde_json", - "sha2", - "signature", - "simple_asn1", -] - [[package]] name = "kqueue" version = "1.1.1" @@ -3730,96 +2938,11 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" -[[package]] -name = "lettre" -version = "0.11.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da65617f6cb926332d039cb578aad56178da86e128db6a1b09f4c94fa5b3349" -dependencies = [ - "async-trait", - "base64 0.22.1", - "email-encoding", - "email_address", - "fastrand", - "futures-io", - "futures-util", - "hostname", - "httpdate", - "idna", - "mime", - "nom 8.0.0", - "percent-encoding", - "quoted_printable", - "rustls", - "socket2", - "tokio", - "tokio-rustls", - "url", - "webpki-roots 1.0.6", -] - -[[package]] -name = "lexical-core" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" -dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", -] - -[[package]] -name = "lexical-parse-float" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" -dependencies = [ - "lexical-parse-integer", - "lexical-util", -] - -[[package]] -name = "lexical-parse-integer" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" -dependencies = [ - "lexical-util", -] - -[[package]] -name = "lexical-util" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" - -[[package]] -name = "lexical-write-float" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" -dependencies = [ - "lexical-util", - "lexical-write-integer", -] - -[[package]] -name = "lexical-write-integer" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" -dependencies = [ - "lexical-util", -] - [[package]] name = "libc" -version = "0.2.182" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libfuzzer-sys" @@ -3845,16 +2968,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" -dependencies = [ - "cfg-if", - "windows-link", -] - [[package]] name = "libm" version = "0.2.16" @@ -3867,9 +2980,9 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "libc", - "redox_syscall 0.7.2", + "redox_syscall 0.7.1", ] [[package]] @@ -3899,9 +3012,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.24" +version = "1.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4735e9cbde5aac84a5ce588f6b23a90b9b0b528f6c5a8db8a4aff300463a0839" +checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" dependencies = [ "cc", "libc", @@ -3926,14 +3039,14 @@ checksum = "e5cec0ec4228b4853bb129c84dbf093a27e6c7a20526da046defc334a1b017f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] name = "linux-raw-sys" -version = "0.12.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -3951,87 +3064,26 @@ dependencies = [ ] [[package]] -name = "loco-gen" -version = "0.16.4" -dependencies = [ - "chrono", - "clap", - "colored 3.1.1", - "cruet 0.14.0", - "duct", - "heck 0.5.0", - "include_dir", - "regex", - "rrgen", - "serde", - "serde_json", - "tera", - "thiserror 2.0.18", - "tracing", -] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "loco-rs" -version = "0.16.4" +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "argon2", - "async-trait", - "axum", - "axum-extra", - "backtrace_printer", - "byte-unit", - "bytes", - "chrono", - "clap", - "colored 3.1.1", - "cruet 0.15.0", - "dashmap", - "duct", - "duct_sh", - "english-to-cron", - "futures-util", - "heck 0.5.0", - "include_dir", - "ipnetwork", - "jsonwebtoken", - "lettre", - "loco-gen", - "moka", - "notify", - "opendal", - "rand 0.10.1", - "redis", - "regex", - "sea-orm", - "sea-orm-migration", - "semver", + "cfg-if", + "generator", + "scoped-tls", "serde", "serde_json", - "serde_variant", - "serde_yaml", - "sqlx", - "tera", - "thiserror 2.0.18", - "tokio", - "tokio-cron-scheduler", - "tokio-util", - "toml 1.0.3+spec-1.1.0", - "tower", - "tower-http", "tracing", - "tracing-appender", "tracing-subscriber", - "ulid", - "uuid", - "validator", ] -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - [[package]] name = "loop9" version = "0.1.5" @@ -4041,15 +3093,6 @@ dependencies = [ "imgref", ] -[[package]] -name = "lru" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" -dependencies = [ - "hashbrown 0.16.1", -] - [[package]] name = "lru-slab" version = "0.1.2" @@ -4089,9 +3132,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.8.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "matrixmultiply" @@ -4115,37 +3158,74 @@ dependencies = [ [[package]] name = "mcb" -version = "0.3.0" +version = "0.2.1-dev" dependencies = [ - "async-trait", - "axum", "clap", - "dirs", "insta", - "loco-rs", "mcb-domain", "mcb-infrastructure", "mcb-providers", "mcb-server", "mcb-validate", "mockall", - "rmcp", "rstest", "serde_json", - "serial_test", "tokio", - "tokio-util", +] + +[[package]] +name = "mcb-application" +version = "0.2.1-dev" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "insta", + "linkme", + "mcb-domain", + "mcb-providers", + "mockall", + "rstest", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.18", + "tokio", + "toml 1.0.0+spec-1.1.0", + "tracing", "uuid", + "walkdir", +] + +[[package]] +name = "mcb-ast-utils" +version = "0.2.1-dev" +dependencies = [ + "insta", + "mcb-language-support", + "mockall", + "rstest", + "tempfile", + "thiserror 2.0.18", + "tree-sitter", + "tree-sitter-c", + "tree-sitter-cpp", + "tree-sitter-go", + "tree-sitter-java", + "tree-sitter-javascript", + "tree-sitter-kotlin-ng", + "tree-sitter-python", + "tree-sitter-rust", + "tree-sitter-typescript", ] [[package]] name = "mcb-domain" -version = "0.3.0" +version = "0.2.1-dev" dependencies = [ "async-trait", "base64 0.22.1", "chrono", - "derive_more", "futures", "hex", "insta", @@ -4153,41 +3233,37 @@ dependencies = [ "mockall", "regex", "reqwest 0.13.2", - "rmcp", "rstest", - "schemars 1.2.1", + "schemars", "serde", "serde_json", - "serde_with", "sha2", - "strum 0.28.0", - "strum_macros 0.28.0", "tempfile", "thiserror 2.0.18", "tokio", - "toml 1.0.3+spec-1.1.0", - "tracing", - "typed-builder", + "toml 1.0.0+spec-1.1.0", "unicode-segmentation", "uuid", ] [[package]] name = "mcb-infrastructure" -version = "0.3.0" +version = "0.2.1-dev" dependencies = [ "aes-gcm", "anyhow", + "arc-swap", "argon2", "async-trait", "base64 0.22.1", "bcrypt", "chrono", "clap", - "dashmap", - "delegate", + "dashmap 6.1.0", + "dill", "dirs", "downcast-rs", + "figment", "futures", "futures-util", "glob", @@ -4198,33 +3274,33 @@ dependencies = [ "humantime", "ignore", "insta", - "itertools", - "linkme", - "loco-rs", + "itertools 0.14.0", + "mcb-application", "mcb-domain", + "mcb-providers", "mcb-validate", "mockall", + "notify", "pbkdf2", - "rand 0.10.1", + "rand 0.10.0", "rayon", "regex", "reqwest 0.13.2", "rmcp", "rstest", - "schemars 1.2.1", - "sea-orm", - "sea-orm-migration", + "schemars", "serde", "serde_json", - "serde_yaml", "serial_test", "sha2", + "shellexpand", "sqlx", + "sysinfo", "tempfile", "thiserror 2.0.18", "tokio", "tokio-util", - "toml 1.0.3+spec-1.1.0", + "toml 1.0.0+spec-1.1.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -4247,38 +3323,50 @@ dependencies = [ "walkdir", ] +[[package]] +name = "mcb-language-support" +version = "0.2.1-dev" +dependencies = [ + "async-trait", + "insta", + "mockall", + "rstest", + "rust-code-analysis", + "serde", + "tempfile", + "thiserror 2.0.18", + "tokio", +] + [[package]] name = "mcb-providers" -version = "0.3.0" +version = "0.2.1-dev" dependencies = [ "aes-gcm", "anyhow", - "async-graphql", + "async-nats", "async-trait", "base64 0.22.1", "cargo_toml", "chrono", - "dashmap", + "dashmap 6.1.0", "dirs", "edgevec", "fastembed", "futures", "git2", + "insta", "linkme", "mcb-domain", "milvus-sdk-rust", "mockall", "moka", - "quick-xml 0.39.2", + "quick-xml", "redis", "regex", "reqwest 0.13.2", "rstest", - "schemars 1.2.1", - "sea-orm", - "sea-orm-migration", - "sea-query", - "seaography", + "schemars", "serde", "serde_json", "sha2", @@ -4286,7 +3374,7 @@ dependencies = [ "tempfile", "thiserror 2.0.18", "tokio", - "toml 1.0.3+spec-1.1.0", + "toml 1.0.0+spec-1.1.0", "tracing", "tree-sitter", "tree-sitter-c", @@ -4309,55 +3397,44 @@ dependencies = [ [[package]] name = "mcb-server" -version = "0.3.0" +version = "0.2.1-dev" dependencies = [ "anyhow", "argon2", - "async-graphql", - "async-graphql-axum", "async-stream", "async-trait", - "axum", "base64 0.22.1", "bcrypt", "chrono", "clap", - "dashmap", + "dashmap 6.1.0", "dirs", "fastembed", "futures", + "handlebars", "health", - "hostname", - "http-body-util", "insta", - "linkme", - "loco-rs", + "mcb-application", "mcb-domain", "mcb-infrastructure", "mcb-providers", - "mcb-validate", "mockall", "normpath", "notify", "pulldown-cmark", "reqwest 0.13.2", "rmcp", + "rocket", "rstest", - "schemars 1.2.1", - "sea-orm", - "sea-orm-pro", - "seaography", + "schemars", "serde", "serde_json", - "serde_with", "sha2", "sysinfo", "tempfile", "thiserror 2.0.18", "tokio", - "toml 1.0.3+spec-1.1.0", - "tower", - "tower-http", + "toml 1.0.0+spec-1.1.0", "tracing", "tracing-subscriber", "uuid", @@ -4367,23 +3444,23 @@ dependencies = [ [[package]] name = "mcb-validate" -version = "0.3.0" +version = "0.2.1-dev" dependencies = [ + "anyhow", "async-trait", "cargo_metadata", "chrono", "clap", - "derive_more", "evalexpr", "figment", "glob", "globset", "insta", "jsonschema", - "linkme", - "mcb-domain", + "mcb-ast-utils", + "mcb-language-support", "mockall", - "petgraph", + "petgraph 0.8.3", "regex", "rstest", "rust-code-analysis", @@ -4394,7 +3471,7 @@ dependencies = [ "tempfile", "thiserror 2.0.18", "tokio", - "toml 1.0.3+spec-1.1.0", + "toml 1.0.0+spec-1.1.0", "tracing", "tree-sitter", "tree-sitter-c", @@ -4428,22 +3505,22 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "milvus-sdk-rust" version = "0.1.0" +source = "git+https://github.com/milvus-io/milvus-sdk-rust.git#5ca106270377d25754a63b67f22d68460820a66c" dependencies = [ "anyhow", - "base64 0.22.1", - "dashmap", + "base64 0.21.7", + "dashmap 5.5.3", "futures", "lazy_static", "prost", "serde", "serde_json", - "strum 0.28.0", - "strum_macros 0.28.0", - "thiserror 2.0.18", + "strum", + "strum_macros", + "thiserror 1.0.69", "tokio", "tonic", - "tonic-prost", - "tonic-prost-build", + "tonic-build", ] [[package]] @@ -4452,16 +3529,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -4513,7 +3580,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -4555,7 +3622,7 @@ checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -4577,11 +3644,13 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 1.4.0", "httparse", "memchr", "mime", "spin", + "tokio", + "tokio-util", "version_check", ] @@ -4590,20 +3659,23 @@ name = "multimap" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +dependencies = [ + "serde", +] [[package]] name = "native-tls" -version = "0.2.18" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", "openssl", - "openssl-probe 0.2.1", + "openssl-probe 0.1.6", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -4631,16 +3703,31 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.30.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "225e7cfe711e0ba79a68baeddb2982723e4235247aefce1482f2f16c27865b66" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", ] +[[package]] +name = "nkeys" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879011babc47a1c7fdf5a935ae3cfe94f34645ca0cac1c7f6424b36fc743d1bf" +dependencies = [ + "data-encoding", + "ed25519", + "ed25519-dalek", + "getrandom 0.2.17", + "log", + "rand 0.8.5", + "signatory", +] + [[package]] name = "nom" version = "7.1.3" @@ -4681,7 +3768,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "fsevent-sys", "inotify", "kqueue", @@ -4699,7 +3786,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", ] [[package]] @@ -4720,6 +3807,15 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "nuid" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc895af95856f929163a0aa20c26a78d26bfdc839f51b9d5aa7a5b79e52b7e83" +dependencies = [ + "rand 0.8.5", +] + [[package]] name = "num" version = "0.4.3" @@ -4755,7 +3851,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.6", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -4789,7 +3885,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -4858,6 +3954,16 @@ dependencies = [ "libm", ] +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -4870,7 +3976,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", ] [[package]] @@ -4901,7 +4007,7 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "libc", "once_cell", "onig_sys", @@ -4923,43 +4029,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "opendal" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d075ab8a203a6ab4bc1bce0a4b9fe486a72bf8b939037f4b78d95386384bc80a" -dependencies = [ - "anyhow", - "backon", - "base64 0.22.1", - "bytes", - "futures", - "getrandom 0.2.17", - "http", - "http-body", - "jiff", - "log", - "md-5", - "percent-encoding", - "quick-xml 0.38.4", - "reqwest 0.12.28", - "serde", - "serde_json", - "tokio", - "url", - "uuid", -] - [[package]] name = "openssl" -version = "0.10.80" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", + "once_cell", "openssl-macros", "openssl-sys", ] @@ -4972,7 +4052,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -4989,9 +4069,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.116" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -5005,22 +4085,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] - [[package]] name = "ort" version = "2.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5df903c0d2c07b56950f1058104ab0c8557159f2741782223704de9be73c3c" dependencies = [ - "libloading", "ndarray", "ort-sys", "smallvec", @@ -5039,70 +4109,12 @@ dependencies = [ "ureq 3.2.0", ] -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.45.0", -] - -[[package]] -name = "ouroboros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.117", -] - [[package]] name = "outref" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - [[package]] name = "parking" version = "2.2.1" @@ -5132,15 +4144,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "parse-zoneinfo" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" -dependencies = [ - "regex", -] - [[package]] name = "password-hash" version = "0.5.0" @@ -5202,17 +4205,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.117", -] - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64 0.22.1", - "serde_core", + "syn 2.0.115", ] [[package]] @@ -5260,7 +4253,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -5275,81 +4268,26 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.8.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "fixedbitset", - "hashbrown 0.15.5", + "fixedbitset 0.4.2", "indexmap 2.13.0", - "serde", ] [[package]] -name = "pgvector" -version = "0.4.1" +name = "petgraph" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ + "fixedbitset 0.5.7", + "hashbrown 0.15.5", + "indexmap 2.13.0", "serde", ] -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared 0.11.3", -] - -[[package]] -name = "phf" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" -dependencies = [ - "phf_shared 0.12.1", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.6", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" version = "1.1.10" @@ -5367,7 +4305,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -5409,43 +4347,19 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" -[[package]] -name = "pluralizer" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b3eba432a00a1f6c16f39147847a870e94e2e9b992759b503e330efec778cbe" -dependencies = [ - "once_cell", - "regex", -] - [[package]] name = "png" -version = "0.18.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "crc32fast", "fdeflate", "flate2", "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] - [[package]] name = "polyval" version = "0.6.2" @@ -5543,16 +4457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", + "syn 2.0.115", ] [[package]] @@ -5583,7 +4488,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -5603,23 +4508,23 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", "version_check", "yansi", ] [[package]] name = "process-wrap" -version = "9.0.1" +version = "9.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1395947e69c07400ef4d43db0051d6f773c21f647ad8b97382fc01f0204c60" +checksum = "ccd9713fe2c91c3c85ac388b31b89de339365d2c995146e630b5e0da9d06526a" dependencies = [ "futures", "indexmap 2.13.0", "nix", "tokio", "tracing", - "windows", + "windows 0.62.2", ] [[package]] @@ -5638,14 +4543,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] name = "prost" -version = "0.14.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", "prost-derive", @@ -5653,74 +4558,54 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.14.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ - "heck 0.4.1", - "itertools", + "bytes", + "heck 0.5.0", + "itertools 0.12.1", "log", "multimap", - "petgraph", + "once_cell", + "petgraph 0.6.5", "prettyplease", "prost", "prost-types", - "pulldown-cmark", - "pulldown-cmark-to-cmark", "regex", - "syn 2.0.117", + "syn 2.0.115", "tempfile", ] [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] name = "prost-types" -version = "0.14.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ "prost", ] -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "pulldown-cmark" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c41efbf8f90ac44de7f3a868f0867851d261b56291732d0cbf7cceaaeb55a6" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "getopts", "memchr", "pulldown-cmark-escape", @@ -5733,15 +4618,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" -[[package]] -name = "pulldown-cmark-to-cmark" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" -dependencies = [ - "pulldown-cmark", -] - [[package]] name = "pxfm" version = "0.1.27" @@ -5768,19 +4644,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quick-xml" -version = "0.39.2" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +checksum = "f2e3bf4aa9d243beeb01a7b3bc30b77cfe2c44e24ec02d751a7104a53c2c49a1" dependencies = [ "memchr", ] @@ -5797,8 +4663,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls", - "socket2", + "rustls 0.23.36", + "socket2 0.6.2", "thiserror 2.0.18", "tokio", "tracing", @@ -5807,18 +4673,18 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "aws-lc-rs", "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.4", + "rand 0.9.2", "ring", "rustc-hash", - "rustls", + "rustls 0.23.36", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -5836,7 +4702,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.6.2", "tracing", "windows-sys 0.60.2", ] @@ -5850,12 +4716,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "quoted_printable" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640c9bd8497b02465aeef5375144c26062e0dcd5939dfcbb0f5db76cb8c17c73" - [[package]] name = "r-efi" version = "5.3.0" @@ -5870,9 +4730,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -5881,9 +4741,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -5891,9 +4751,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" dependencies = [ "chacha20", "getrandom 0.4.1", @@ -5908,6 +4768,7 @@ checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core 0.6.4", + "serde", ] [[package]] @@ -5920,17 +4781,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_chacha" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" -dependencies = [ - "ppv-lite86", - "rand_core 0.10.0", - "serde", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -5971,7 +4821,7 @@ dependencies = [ "built", "cfg-if", "interpolate_name", - "itertools", + "itertools 0.14.0", "libc", "libfuzzer-sys", "log", @@ -5982,7 +4832,7 @@ dependencies = [ "num-traits", "paste", "profiling", - "rand 0.9.4", + "rand 0.9.2", "rand_chacha 0.9.0", "simd_helpers", "thiserror 2.0.18", @@ -6028,7 +4878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2964d0cf57a3e7a06e8183d14a8b527195c706b7983549cd5462d5aa3747438f" dependencies = [ "either", - "itertools", + "itertools 0.14.0", "rayon", ] @@ -6044,9 +4894,9 @@ dependencies = [ [[package]] name = "redis" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7f6e08ce1c6a9b21684e643926f6fc3b683bc006cb89afd72a5e0eb16e3a2" +checksum = "e969d1d702793536d5fda739a82b88ad7cbe7d04f8386ee8cd16ad3eff4854a5" dependencies = [ "arc-swap", "arcstr", @@ -6062,7 +4912,7 @@ dependencies = [ "pin-project-lite", "ryu", "sha1_smol", - "socket2", + "socket2 0.6.2", "tokio", "tokio-util", "url", @@ -6075,16 +4925,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", ] [[package]] name = "redox_syscall" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d94dd2f7cd932d4dc02cc8b2b50dfd38bd079a4e5d79198b99743d7fcf9a4b4" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", ] [[package]] @@ -6115,16 +4965,16 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] name = "referencing" -version = "0.42.1" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a76b0c93f3dd49da2900cfb3c6b883602471a0e3e34b1578a3310ca1269d418" +checksum = "d5773259506800a8c6ef38df3674b061c62c5941162507891ff8b580e93d954e" dependencies = [ - "ahash 0.8.12", + "ahash", "fluent-uri", "getrandom 0.3.4", "hashbrown 0.16.1", @@ -6158,9 +5008,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "relative-path" @@ -6168,15 +5018,6 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - [[package]] name = "reqwest" version = "0.12.28" @@ -6188,11 +5029,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-rustls", "hyper-tls", "hyper-util", @@ -6206,11 +5047,11 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", "tokio-util", - "tower", + "tower 0.5.3", "tower-http", "tower-service", "url", @@ -6232,11 +5073,11 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.4.13", + "http 1.4.0", + "http-body 1.0.1", "http-body-util", - "hyper", + "hyper 1.8.1", "hyper-rustls", "hyper-util", "js-sys", @@ -6245,15 +5086,15 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls", + "rustls 0.23.36", "rustls-pki-types", "rustls-platform-verifier", "serde", "serde_json", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", - "tokio-rustls", - "tower", + "tokio-rustls 0.26.4", + "tower 0.5.3", "tower-http", "tower-service", "url", @@ -6264,24 +5105,14 @@ dependencies = [ [[package]] name = "rexile" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecf6573f8cb142a5afe21c0809d6be349c982fa064bf16ed1474e834b7fac988" +checksum = "de374dd087c6e5f46ee0c56ee53ba175fd52974f9e0c76644081cfe95e8458a8" dependencies = [ "aho-corasick", "memchr", ] -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - [[package]] name = "rgb" version = "0.8.52" @@ -6303,96 +5134,122 @@ dependencies = [ ] [[package]] -name = "rkyv" -version = "0.7.46" +name = "rmcp" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +checksum = "1bef41ebc9ebed2c1b1d90203e9d1756091e8a00bbc3107676151f39868ca0ee" dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", + "async-trait", + "base64 0.22.1", + "chrono", + "futures", + "pastey 0.2.1", + "pin-project-lite", + "process-wrap", + "rmcp-macros", + "schemars", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", ] [[package]] -name = "rkyv_derive" -version = "0.7.46" +name = "rmcp-macros" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +checksum = "0e88ad84b8b6237a934534a62b379a5be6388915663c0cc598ceb9b3292bbbfe" dependencies = [ + "darling 0.23.0", "proc-macro2", "quote", - "syn 1.0.109", + "serde_json", + "syn 2.0.115", ] [[package]] -name = "rmcp" -version = "1.6.0" +name = "rocket" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12ca9067b5ebfbd5b3fcdc4acfceb81aa7d5ab2a879dff7cb75d22434276aad" +checksum = "a516907296a31df7dc04310e7043b61d71954d703b603cc6867a026d7e72d73f" dependencies = [ + "async-stream", "async-trait", - "base64 0.22.1", + "atomic 0.5.3", + "binascii", "bytes", - "chrono", + "either", + "figment", "futures", - "http", - "http-body", - "http-body-util", - "pastey 0.2.1", + "indexmap 2.13.0", + "log", + "memchr", + "multer", + "num_cpus", + "parking_lot", "pin-project-lite", - "process-wrap", - "rand 0.10.1", - "rmcp-macros", - "schemars 1.2.1", + "rand 0.8.5", + "ref-cast", + "rocket_codegen", + "rocket_http", "serde", "serde_json", - "sse-stream", - "thiserror 2.0.18", + "state", + "tempfile", + "time", "tokio", "tokio-stream", "tokio-util", - "tower-service", - "tracing", - "uuid", + "ubyte", + "version_check", + "yansi", ] [[package]] -name = "rmcp-macros" -version = "1.6.0" +name = "rocket_codegen" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7caa6743cc0888e433105fe1bc551a7f607940b126a37bc97b478e86064627eb" +checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" dependencies = [ - "darling 0.23.0", + "devise", + "glob", + "indexmap 2.13.0", "proc-macro2", "quote", - "serde_json", - "syn 2.0.117", + "rocket_http", + "syn 2.0.115", + "unicode-xid", + "version_check", ] [[package]] -name = "rrgen" -version = "0.5.6" +name = "rocket_http" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee7a7ede035354391a37e42aa4935b3d8921f0ded896d2ce44bb1a3b6dd76bab" +checksum = "e274915a20ee3065f611c044bd63c40757396b6dbc057d6046aec27f14f882b9" dependencies = [ - "cruet 0.13.3", - "fs-err", - "glob", - "heck 0.4.1", - "regex", + "cookie", + "either", + "futures", + "http 0.2.12", + "hyper 0.14.32", + "indexmap 2.13.0", + "log", + "memchr", + "pear", + "percent-encoding", + "pin-project-lite", + "ref-cast", "serde", - "serde_json", - "serde_regex", - "serde_yaml", - "tera", - "thiserror 1.0.69", + "smallvec", + "stable-pattern", + "state", + "time", + "tokio", + "uncased", ] [[package]] @@ -6440,13 +5297,14 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.117", + "syn 2.0.115", "unicode-ident", ] [[package]] name = "rust-code-analysis" version = "0.0.25" +source = "git+https://github.com/marlon-costa-dc/rust-code-analysis?branch=master#7b0ef67d18d9944316dd12cdd91773a13cd5fe1b" dependencies = [ "aho-corasick", "crossbeam", @@ -6455,7 +5313,7 @@ dependencies = [ "num-derive", "num-format", "num-traits", - "petgraph", + "petgraph 0.8.3", "regex", "serde", "termcolor", @@ -6475,9 +5333,9 @@ dependencies = [ [[package]] name = "rust-rule-engine" -version = "1.19.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f745d6ded1002dca603d5f881bdf0c739c386dc2909a5e4bbdaeb92e6ba43cf" +checksum = "07d2d50a22109014aea317a98502bbb8240bfdd12317e193dd0b951e1f27bc70" dependencies = [ "chrono", "log", @@ -6488,22 +5346,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "rust_decimal" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand 0.8.6", - "rkyv", - "serde", - "serde_json", -] - [[package]] name = "rustc-hash" version = "2.1.1" @@ -6521,11 +5363,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", @@ -6534,20 +5376,47 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.9", "subtle", "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe 0.1.6", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework 2.11.1", +] + [[package]] name = "rustls-native-certs" version = "0.8.3" @@ -6557,7 +5426,16 @@ dependencies = [ "openssl-probe 0.2.1", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", ] [[package]] @@ -6581,11 +5459,11 @@ dependencies = [ "jni", "log", "once_cell", - "rustls", - "rustls-native-certs", + "rustls 0.23.36", + "rustls-native-certs 0.8.3", "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework", + "rustls-webpki 0.103.9", + "security-framework 3.5.1", "security-framework-sys", "webpki-root-certs", "windows-sys 0.61.2", @@ -6599,9 +5477,20 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "aws-lc-rs", "ring", @@ -6659,18 +5548,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - [[package]] name = "schemars" version = "1.2.1" @@ -6683,7 +5560,6 @@ dependencies = [ "schemars_derive", "serde", "serde_json", - "uuid", ] [[package]] @@ -6695,9 +5571,15 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.117", + "syn 2.0.115", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -6711,227 +5593,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] -name = "sea-bae" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f694a6ab48f14bc063cfadff30ab551d3c7e46d8f81836c51989d548f44a2a25" -dependencies = [ - "heck 0.4.1", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "sea-orm" -version = "2.0.0-rc.34" -dependencies = [ - "async-stream", - "async-trait", - "bigdecimal", - "chrono", - "derive_more", - "futures-util", - "inventory", - "itertools", - "log", - "ouroboros", - "pgvector", - "rust_decimal", - "sea-orm-arrow", - "sea-orm-macros", - "sea-query", - "sea-query-sqlx", - "sea-schema", - "serde", - "serde_json", - "sqlx", - "strum 0.28.0", - "thiserror 2.0.18", - "time", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "sea-orm-arrow" -version = "2.0.0-rc.3" -dependencies = [ - "arrow", - "sea-query", - "thiserror 2.0.18", -] - -[[package]] -name = "sea-orm-cli" -version = "2.0.0-rc.34" -dependencies = [ - "chrono", - "clap", - "dotenvy", - "glob", - "indoc", - "regex", - "sea-schema", - "sqlx", - "tokio", - "tracing", - "tracing-subscriber", - "url", -] - -[[package]] -name = "sea-orm-macros" -version = "2.0.0-rc.34" -dependencies = [ - "heck 0.5.0", - "itertools", - "pluralizer", - "proc-macro-crate", - "proc-macro2", - "quote", - "sea-bae", - "syn 2.0.117", - "unicode-ident", -] - -[[package]] -name = "sea-orm-migration" -version = "2.0.0-rc.34" -dependencies = [ - "async-trait", - "clap", - "dotenvy", - "sea-orm", - "sea-orm-cli", - "sea-schema", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "sea-orm-pro" -version = "0.1.0" -dependencies = [ - "anyhow", - "indexmap 2.13.0", - "serde", - "toml 0.8.23", - "walkdir", -] - -[[package]] -name = "sea-query" -version = "1.0.0-rc.31" -dependencies = [ - "chrono", - "inherent", - "itoa", - "ordered-float", - "rust_decimal", - "sea-query-derive", - "serde_json", - "time", - "uuid", -] - -[[package]] -name = "sea-query-derive" -version = "1.0.0-rc.12" -dependencies = [ - "darling 0.20.11", - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.117", - "thiserror 2.0.18", -] - -[[package]] -name = "sea-query-sqlx" -version = "0.8.0-rc.14" -dependencies = [ - "sea-query", - "sqlx", -] - -[[package]] -name = "sea-schema" -version = "0.17.0-rc.17" -dependencies = [ - "async-trait", - "sea-query", - "sea-query-sqlx", - "sea-schema-derive", - "sqlx", -] - -[[package]] -name = "sea-schema-derive" -version = "0.3.0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "seaography" -version = "2.0.0-rc.8" -dependencies = [ - "async-graphql", - "fnv", - "heck 0.5.0", - "itertools", - "lazy_static", - "sea-orm", - "seaography-macros", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "seaography-macros" -version = "2.0.0-rc.8" -dependencies = [ - "darling 0.21.3", - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "sec1" -version = "0.7.3" +name = "security-framework" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", + "bitflags 2.10.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] name = "security-framework" -version = "3.7.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -6940,9 +5620,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.17.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -7006,7 +5686,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -7017,7 +5697,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -7035,24 +5715,23 @@ dependencies = [ ] [[package]] -name = "serde_path_to_error" -version = "0.1.20" +name = "serde_nanos" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +checksum = "a93142f0367a4cc53ae0fead1bcda39e85beccfad3dcd717656cacab94b12985" dependencies = [ - "itoa", "serde", - "serde_core", ] [[package]] -name = "serde_regex" -version = "1.1.0" +name = "serde_repr" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ - "regex", - "serde", + "proc-macro2", + "quote", + "syn 2.0.115", ] [[package]] @@ -7085,46 +5764,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_variant" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0068df419f9d9b6488fdded3f1c818522cdea328e02ce9d9f147380265a432" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_with" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -7140,9 +5779,9 @@ dependencies = [ [[package]] name = "serial_test" -version = "3.4.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f" +checksum = "0d0b343e184fc3b7bb44dff0705fffcf4b3756ba6aff420dddd8b24ca145e555" dependencies = [ "futures-executor", "futures-util", @@ -7155,13 +5794,13 @@ dependencies = [ [[package]] name = "serial_test_derive" -version = "3.4.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9" +checksum = "6f50427f258fb77356e4cd4aa0e87e2bd2c66dbcee41dc405282cae2bfc26c83" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -7202,22 +5841,14 @@ dependencies = [ ] [[package]] -name = "shared_child" -version = "1.1.1" +name = "shellexpand" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" dependencies = [ - "libc", - "sigchld", - "windows-sys 0.60.2", + "dirs", ] -[[package]] -name = "shared_thread" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b86057fcb5423f5018e331ac04623e32d6b5ce85e33300f92c79a1973928b0" - [[package]] name = "shlex" version = "1.3.0" @@ -7225,34 +5856,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "sigchld" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" -dependencies = [ - "libc", - "os_pipe", - "signal-hook", -] - -[[package]] -name = "signal-hook" -version = "0.3.18" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", - "signal-hook-registry", ] [[package]] -name = "signal-hook-registry" -version = "1.4.8" +name = "signatory" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +checksum = "c1e303f8205714074f6068773f0e29527e0453937fe837c9717d066635b65f31" dependencies = [ - "errno", - "libc", + "pkcs8", + "rand_core 0.6.4", + "signature", + "zeroize", ] [[package]] @@ -7280,51 +5902,17 @@ dependencies = [ "quote", ] -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - [[package]] name = "similar" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" -[[package]] -name = "simple_asn1" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.18", - "time", -] - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "slug" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724" -dependencies = [ - "deunicode", - "wasm-bindgen", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -7335,6 +5923,16 @@ dependencies = [ "serde", ] +[[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.2" @@ -7408,7 +6006,6 @@ checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64 0.22.1", "bytes", - "chrono", "crc", "crossbeam-queue", "either", @@ -7424,20 +6021,15 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rust_decimal", - "rustls", "serde", "serde_json", "sha2", "smallvec", "thiserror 2.0.18", - "time", "tokio", "tokio-stream", "tracing", "url", - "uuid", - "webpki-roots 0.26.11", ] [[package]] @@ -7450,7 +6042,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -7473,7 +6065,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.117", + "syn 2.0.115", "tokio", "url", ] @@ -7486,10 +6078,9 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.11.0", + "bitflags 2.10.0", "byteorder", "bytes", - "chrono", "crc", "digest", "dotenvy", @@ -7508,9 +6099,8 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand 0.8.6", + "rand 0.8.5", "rsa", - "rust_decimal", "serde", "sha1", "sha2", @@ -7518,9 +6108,7 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror 2.0.18", - "time", "tracing", - "uuid", "whoami", ] @@ -7532,9 +6120,8 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64 0.22.1", - "bitflags 2.11.0", + "bitflags 2.10.0", "byteorder", - "chrono", "crc", "dotenvy", "etcetera", @@ -7550,8 +6137,7 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand 0.8.6", - "rust_decimal", + "rand 0.8.5", "serde", "serde_json", "sha2", @@ -7559,9 +6145,7 @@ dependencies = [ "sqlx-core", "stringprep", "thiserror 2.0.18", - "time", "tracing", - "uuid", "whoami", ] @@ -7572,7 +6156,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" dependencies = [ "atoi", - "chrono", "flume", "futures-channel", "futures-core", @@ -7586,23 +6169,17 @@ dependencies = [ "serde_urlencoded", "sqlx-core", "thiserror 2.0.18", - "time", "tracing", "url", - "uuid", ] [[package]] -name = "sse-stream" -version = "0.2.1" +name = "stable-pattern" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb4dc4d33c68ec1f27d386b5610a351922656e1fdf5c05bbaad930cd1519479a" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" dependencies = [ - "bytes", - "futures-util", - "http-body", - "http-body-util", - "pin-project-lite", + "memchr", ] [[package]] @@ -7612,16 +6189,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] -name = "static_assertions" -version = "1.1.0" +name = "state" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" +dependencies = [ + "loom", +] [[package]] -name = "static_assertions_next" -version = "1.1.2" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7beae5182595e9a8b683fa98c4317f956c9a2dec3b9716990d20023cc60c766" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "streaming-iterator" @@ -7648,41 +6228,21 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - -[[package]] -name = "strum" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" - -[[package]] -name = "strum_macros" -version = "0.27.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" [[package]] name = "strum_macros" -version = "0.28.0" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.117", + "rustversion", + "syn 1.0.109", ] [[package]] @@ -7704,15 +6264,21 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -7730,21 +6296,21 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] name = "sysinfo" -version = "0.38.2" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efc19935b4b66baa6f654ac7924c192f55b175c00a7ab72410fc24284dacda8" +checksum = "5792d209c2eac902426c0c4a166c9f72147db453af548cf9bf3242644c4d4fe3" dependencies = [ "libc", "memchr", "ntapi", "objc2-core-foundation", "objc2-io-kit", - "windows", + "windows 0.62.2", ] [[package]] @@ -7753,7 +6319,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7782,9 +6348,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.26.0" +version = "3.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ "fastrand", "getrandom 0.4.1", @@ -7793,28 +6359,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "tera" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8004bca281f2d32df3bacd59bc67b312cb4c70cea46cbd79dbe8ac5ed206722" -dependencies = [ - "chrono", - "chrono-tz 0.9.0", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding", - "pest", - "pest_derive", - "rand 0.8.6", - "regex", - "serde", - "serde_json", - "slug", - "unicode-segmentation", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -7856,7 +6400,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -7867,7 +6411,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -7924,15 +6468,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinystr" version = "0.8.2" @@ -7964,20 +6499,20 @@ version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b238e22d44a15349529690fb07bd645cf58149a1b1e44d6cb5bd1641ff1a6223" dependencies = [ - "ahash 0.8.12", + "ahash", "aho-corasick", "compact_str", "dary_heap", "derive_builder", "esaxx-rs", "getrandom 0.3.4", - "itertools", + "itertools 0.14.0", "log", "macro_rules_attribute", "monostate", "onig", "paste", - "rand 0.9.4", + "rand 0.9.2", "rayon", "rayon-cond", "regex", @@ -8003,25 +6538,19 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] [[package]] -name = "tokio-cron-scheduler" -version = "0.15.1" +name = "tokio-io-timeout" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f50e41f200fd8ed426489bd356910ede4f053e30cebfbd59ef0f856f0d7432a" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" dependencies = [ - "chrono", - "chrono-tz 0.10.4", - "croner", - "num-derive", - "num-traits", + "pin-project-lite", "tokio", - "tracing", - "uuid", ] [[package]] @@ -8032,7 +6561,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -8045,13 +6574,24 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.4", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls", + "rustls 0.23.36", "tokio", ] @@ -8067,31 +6607,39 @@ dependencies = [ ] [[package]] -name = "tokio-tungstenite" -version = "0.28.0" +name = "tokio-util" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ + "bytes", + "futures-core", + "futures-sink", "futures-util", - "log", + "pin-project-lite", + "slab", "tokio", - "tungstenite", ] [[package]] -name = "tokio-util" -version = "0.7.18" +name = "tokio-websockets" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "f591660438b3038dd04d16c938271c79e7e06260ad2ea2885a4861bfb238605d" dependencies = [ + "base64 0.22.1", "bytes", "futures-core", - "futures-io", "futures-sink", - "futures-util", - "pin-project-lite", - "slab", + "http 1.4.0", + "httparse", + "rand 0.8.5", + "ring", + "rustls-pki-types", "tokio", + "tokio-rustls 0.26.4", + "tokio-util", + "webpki-roots 0.26.11", ] [[package]] @@ -8100,7 +6648,6 @@ version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ - "indexmap 2.13.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -8124,9 +6671,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.3+spec-1.1.0" +version = "1.0.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7614eaf19ad818347db24addfa201729cf2a9b6fdfd9eb0ab870fcacc606c0c" +checksum = "d1d7e18e3dd1d31e0ee5e863a8091ffec2fcc271636586042452b656a22c8ee1" dependencies = [ "indexmap 2.13.0", "serde_core", @@ -8192,9 +6739,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "247eaa3197818b831697600aadf81514e577e0cba5eab10f7e064e78ae154df1" dependencies = [ "winnow", ] @@ -8213,30 +6760,30 @@ checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" [[package]] name = "tonic" -version = "0.14.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" dependencies = [ + "async-stream", "async-trait", "axum", - "base64 0.22.1", + "base64 0.21.7", "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "hyper-timeout", - "hyper-util", "percent-encoding", "pin-project", - "rustls-native-certs", - "socket2", - "sync_wrapper", + "prost", + "rustls-native-certs 0.7.3", + "rustls-pemfile", + "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.25.0", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -8244,41 +6791,35 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.14.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" +checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ "prettyplease", "proc-macro2", + "prost-build", "quote", - "syn 2.0.117", -] - -[[package]] -name = "tonic-prost" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" -dependencies = [ - "bytes", - "prost", - "tonic", + "syn 2.0.115", ] [[package]] -name = "tonic-prost-build" -version = "0.14.5" +name = "tower" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.117", - "tempfile", - "tonic-build", + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", ] [[package]] @@ -8289,15 +6830,11 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.13.0", "pin-project-lite", - "slab", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", - "tokio-util", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -8306,27 +6843,16 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "async-compression", - "bitflags 2.11.0", + "bitflags 2.10.0", "bytes", - "futures-core", "futures-util", - "http", - "http-body", - "http-body-util", - "http-range-header", - "httpdate", + "http 1.4.0", + "http-body 1.0.1", "iri-string", - "mime", - "mime_guess", - "percent-encoding", "pin-project-lite", - "tokio", - "tokio-util", - "tower", + "tower 0.5.3", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -8373,7 +6899,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -8430,9 +6956,9 @@ dependencies = [ [[package]] name = "tree-sitter" -version = "0.26.5" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12987371f54efc9b9306a20dc87ed5aaee9f320c8a8b115e28515c412b2efe39" +checksum = "974d205cc395652cfa8b37daa053fe56eebd429acf8dc055503fee648dae981e" dependencies = [ "cc", "regex", @@ -8465,6 +6991,7 @@ dependencies = [ [[package]] name = "tree-sitter-ccomment" version = "0.20.3" +source = "git+https://github.com/marlon-costa-dc/rust-code-analysis?branch=master#7b0ef67d18d9944316dd12cdd91773a13cd5fe1b" dependencies = [ "cc", "tree-sitter-language", @@ -8551,6 +7078,7 @@ checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" [[package]] name = "tree-sitter-mozcpp" version = "0.20.4" +source = "git+https://github.com/marlon-costa-dc/rust-code-analysis?branch=master#7b0ef67d18d9944316dd12cdd91773a13cd5fe1b" dependencies = [ "cc", "tree-sitter-cpp", @@ -8560,6 +7088,7 @@ dependencies = [ [[package]] name = "tree-sitter-mozjs" version = "0.20.3" +source = "git+https://github.com/marlon-costa-dc/rust-code-analysis?branch=master#7b0ef67d18d9944316dd12cdd91773a13cd5fe1b" dependencies = [ "cc", "tree-sitter-javascript", @@ -8579,6 +7108,7 @@ dependencies = [ [[package]] name = "tree-sitter-preproc" version = "0.20.3" +source = "git+https://github.com/marlon-costa-dc/rust-code-analysis?branch=master#7b0ef67d18d9944316dd12cdd91773a13cd5fe1b" dependencies = [ "cc", "tree-sitter-language", @@ -8641,70 +7171,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] -name = "tungstenite" -version = "0.28.0" +name = "tryhard" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +checksum = "9fe58ebd5edd976e0fe0f8a14d2a04b7c81ef153ea9a54eebc42e67c2c23b4e5" dependencies = [ - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.9.4", - "sha1", - "thiserror 2.0.18", - "utf-8", + "pin-project-lite", + "tokio", ] [[package]] -name = "typed-builder" -version = "0.23.2" +name = "typenum" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" -dependencies = [ - "typed-builder-macro", -] +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] -name = "typed-builder-macro" -version = "0.23.2" +name = "ubyte" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "serde", ] -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - [[package]] name = "ucd-trie" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" -[[package]] -name = "ulid" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" -dependencies = [ - "rand 0.9.4", - "web-time", -] - [[package]] name = "uncased" version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" dependencies = [ + "serde", "version_check", ] @@ -8728,9 +7231,9 @@ checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" [[package]] name = "unicode-normalization" @@ -8813,7 +7316,7 @@ dependencies = [ "log", "native-tls", "once_cell", - "rustls", + "rustls 0.23.36", "rustls-pki-types", "serde", "serde_json", @@ -8847,7 +7350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" dependencies = [ "base64 0.22.1", - "http", + "http 1.4.0", "httparse", "log", ] @@ -8870,12 +7373,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf8-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -8890,15 +7387,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.21.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ - "getrandom 0.4.1", + "getrandom 0.3.4", "js-sys", - "rand 0.9.4", - "serde_core", - "sha1_smol", "wasm-bindgen", ] @@ -8950,7 +7444,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -9028,9 +7522,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.113" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60722a937f594b7fde9adb894d7c092fc1bb6612897c46368d18e7a20208eff2" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -9041,9 +7535,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.63" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a89f4650b770e4521aa6573724e2aed4704372151bd0de9d16a3bbabb87441a" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", "futures-util", @@ -9055,9 +7549,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.113" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac8c6395094b6b91c4af293f4c79371c163f9a6f56184d2c9a85f5a95f3950" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9065,22 +7559,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.113" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3fabce6159dc20728033842636887e4877688ae94382766e00b180abac9d60" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.113" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0e091bdb824da87dc01d967388880d017a0a9bc4f3bdc0d86ee9f9336e3bb5" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -9126,7 +7620,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.10.0", "hashbrown 0.15.5", "indexmap 2.13.0", "semver", @@ -9134,9 +7628,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.90" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705eceb4ce901230f8625bd1d665128056ccbe4b7408faa625eec1ba80f59a97" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ "js-sys", "wasm-bindgen", @@ -9217,7 +7711,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -9226,6 +7720,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows" version = "0.62.2" @@ -9279,7 +7782,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -9290,7 +7793,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -9683,7 +8186,7 @@ dependencies = [ "heck 0.5.0", "indexmap 2.13.0", "prettyplease", - "syn 2.0.117", + "syn 2.0.115", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -9699,7 +8202,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -9711,7 +8214,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.10.0", "indexmap 2.13.0", "log", "serde", @@ -9773,6 +8276,9 @@ name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +dependencies = [ + "is-terminal", +] [[package]] name = "yoke" @@ -9793,7 +8299,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", "synstructure", ] @@ -9814,7 +8320,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -9834,7 +8340,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", "synstructure", ] @@ -9874,7 +8380,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.115", ] [[package]] @@ -9883,34 +8389,6 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "zune-core" version = "0.4.12" diff --git a/crates/mcb-ast-utils/Cargo.toml b/crates/mcb-ast-utils/Cargo.toml new file mode 100644 index 000000000..f017bdea0 --- /dev/null +++ b/crates/mcb-ast-utils/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "mcb-ast-utils" +description = "AST traversal and analysis utilities for MCP Context Browser" +homepage.workspace = true +authors.workspace = true +repository.workspace = true +license.workspace = true +version.workspace = true +edition.workspace = true +rust-version.workspace = true + + +[lints] +workspace = true + +[dependencies] +# Language support for language identification +mcb-language-support = { path = "../mcb-language-support" } + +# Tree-sitter for direct AST access +tree-sitter.workspace = true +tree-sitter-rust.workspace = true +tree-sitter-python.workspace = true +tree-sitter-javascript.workspace = true +tree-sitter-typescript.workspace = true +tree-sitter-go.workspace = true +tree-sitter-java.workspace = true +tree-sitter-c.workspace = true +tree-sitter-cpp.workspace = true +tree-sitter-kotlin-ng.workspace = true + +# Error handling +thiserror.workspace = true + +[dev-dependencies] +tempfile.workspace = true +rstest = { workspace = true } +mockall = { workspace = true } +insta = { workspace = true } diff --git a/crates/mcb-infrastructure/Cargo.toml b/crates/mcb-infrastructure/Cargo.toml index 496e246da..86fdd1dc8 100644 --- a/crates/mcb-infrastructure/Cargo.toml +++ b/crates/mcb-infrastructure/Cargo.toml @@ -18,7 +18,9 @@ path = "src/lib.rs" [dependencies] # Domain layer - core business logic and port traits mcb-domain = { path = "../mcb-domain" } -mcb-utils = { path = "../mcb-utils" } + +# Application layer - use cases and business logic orchestration +mcb-application = { path = "../mcb-application" } # Core async runtime tokio = { workspace = true } @@ -26,15 +28,24 @@ tokio = { workspace = true } # Serialization serde = { workspace = true } serde_json = { workspace = true } -serde_yaml = { workspace = true } # Error handling +anyhow = { workspace = true } thiserror = { workspace = true } # Logging tracing = { workspace = true } tracing-subscriber = { workspace = true } +# Configuration +figment = { workspace = true } +toml = { workspace = true } +notify = { workspace = true } +arc-swap = { workspace = true } + +# HTTP client +reqwest = { workspace = true } + # CLI clap = { workspace = true } @@ -47,10 +58,15 @@ regex = { workspace = true } # Date/time handling chrono = { workspace = true } +# Template engines +handlebars = { workspace = true } + # Cryptography aes-gcm = { workspace = true } +rand = { workspace = true } # Authentication +bcrypt = { workspace = true } argon2 = { workspace = true } base64 = { workspace = true } @@ -60,6 +76,10 @@ hex = { workspace = true } # Utilities uuid = { workspace = true } +dirs = { workspace = true } + +# System metrics +sysinfo = { workspace = true } # Fast globbing glob = { workspace = true } @@ -69,31 +89,48 @@ ignore = { workspace = true } # Concurrent processing futures = { workspace = true } +rayon = { workspace = true } + +# Text processing +unicode-segmentation = { workspace = true } # Schema generation for MCP schemars = { workspace = true } +# Input validation +validator = { workspace = true } + +# MCP SDK +rmcp = { workspace = true } + # Advanced Multi-Provider Strategy +tokio-util = { workspace = true } dashmap = { workspace = true } health = { workspace = true } # Additional dependencies async-trait = { workspace = true } +downcast-rs = { workspace = true } futures-util = { workspace = true } -linkme.workspace = true + +# Dependency Injection (IoC Container) +dill = { workspace = true } # Service layer improvements itertools = { workspace = true } +humantime = { workspace = true } + +# Shell expansion +shellexpand = { workspace = true } # Additional crypto pbkdf2 = { workspace = true } hmac = { workspace = true } -# SeaORM (database layer) -sea-orm = { workspace = true } -sea-orm-migration = { workspace = true } +# Logging appenders +tracing-appender = { workspace = true } -# SQLite for legacy/direct queries +# SQLite for file hash storage (Phase 3: Incremental indexing) sqlx = { workspace = true } # Syntax highlighting @@ -111,29 +148,20 @@ tree-sitter-ruby = { workspace = true } tree-sitter-php = { workspace = true } tree-sitter-swift = { workspace = true } -[features] -default = [] -test-utils = [] +# Links providers into linkme distributed slices +mcb-providers = { path = "../mcb-providers" } + +# Architecture validation (for MCP tool integration) +mcb-validate = { path = "../mcb-validate" } [lints] workspace = true [dev-dependencies] -mcb-domain = { path = "../mcb-domain", features = ["test-utils"] } -mcb-utils = { path = "../mcb-utils" } tempfile = { workspace = true } -toml = { workspace = true } tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } serial_test = { workspace = true } rstest = { workspace = true } mockall = { workspace = true } -mcb-validate = { path = "../mcb-validate" } insta = { workspace = true } - -[[test]] -name = "unit" -path = "tests/unit/mod.rs" - -[[test]] -name = "integration" -path = "tests/integration/mod.rs" +mcb-domain = { path = "../mcb-domain", features = ["test-utils"] } diff --git a/crates/mcb-infrastructure/tests/unit/config_figment_tests.rs b/crates/mcb-infrastructure/tests/unit/config_figment_tests.rs new file mode 100644 index 000000000..4f6cfa00f --- /dev/null +++ b/crates/mcb-infrastructure/tests/unit/config_figment_tests.rs @@ -0,0 +1,202 @@ +//! Tests verifying Figment configuration pattern compliance (ADR-025) +//! +//! These tests ensure the configuration system adheres to ADR-025 principles: +//! - All configuration flows through Figment +//! - Environment variables use `MCP__` prefix (double underscore) +//! - No implicit fallbacks or legacy `MCB_` prefix support +//! - Fail-fast on missing required configuration +//! +//! # Safety +//! +//! Tests use `unsafe` blocks for `env::set_var`/`env::remove_var` because +//! Rust 2024 edition requires this for environment variable mutations. +//! Tests use `#[serial]` to prevent data races between env var mutations. + +use std::env; + +use mcb_infrastructure::config::loader::ConfigLoader; +use serial_test::serial; + +/// Helper to set env var safely. +#[allow(unsafe_code)] +fn set_env(key: &str, value: &str) { + // SAFETY: Tests run serially (#[serial]) — no concurrent env mutation. + unsafe { + env::set_var(key, value); + } +} + +/// Helper to remove env var safely. +#[allow(unsafe_code)] +fn remove_env(key: &str) { + // SAFETY: Tests run serially (#[serial]) — no concurrent env mutation. + unsafe { + env::remove_var(key); + } +} + +/// Helper to disable auth to avoid JWT secret validation +fn disable_auth() { + set_env("MCP__AUTH__ENABLED", "false"); +} + +/// Helper cleanup for auth +fn cleanup_auth() { + remove_env("MCP__AUTH__ENABLED"); +} + +/// Verify env vars with MCP__ prefix are loaded correctly +#[test] +#[serial] +fn test_mcp_prefix_env_vars_loaded() { + // Disable auth to avoid JWT validation + disable_auth(); + set_env("MCP__PROVIDERS__EMBEDDING__PROVIDER", "test-provider"); + + let config = ConfigLoader::new().load().expect("Should load config"); + + // Verify the provider value was loaded from env + assert_eq!( + config.providers.embedding.provider, + Some("test-provider".to_string()), + "MCP__ prefixed env vars should be loaded by Figment" + ); + + remove_env("MCP__PROVIDERS__EMBEDDING__PROVIDER"); + cleanup_auth(); +} + +/// Verify old MCB_ prefix is NOT loaded (breaking change per ADR-025) +#[test] +#[serial] +fn test_old_mcb_prefix_not_loaded() { + // Disable auth to avoid JWT validation + disable_auth(); + // Set admin key with OLD prefix (should be ignored) + set_env("MCB_ADMIN_API_KEY", "old-key-value"); + + let config = ConfigLoader::new().load().expect("Should load config"); + + // Old prefix should NOT be recognized - key should be None + assert_eq!( + config.auth.admin.key, None, + "Old MCB_ prefix should NOT be recognized (ADR-025 breaking change)" + ); + + remove_env("MCB_ADMIN_API_KEY"); + cleanup_auth(); +} + +/// Verify new MCP__ admin key IS loaded correctly +#[test] +#[serial] +fn test_new_admin_key_loaded() { + // Disable auth to avoid JWT validation + disable_auth(); + // Set admin key with NEW prefix + set_env("MCP__AUTH__ADMIN__KEY", "new-key-value"); + + let config = ConfigLoader::new().load().expect("Should load config"); + + // New prefix should be recognized + assert_eq!( + config.auth.admin.key, + Some("new-key-value".to_string()), + "MCP__AUTH__ADMIN__KEY should be loaded by Figment" + ); + + remove_env("MCP__AUTH__ADMIN__KEY"); + cleanup_auth(); +} + +/// Verify JWT secret validation fails when empty and auth is enabled +#[test] +#[serial] +fn test_jwt_secret_required_when_auth_enabled() { + // Enable auth but don't set JWT secret + set_env("MCP__AUTH__ENABLED", "true"); + // Deliberately NOT setting MCP__AUTH__JWT__SECRET + + let result = ConfigLoader::new().load(); + + // Should fail validation + assert!( + result.is_err(), + "Config should fail validation when auth.enabled=true but JWT secret is empty" + ); + + let err = result.unwrap_err().to_string(); + assert!( + err.contains("JWT") || err.contains("secret"), + "Error message should mention JWT secret requirement, got: {}", + err + ); + + remove_env("MCP__AUTH__ENABLED"); +} + +/// Verify watching_enabled config is loaded from Figment, not direct env::var +#[test] +#[serial] +fn test_watching_enabled_via_figment() { + // Disable auth to avoid JWT validation + disable_auth(); + set_env("MCP__SYSTEM__DATA__SYNC__WATCHING_ENABLED", "false"); + + let config = ConfigLoader::new().load().expect("Should load config"); + + // Should be false (default is true) + assert!( + !config.system.data.sync.watching_enabled, + "watching_enabled should be loaded from MCP__SYSTEM__DATA__SYNC__WATCHING_ENABLED" + ); + + remove_env("MCP__SYSTEM__DATA__SYNC__WATCHING_ENABLED"); + cleanup_auth(); +} + +/// Verify that DISABLE_CONFIG_WATCHING env var is NOT supported (legacy removal) +#[test] +#[serial] +fn test_legacy_disable_watching_not_supported() { + // Disable auth to avoid JWT validation + disable_auth(); + // Set OLD env var that should be ignored + set_env("DISABLE_CONFIG_WATCHING", "true"); + + let config = ConfigLoader::new().load().expect("Should load config"); + + // Old env var should be ignored, watching_enabled should be default (true) + assert!( + config.system.data.sync.watching_enabled, + "DISABLE_CONFIG_WATCHING should NOT affect watching_enabled (use MCP__SYSTEM__DATA__SYNC__WATCHING_ENABLED)" + ); + + remove_env("DISABLE_CONFIG_WATCHING"); + cleanup_auth(); +} + +// ============================================================================ +// Tests that need clean env state (also serial to avoid interference) +// ============================================================================ + +/// Verify auth is DISABLED by default (changed from ADR-025 for local development ease) +/// When auth.enabled=false, JWT secret is not required +#[test] +#[serial] +fn test_auth_disabled_by_default_loads_without_jwt_secret() { + // Ensure clean state - remove any auth env vars from previous tests + remove_env("MCP__AUTH__ENABLED"); + remove_env("MCP__AUTH__JWT__SECRET"); + + // Load config without any env vars set - should SUCCEED because auth is disabled by default + let result = ConfigLoader::new().load(); + + // Config should load successfully because auth.enabled=false by default + // No JWT secret is required when auth is disabled + assert!( + result.is_ok(), + "Config should load when auth.enabled=false (default), got error: {:?}", + result.err() + ); +} diff --git a/crates/mcb-language-support/Cargo.toml b/crates/mcb-language-support/Cargo.toml new file mode 100644 index 000000000..16a1a95b6 --- /dev/null +++ b/crates/mcb-language-support/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "mcb-language-support" +description = "Unified language abstraction for MCP Context Browser" +homepage.workspace = true +authors.workspace = true +repository.workspace = true +license.workspace = true +version.workspace = true +edition.workspace = true +rust-version.workspace = true + +[lints] +workspace = true + +[dependencies] +# Mozilla Rust Code Analysis (fork with tree-sitter 0.26.3 + Kotlin) +rust-code-analysis.workspace = true + +# Error handling +thiserror.workspace = true + +# Async runtime +tokio.workspace = true +async-trait.workspace = true + +# Serialization (for LanguageId) +serde = { workspace = true, features = ["derive"] } + +[dev-dependencies] +tempfile.workspace = true +rstest = { workspace = true } +mockall = { workspace = true } +insta = { workspace = true } diff --git a/crates/mcb-providers/src/database/sqlite/issue_entity_repository.rs b/crates/mcb-providers/src/database/sqlite/issue_entity_repository.rs new file mode 100644 index 000000000..f4aa1397c --- /dev/null +++ b/crates/mcb-providers/src/database/sqlite/issue_entity_repository.rs @@ -0,0 +1,361 @@ +use std::sync::Arc; + +use async_trait::async_trait; +use mcb_domain::entities::issue::{IssueComment, IssueLabel, IssueLabelAssignment}; +use mcb_domain::entities::project::ProjectIssue; +use mcb_domain::error::{Error, Result}; +use mcb_domain::ports::infrastructure::database::{DatabaseExecutor, SqlParam, SqlRow}; +use mcb_domain::ports::repositories::IssueEntityRepository; + +/// SQLite-backed repository for issue, comment, and label entities. +pub struct SqliteIssueEntityRepository { + executor: Arc, +} + +impl SqliteIssueEntityRepository { + /// Creates a new instance with the given database executor. + pub fn new(executor: Arc) -> Self { + Self { executor } + } + + async fn query_one(&self, sql: &str, params: &[SqlParam], convert: F) -> Result> + where + F: FnOnce(&dyn SqlRow) -> Result, + { + match self.executor.query_one(sql, params).await? { + Some(r) => Ok(Some(convert(r.as_ref())?)), + None => Ok(None), + } + } + + async fn query_all(&self, sql: &str, params: &[SqlParam], convert: F) -> Result> + where + F: Fn(&dyn SqlRow) -> Result, + { + let rows = self.executor.query_all(sql, params).await?; + let mut result = Vec::with_capacity(rows.len()); + for row in rows { + result.push( + convert(row.as_ref()) + .map_err(|e| Error::memory_with_source("decode issue entity", e))?, + ); + } + Ok(result) + } +} + +fn row_to_issue(row: &dyn SqlRow) -> Result { + let labels_json = req_str(row, "labels")?; + let labels = serde_json::from_str::>(&labels_json) + .map_err(|e| Error::memory_with_source("decode labels json", e))?; + + Ok(ProjectIssue { + id: req_str(row, "id")?, + org_id: req_str(row, "org_id")?, + project_id: req_str(row, "project_id")?, + created_by: req_str(row, "created_by")?, + phase_id: opt_str(row, "phase_id")?, + title: req_str(row, "title")?, + description: req_str(row, "description")?, + issue_type: req_str(row, "issue_type")? + .parse() + .map_err(|e: String| Error::memory(e))?, + status: req_str(row, "status")? + .parse() + .map_err(|e: String| Error::memory(e))?, + priority: req_i64(row, "priority")? as i32, + assignee: opt_str(row, "assignee")?, + labels, + estimated_minutes: opt_i64(row, "estimated_minutes")?, + actual_minutes: opt_i64(row, "actual_minutes")?, + notes: req_str(row, "notes")?, + design: req_str(row, "design")?, + parent_issue_id: opt_str(row, "parent_issue_id")?, + created_at: req_i64(row, "created_at")?, + updated_at: req_i64(row, "updated_at")?, + closed_at: opt_i64(row, "closed_at")?, + closed_reason: req_str(row, "closed_reason")?, + }) +} + +fn row_to_comment(row: &dyn SqlRow) -> Result { + Ok(IssueComment { + id: req_str(row, "id")?, + issue_id: req_str(row, "issue_id")?, + author_id: req_str(row, "author_id")?, + content: req_str(row, "content")?, + created_at: req_i64(row, "created_at")?, + }) +} + +fn row_to_label(row: &dyn SqlRow) -> Result { + Ok(IssueLabel { + id: req_str(row, "id")?, + org_id: req_str(row, "org_id")?, + project_id: req_str(row, "project_id")?, + name: req_str(row, "name")?, + color: req_str(row, "color")?, + created_at: req_i64(row, "created_at")?, + }) +} + +fn req_str(row: &dyn SqlRow, col: &str) -> Result { + row.try_get_string(col)? + .ok_or_else(|| Error::memory(format!("Missing {col}"))) +} + +fn req_i64(row: &dyn SqlRow, col: &str) -> Result { + row.try_get_i64(col)? + .ok_or_else(|| Error::memory(format!("Missing {col}"))) +} + +fn opt_str(row: &dyn SqlRow, col: &str) -> Result> { + row.try_get_string(col) +} + +fn opt_i64(row: &dyn SqlRow, col: &str) -> Result> { + row.try_get_i64(col) +} + +fn opt_str_param(value: &Option) -> SqlParam { + match value { + Some(v) => SqlParam::String(v.clone()), + None => SqlParam::Null, + } +} + +fn opt_i64_param(value: Option) -> SqlParam { + match value { + Some(v) => SqlParam::I64(v), + None => SqlParam::Null, + } +} + +#[async_trait] +impl IssueEntityRepository for SqliteIssueEntityRepository { + async fn create_issue(&self, issue: &ProjectIssue) -> Result<()> { + let labels = serde_json::to_string(&issue.labels) + .map_err(|e| Error::memory_with_source("encode labels json", e))?; + self.executor + .execute( + "INSERT INTO project_issues (id, org_id, project_id, phase_id, title, description, issue_type, status, priority, assignee, labels, created_at, updated_at, closed_at, created_by, estimated_minutes, actual_minutes, notes, design, parent_issue_id, closed_reason) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + &[ + SqlParam::String(issue.id.clone()), + SqlParam::String(issue.org_id.clone()), + SqlParam::String(issue.project_id.clone()), + opt_str_param(&issue.phase_id), + SqlParam::String(issue.title.clone()), + SqlParam::String(issue.description.clone()), + SqlParam::String(issue.issue_type.as_str().to_string()), + SqlParam::String(issue.status.as_str().to_string()), + SqlParam::I64(i64::from(issue.priority)), + opt_str_param(&issue.assignee), + SqlParam::String(labels), + SqlParam::I64(issue.created_at), + SqlParam::I64(issue.updated_at), + opt_i64_param(issue.closed_at), + SqlParam::String(issue.created_by.clone()), + opt_i64_param(issue.estimated_minutes), + opt_i64_param(issue.actual_minutes), + SqlParam::String(issue.notes.clone()), + SqlParam::String(issue.design.clone()), + opt_str_param(&issue.parent_issue_id), + SqlParam::String(issue.closed_reason.clone()), + ], + ) + .await + } + + async fn get_issue(&self, org_id: &str, id: &str) -> Result { + self.query_one( + "SELECT * FROM project_issues WHERE org_id = ? AND id = ?", + &[ + SqlParam::String(org_id.to_string()), + SqlParam::String(id.to_string()), + ], + row_to_issue, + ) + .await? + .ok_or_else(|| Error::not_found(format!("Issue {id}"))) + } + + async fn list_issues(&self, org_id: &str, project_id: &str) -> Result> { + self.query_all( + "SELECT * FROM project_issues WHERE org_id = ? AND project_id = ?", + &[ + SqlParam::String(org_id.to_string()), + SqlParam::String(project_id.to_string()), + ], + row_to_issue, + ) + .await + } + + async fn update_issue(&self, issue: &ProjectIssue) -> Result<()> { + let labels = serde_json::to_string(&issue.labels) + .map_err(|e| Error::memory_with_source("encode labels json", e))?; + self.executor + .execute( + "UPDATE project_issues SET project_id = ?, phase_id = ?, title = ?, description = ?, issue_type = ?, status = ?, priority = ?, assignee = ?, labels = ?, updated_at = ?, closed_at = ?, created_by = ?, estimated_minutes = ?, actual_minutes = ?, notes = ?, design = ?, parent_issue_id = ?, closed_reason = ? WHERE org_id = ? AND id = ?", + &[ + SqlParam::String(issue.project_id.clone()), + opt_str_param(&issue.phase_id), + SqlParam::String(issue.title.clone()), + SqlParam::String(issue.description.clone()), + SqlParam::String(issue.issue_type.as_str().to_string()), + SqlParam::String(issue.status.as_str().to_string()), + SqlParam::I64(i64::from(issue.priority)), + opt_str_param(&issue.assignee), + SqlParam::String(labels), + SqlParam::I64(issue.updated_at), + opt_i64_param(issue.closed_at), + SqlParam::String(issue.created_by.clone()), + opt_i64_param(issue.estimated_minutes), + opt_i64_param(issue.actual_minutes), + SqlParam::String(issue.notes.clone()), + SqlParam::String(issue.design.clone()), + opt_str_param(&issue.parent_issue_id), + SqlParam::String(issue.closed_reason.clone()), + SqlParam::String(issue.org_id.clone()), + SqlParam::String(issue.id.clone()), + ], + ) + .await + } + + async fn delete_issue(&self, org_id: &str, id: &str) -> Result<()> { + self.executor + .execute( + "DELETE FROM project_issues WHERE org_id = ? AND id = ?", + &[ + SqlParam::String(org_id.to_string()), + SqlParam::String(id.to_string()), + ], + ) + .await + } + + async fn create_comment(&self, comment: &IssueComment) -> Result<()> { + self.executor + .execute( + "INSERT INTO issue_comments (id, issue_id, author_id, content, created_at) VALUES (?, ?, ?, ?, ?)", + &[ + SqlParam::String(comment.id.clone()), + SqlParam::String(comment.issue_id.clone()), + SqlParam::String(comment.author_id.clone()), + SqlParam::String(comment.content.clone()), + SqlParam::I64(comment.created_at), + ], + ) + .await + } + + async fn get_comment(&self, id: &str) -> Result { + self.query_one( + "SELECT * FROM issue_comments WHERE id = ?", + &[SqlParam::String(id.to_string())], + row_to_comment, + ) + .await? + .ok_or_else(|| Error::not_found(format!("IssueComment {id}"))) + } + + async fn list_comments_by_issue(&self, issue_id: &str) -> Result> { + self.query_all( + "SELECT * FROM issue_comments WHERE issue_id = ?", + &[SqlParam::String(issue_id.to_string())], + row_to_comment, + ) + .await + } + + async fn delete_comment(&self, id: &str) -> Result<()> { + self.executor + .execute( + "DELETE FROM issue_comments WHERE id = ?", + &[SqlParam::String(id.to_string())], + ) + .await + } + + async fn create_label(&self, label: &IssueLabel) -> Result<()> { + self.executor + .execute( + "INSERT INTO issue_labels (id, org_id, project_id, name, color, created_at) VALUES (?, ?, ?, ?, ?, ?)", + &[ + SqlParam::String(label.id.clone()), + SqlParam::String(label.org_id.clone()), + SqlParam::String(label.project_id.clone()), + SqlParam::String(label.name.clone()), + SqlParam::String(label.color.clone()), + SqlParam::I64(label.created_at), + ], + ) + .await + } + + async fn get_label(&self, id: &str) -> Result { + self.query_one( + "SELECT * FROM issue_labels WHERE id = ?", + &[SqlParam::String(id.to_string())], + row_to_label, + ) + .await? + .ok_or_else(|| Error::not_found(format!("IssueLabel {id}"))) + } + + async fn list_labels(&self, org_id: &str, project_id: &str) -> Result> { + self.query_all( + "SELECT * FROM issue_labels WHERE org_id = ? AND project_id = ?", + &[ + SqlParam::String(org_id.to_string()), + SqlParam::String(project_id.to_string()), + ], + row_to_label, + ) + .await + } + + async fn delete_label(&self, id: &str) -> Result<()> { + self.executor + .execute( + "DELETE FROM issue_labels WHERE id = ?", + &[SqlParam::String(id.to_string())], + ) + .await + } + + async fn assign_label(&self, assignment: &IssueLabelAssignment) -> Result<()> { + self.executor + .execute( + "INSERT INTO issue_label_assignments (issue_id, label_id, created_at) VALUES (?, ?, ?)", + &[ + SqlParam::String(assignment.issue_id.clone()), + SqlParam::String(assignment.label_id.clone()), + SqlParam::I64(assignment.created_at), + ], + ) + .await + } + + async fn unassign_label(&self, issue_id: &str, label_id: &str) -> Result<()> { + self.executor + .execute( + "DELETE FROM issue_label_assignments WHERE issue_id = ? AND label_id = ?", + &[ + SqlParam::String(issue_id.to_string()), + SqlParam::String(label_id.to_string()), + ], + ) + .await + } + + async fn list_labels_for_issue(&self, issue_id: &str) -> Result> { + self.query_all( + "SELECT l.* FROM issue_labels l INNER JOIN issue_label_assignments a ON a.label_id = l.id WHERE a.issue_id = ?", + &[SqlParam::String(issue_id.to_string())], + row_to_label, + ) + .await + } +} diff --git a/crates/mcb-providers/src/database/sqlite/mod.rs b/crates/mcb-providers/src/database/sqlite/mod.rs new file mode 100644 index 000000000..69e454b71 --- /dev/null +++ b/crates/mcb-providers/src/database/sqlite/mod.rs @@ -0,0 +1,33 @@ +//! SQLite backend for the memory and full project schema. +//! +//! Implements [`MemorySchemaDdlGenerator`](mcb_domain::MemorySchemaDdlGenerator) (memory subset) +//! and [`SchemaDdlGenerator`](mcb_domain::schema::SchemaDdlGenerator) (full project: collections, +//! observations, session_summaries, file_hashes) for SQLite. +//! Provides [`SqliteExecutor`] (port [`DatabaseExecutor`]), [`SqliteMemoryRepository`] +//! (port [`MemoryRepository`]), and factory functions for DI. + +mod agent_repository; +mod ddl; +pub(crate) mod ensure_parent; +pub mod executor; +/// SQLite-backed issue entity repository implementation. +pub mod issue_entity_repository; +mod memory_repository; +/// SQLite-backed organization entity repository implementation. +pub mod org_entity_repository; +mod plan_entity_repository; +mod project_repository; +mod provider; +mod row_convert; +mod vcs_entity_repository; + +pub use agent_repository::SqliteAgentRepository; +pub use ddl::{SqliteMemoryDdlGenerator, SqliteSchemaDdlGenerator}; +pub use executor::SqliteExecutor; +pub use issue_entity_repository::SqliteIssueEntityRepository; +pub use memory_repository::SqliteMemoryRepository; +pub use org_entity_repository::SqliteOrgEntityRepository; +pub use plan_entity_repository::SqlitePlanEntityRepository; +pub use project_repository::SqliteProjectRepository; +pub use provider::*; +pub use vcs_entity_repository::SqliteVcsEntityRepository; diff --git a/crates/mcb-server/Cargo.toml b/crates/mcb-server/Cargo.toml index ea61e1712..93da2571c 100644 --- a/crates/mcb-server/Cargo.toml +++ b/crates/mcb-server/Cargo.toml @@ -31,7 +31,10 @@ workspace = true [dependencies] # Domain layer - core contracts and types mcb-domain = { path = "../mcb-domain" } -mcb-utils = { path = "../mcb-utils" } +# Application layer - use cases and business logic +mcb-application = { path = "../mcb-application" } +# Infrastructure layer - configuration and DI +mcb-infrastructure = { path = "../mcb-infrastructure" } # Core async runtime tokio = { workspace = true } @@ -40,7 +43,6 @@ async-trait = { workspace = true } # Serialization serde = { workspace = true } serde_json = { workspace = true } -serde_with = { workspace = true } toml = { workspace = true } # Date/time @@ -57,10 +59,10 @@ tracing-subscriber = { workspace = true } # CLI clap = { workspace = true } -# HTTP server (Axum) -axum = { workspace = true } -tower-http = { workspace = true } +# HTTP server - migrated from Axum to Rocket in v0.1.2 (ADR-026) +rocket = { workspace = true } walkdir = { workspace = true } +normpath = { workspace = true } # HTTP client - for client mode connecting to remote server reqwest = { workspace = true } @@ -68,6 +70,11 @@ reqwest = { workspace = true } # MCP SDK rmcp = { workspace = true } +# Template engines +handlebars = { workspace = true } + +# Markdown processing +pulldown-cmark = { workspace = true } # Authentication # jsonwebtoken removed - unused dependency (RUSTSEC-2023-0071) @@ -75,8 +82,8 @@ bcrypt = { workspace = true } argon2 = { workspace = true } base64 = { workspace = true } -# Hostname detection -hostname = { workspace = true } +# System metrics +sysinfo = { workspace = true } # Utilities uuid = { workspace = true } @@ -96,47 +103,20 @@ sha2 = { workspace = true } # Configuration watching notify = { workspace = true } +# Directory paths +dirs = { workspace = true } + # Async streaming for HTTP SSE futures = { workspace = true } async-stream = { workspace = true } -# Plugin registration -linkme = { workspace = true } - -# SeaQL + Loco ecosystem (v0.3.0) -loco-rs = { workspace = true } -seaography = { workspace = true } -sea-orm = { workspace = true } -sea-orm-pro = { workspace = true } -async-graphql = { workspace = true } -async-graphql-axum = { workspace = true } +# Providers - MUST be in dependencies for linkme inventory registration +mcb-providers = { path = "../mcb-providers" } [dev-dependencies] tempfile = { workspace = true } fastembed = { workspace = true } rstest = { workspace = true } -serial_test = { workspace = true } mockall = { workspace = true } insta = { workspace = true } -tower = { workspace = true } -http-body-util = { workspace = true } mcb-domain = { path = "../mcb-domain", features = ["test-utils"] } -mcb-utils = { path = "../mcb-utils" } -mcb-providers = { path = "../mcb-providers" } -mcb-infrastructure = { path = "../mcb-infrastructure" } -mcb-validate = { path = "../mcb-validate" } -[[test]] -name = "unit" -path = "tests/unit/mod.rs" - -[[test]] -name = "integration" -path = "tests/integration/mod.rs" - -[[test]] -name = "e2e" -path = "tests/e2e/mod.rs" - -[[test]] -name = "contract" -path = "tests/contract/mod.rs" diff --git a/crates/mcb-server/src/admin/crud_adapter.rs b/crates/mcb-server/src/admin/crud_adapter.rs new file mode 100644 index 000000000..89083f07f --- /dev/null +++ b/crates/mcb-server/src/admin/crud_adapter.rs @@ -0,0 +1,789 @@ +//! Generic CRUD adapter that bridges entity handlers with domain services. +//! +//! Each entity slug maps to an adapter implementation that knows how to +//! call the correct service methods and serialize results to JSON. + +use std::collections::HashSet; +use std::sync::Arc; + +use async_trait::async_trait; +use mcb_domain::constants::keys::DEFAULT_ORG_ID; +use mcb_domain::entities::{ + AgentWorktreeAssignment, ApiKey, Branch, IssueComment, IssueLabel, IssueLabelAssignment, + Organization, Plan, PlanReview, PlanVersion, ProjectIssue, Repository, Team, TeamMember, User, + Worktree, +}; +use mcb_domain::ports::repositories::{ + IssueEntityRepository, OrgEntityRepository, PlanEntityRepository, VcsEntityRepository, +}; +use serde_json::Value; + +use super::handlers::AdminState; +use super::web::filter::{ + FilterParams, FilteredResult, SortOrder, parse_iso_date_to_epoch, parse_iso_date_to_epoch_end, +}; + +/// Async CRUD operations that map entity slugs to domain service calls. +#[async_trait] +pub trait EntityCrudAdapter: Send + Sync { + /// List all records for this entity. + async fn list_all(&self) -> Result, String>; + /// Get a single record by its primary key. + async fn get_by_id(&self, id: &str) -> Result; + /// Create a record from raw JSON form data. + async fn create_from_json(&self, data: Value) -> Result; + /// Update a record from raw JSON form data. + async fn update_from_json(&self, data: Value) -> Result<(), String>; + /// Delete a record by its primary key. + async fn delete_by_id(&self, id: &str) -> Result<(), String>; + + /// List records with in-memory filtering, sorting, and pagination. + /// + /// The default implementation fetches all records via [`list_all`](Self::list_all), + /// then applies search, date-range, sort, and pagination in memory. + /// `valid_sort_fields` restricts which field names are accepted for sorting; + /// an unrecognised sort field is silently ignored (no sort applied). + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = self.list_all().await?; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } +} + +/// Resolves a CRUD adapter for the given entity slug from AdminState. +pub fn resolve_adapter(slug: &str, state: &AdminState) -> Option> { + match slug { + "organizations" => state + .org_entity + .as_ref() + .map(|s| Box::new(OrgAdapter(Arc::clone(s))) as Box), + "users" => state + .org_entity + .as_ref() + .map(|s| Box::new(UserAdapter(Arc::clone(s))) as Box), + "teams" => state + .org_entity + .as_ref() + .map(|s| Box::new(TeamAdapter(Arc::clone(s))) as Box), + "team-members" => state + .org_entity + .as_ref() + .map(|s| Box::new(TeamMemberAdapter(Arc::clone(s))) as Box), + "api-keys" => state + .org_entity + .as_ref() + .map(|s| Box::new(ApiKeyAdapter(Arc::clone(s))) as Box), + "project-issues" => state + .issue_entity + .as_ref() + .map(|s| Box::new(ProjectIssueAdapter(Arc::clone(s))) as Box), + "issue-comments" => state + .issue_entity + .as_ref() + .map(|s| Box::new(IssueCommentAdapter(Arc::clone(s))) as Box), + "issue-labels" => state + .issue_entity + .as_ref() + .map(|s| Box::new(IssueLabelAdapter(Arc::clone(s))) as Box), + "issue-label-assignments" => state.issue_entity.as_ref().map(|s| { + Box::new(IssueLabelAssignmentAdapter(Arc::clone(s))) as Box + }), + "plans" => state + .plan_entity + .as_ref() + .map(|s| Box::new(PlanAdapter(Arc::clone(s))) as Box), + "plan-versions" => state + .plan_entity + .as_ref() + .map(|s| Box::new(PlanVersionAdapter(Arc::clone(s))) as Box), + "plan-reviews" => state + .plan_entity + .as_ref() + .map(|s| Box::new(PlanReviewAdapter(Arc::clone(s))) as Box), + "repositories" => state + .vcs_entity + .as_ref() + .map(|s| Box::new(RepositoryAdapter(Arc::clone(s))) as Box), + "branches" => state + .vcs_entity + .as_ref() + .map(|s| Box::new(BranchAdapter(Arc::clone(s))) as Box), + "worktrees" => state + .vcs_entity + .as_ref() + .map(|s| Box::new(WorktreeAdapter(Arc::clone(s))) as Box), + "agent-worktree-assignments" => state.vcs_entity.as_ref().map(|s| { + Box::new(AgentWorktreeAssignmentAdapter(Arc::clone(s))) as Box + }), + _ => None, + } +} + +fn to_json(val: &T) -> Result { + serde_json::to_value(val).map_err(|e| e.to_string()) +} + +fn to_json_vec(vals: &[T]) -> Result, String> { + vals.iter().map(|v| to_json(v)).collect() +} + +fn from_json(data: Value) -> Result { + serde_json::from_value(data).map_err(|e| format!("Invalid data: {e}")) +} + +fn map_err(e: mcb_domain::error::Error) -> String { + e.to_string() +} + +/// Generates a CRUD adapter struct wrapping a repository trait object. +macro_rules! impl_crud_adapter { + ($name:ident($repo_ty:ty) { $($methods:item)* }) => { + struct $name(Arc<$repo_ty>); + + #[async_trait] + impl EntityCrudAdapter for $name { + $($methods)* + } + }; +} + +fn json_sort_key(v: &Value) -> String { + match v { + Value::String(s) => s.to_lowercase(), + Value::Number(n) => format!("{:020}", n.as_f64().unwrap_or(0.0)), + Value::Bool(b) => format!("{b}"), + Value::Null => String::new(), + other => other.to_string(), + } +} + +/// Apply in-memory filtering, sorting, and pagination to a pre-fetched record list. +/// +/// Shared by the default `list_filtered()` trait method and by dependent-entity +/// adapters that override `list_filtered()` to first fetch scoped records via +/// a parent-context repository method. +fn apply_filter_pipeline( + mut records: Vec, + params: &FilterParams, + valid_sort_fields: &HashSet, +) -> FilteredResult { + // Search + if let Some(q) = params.search.as_ref().filter(|q| !q.is_empty()) { + let q_lower = q.to_lowercase(); + records.retain(|rec| { + if let Value::Object(map) = rec { + map.values().any(|v| match v { + Value::String(s) => s.to_lowercase().contains(&q_lower), + _ => v.to_string().to_lowercase().contains(&q_lower), + }) + } else { + false + } + }); + } + + // Date-range filter — parse ISO strings to epoch for comparison + let epoch_from = params.date_from.as_deref().and_then(|s| { + if s.is_empty() { + None + } else { + parse_iso_date_to_epoch(s) + } + }); + let epoch_to = params.date_to.as_deref().and_then(|s| { + if s.is_empty() { + None + } else { + parse_iso_date_to_epoch_end(s) + } + }); + + if epoch_from.is_some() || epoch_to.is_some() { + records.retain(|rec| { + if let Value::Object(map) = rec { + map.iter() + .filter(|(k, _)| k.ends_with("_at")) + .any(|(_, v)| { + let ts = match v { + Value::Number(n) => n.as_i64(), + _ => None, + }; + if let Some(ts) = ts { + let after = epoch_from.is_none_or(|from| ts >= from); + let before = epoch_to.is_none_or(|to| ts <= to); + after && before + } else { + true + } + }) + } else { + true + } + }); + } + + // Sort + if let Some(ref field) = params + .sort_field + .as_ref() + .filter(|f| valid_sort_fields.contains(f.as_str())) + { + let desc = matches!(params.sort_order, Some(SortOrder::Desc)); + records.sort_by(|a, b| { + let va = a.get(field).map(json_sort_key); + let vb = b.get(field).map(json_sort_key); + let cmp = va.cmp(&vb); + if desc { cmp.reverse() } else { cmp } + }); + } + + // Paginate + let total_count = records.len(); + let per_page = if params.per_page == 0 { + 20 + } else { + params.per_page + }; + let total_pages = if total_count == 0 { + 0 + } else { + total_count.div_ceil(per_page) + }; + let page = if params.page == 0 { 1 } else { params.page }; + let start = (page - 1) * per_page; + let page_records = if start >= total_count { + Vec::new() + } else { + let end = (start + per_page).min(total_count); + records[start..end].to_vec() + }; + + FilteredResult { + records: page_records, + total_count, + page, + per_page, + total_pages, + } +} + +// ─── Org group ─────────────────────────────────────────────────────── + +impl_crud_adapter!(OrgAdapter(dyn OrgEntityRepository) { + async fn list_all(&self) -> Result, String> { + let orgs = self.0.list_orgs().await.map_err(map_err)?; + to_json_vec(&orgs) + } + async fn get_by_id(&self, id: &str) -> Result { + let org = self.0.get_org(id).await.map_err(map_err)?; + to_json(&org) + } + async fn create_from_json(&self, data: Value) -> Result { + let org: Organization = from_json(data)?; + self.0.create_org(&org).await.map_err(map_err)?; + to_json(&org) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let org: Organization = from_json(data)?; + self.0.update_org(&org).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_org(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(UserAdapter(dyn OrgEntityRepository) { + async fn list_all(&self) -> Result, String> { + let users = self.0.list_users(DEFAULT_ORG_ID).await.map_err(map_err)?; + to_json_vec(&users) + } + async fn get_by_id(&self, id: &str) -> Result { + let user = self.0.get_user(id).await.map_err(map_err)?; + to_json(&user) + } + async fn create_from_json(&self, data: Value) -> Result { + let user: User = from_json(data)?; + self.0.create_user(&user).await.map_err(map_err)?; + to_json(&user) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let user: User = from_json(data)?; + self.0.update_user(&user).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_user(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(TeamAdapter(dyn OrgEntityRepository) { + async fn list_all(&self) -> Result, String> { + let teams = self.0.list_teams(DEFAULT_ORG_ID).await.map_err(map_err)?; + to_json_vec(&teams) + } + async fn get_by_id(&self, id: &str) -> Result { + let team = self.0.get_team(id).await.map_err(map_err)?; + to_json(&team) + } + async fn create_from_json(&self, data: Value) -> Result { + let team: Team = from_json(data)?; + self.0.create_team(&team).await.map_err(map_err)?; + to_json(&team) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("Team update not supported via repository interface".to_string()) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_team(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(TeamMemberAdapter(dyn OrgEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("team_id"), Some(pid)) => { + let items = self.0.list_team_members(pid).await.map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, _id: &str) -> Result { + Err("TeamMember get requires team_id context".to_string()) + } + async fn create_from_json(&self, data: Value) -> Result { + let member: TeamMember = from_json(data)?; + self.0.add_team_member(&member).await.map_err(map_err)?; + to_json(&member) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("TeamMember update not supported".to_string()) + } + async fn delete_by_id(&self, _id: &str) -> Result<(), String> { + Err("TeamMember delete requires team_id and user_id".to_string()) + } +}); + +impl_crud_adapter!(ApiKeyAdapter(dyn OrgEntityRepository) { + async fn list_all(&self) -> Result, String> { + let keys = self + .0 + .list_api_keys(DEFAULT_ORG_ID) + .await + .map_err(map_err)?; + to_json_vec(&keys) + } + async fn get_by_id(&self, id: &str) -> Result { + let key = self.0.get_api_key(id).await.map_err(map_err)?; + to_json(&key) + } + async fn create_from_json(&self, data: Value) -> Result { + let key: ApiKey = from_json(data)?; + self.0.create_api_key(&key).await.map_err(map_err)?; + to_json(&key) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("ApiKey update not supported — revoke and recreate".to_string()) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_api_key(id).await.map_err(map_err) + } +}); + +// ─── Issue group ───────────────────────────────────────────────────── + +impl_crud_adapter!(ProjectIssueAdapter(dyn IssueEntityRepository) { + async fn list_all(&self) -> Result, String> { + let issues = self + .0 + .list_issues(DEFAULT_ORG_ID, "") + .await + .map_err(map_err)?; + to_json_vec(&issues) + } + async fn get_by_id(&self, id: &str) -> Result { + let issue = self + .0 + .get_issue(DEFAULT_ORG_ID, id) + .await + .map_err(map_err)?; + to_json(&issue) + } + async fn create_from_json(&self, data: Value) -> Result { + let issue: ProjectIssue = from_json(data)?; + self.0.create_issue(&issue).await.map_err(map_err)?; + to_json(&issue) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let issue: ProjectIssue = from_json(data)?; + self.0.update_issue(&issue).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0 + .delete_issue(DEFAULT_ORG_ID, id) + .await + .map_err(map_err) + } +}); + +impl_crud_adapter!(IssueCommentAdapter(dyn IssueEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("issue_id"), Some(pid)) => { + let items = self.0.list_comments_by_issue(pid).await.map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, id: &str) -> Result { + let c = self.0.get_comment(id).await.map_err(map_err)?; + to_json(&c) + } + async fn create_from_json(&self, data: Value) -> Result { + let c: IssueComment = from_json(data)?; + self.0.create_comment(&c).await.map_err(map_err)?; + to_json(&c) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("IssueComment update not supported".to_string()) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_comment(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(IssueLabelAdapter(dyn IssueEntityRepository) { + async fn list_all(&self) -> Result, String> { + let labels = self + .0 + .list_labels(DEFAULT_ORG_ID, "") + .await + .map_err(map_err)?; + to_json_vec(&labels) + } + async fn get_by_id(&self, id: &str) -> Result { + let l = self.0.get_label(id).await.map_err(map_err)?; + to_json(&l) + } + async fn create_from_json(&self, data: Value) -> Result { + let l: IssueLabel = from_json(data)?; + self.0.create_label(&l).await.map_err(map_err)?; + to_json(&l) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("IssueLabel update not supported".to_string()) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_label(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(IssueLabelAssignmentAdapter(dyn IssueEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("issue_id"), Some(pid)) => { + let items = self.0.list_labels_for_issue(pid).await.map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, _id: &str) -> Result { + Err("IssueLabelAssignment has composite key".to_string()) + } + async fn create_from_json(&self, data: Value) -> Result { + let a: IssueLabelAssignment = from_json(data)?; + self.0.assign_label(&a).await.map_err(map_err)?; + to_json(&a) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("IssueLabelAssignment update not supported".to_string()) + } + async fn delete_by_id(&self, _id: &str) -> Result<(), String> { + Err("IssueLabelAssignment delete requires issue_id and label_id".to_string()) + } +}); + +// ─── Plan group ────────────────────────────────────────────────────── + +impl_crud_adapter!(PlanAdapter(dyn PlanEntityRepository) { + async fn list_all(&self) -> Result, String> { + let plans = self + .0 + .list_plans(DEFAULT_ORG_ID, "") + .await + .map_err(map_err)?; + to_json_vec(&plans) + } + async fn get_by_id(&self, id: &str) -> Result { + let plan = self.0.get_plan(DEFAULT_ORG_ID, id).await.map_err(map_err)?; + to_json(&plan) + } + async fn create_from_json(&self, data: Value) -> Result { + let plan: Plan = from_json(data)?; + self.0.create_plan(&plan).await.map_err(map_err)?; + to_json(&plan) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let plan: Plan = from_json(data)?; + self.0.update_plan(&plan).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0 + .delete_plan(DEFAULT_ORG_ID, id) + .await + .map_err(map_err) + } +}); + +impl_crud_adapter!(PlanVersionAdapter(dyn PlanEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("plan_id"), Some(pid)) => { + let items = self + .0 + .list_plan_versions_by_plan(pid) + .await + .map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, id: &str) -> Result { + let v = self.0.get_plan_version(id).await.map_err(map_err)?; + to_json(&v) + } + async fn create_from_json(&self, data: Value) -> Result { + let v: PlanVersion = from_json(data)?; + self.0.create_plan_version(&v).await.map_err(map_err)?; + to_json(&v) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("PlanVersion is immutable".to_string()) + } + async fn delete_by_id(&self, _id: &str) -> Result<(), String> { + Err("PlanVersion delete not supported".to_string()) + } +}); + +impl_crud_adapter!(PlanReviewAdapter(dyn PlanEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("plan_version_id"), Some(pid)) => { + let items = self + .0 + .list_plan_reviews_by_version(pid) + .await + .map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, id: &str) -> Result { + let r = self.0.get_plan_review(id).await.map_err(map_err)?; + to_json(&r) + } + async fn create_from_json(&self, data: Value) -> Result { + let r: PlanReview = from_json(data)?; + self.0.create_plan_review(&r).await.map_err(map_err)?; + to_json(&r) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("PlanReview is immutable".to_string()) + } + async fn delete_by_id(&self, _id: &str) -> Result<(), String> { + Err("PlanReview delete not supported".to_string()) + } +}); + +// ─── VCS group ─────────────────────────────────────────────────────── + +impl_crud_adapter!(RepositoryAdapter(dyn VcsEntityRepository) { + async fn list_all(&self) -> Result, String> { + let repos = self + .0 + .list_repositories(DEFAULT_ORG_ID, "") + .await + .map_err(map_err)?; + to_json_vec(&repos) + } + async fn get_by_id(&self, id: &str) -> Result { + let r = self + .0 + .get_repository(DEFAULT_ORG_ID, id) + .await + .map_err(map_err)?; + to_json(&r) + } + async fn create_from_json(&self, data: Value) -> Result { + let r: Repository = from_json(data)?; + self.0.create_repository(&r).await.map_err(map_err)?; + to_json(&r) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let r: Repository = from_json(data)?; + self.0.update_repository(&r).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0 + .delete_repository(DEFAULT_ORG_ID, id) + .await + .map_err(map_err) + } +}); + +impl_crud_adapter!(BranchAdapter(dyn VcsEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("repository_id"), Some(pid)) => { + let items = self.0.list_branches(pid).await.map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, id: &str) -> Result { + let b = self.0.get_branch(id).await.map_err(map_err)?; + to_json(&b) + } + async fn create_from_json(&self, data: Value) -> Result { + let b: Branch = from_json(data)?; + self.0.create_branch(&b).await.map_err(map_err)?; + to_json(&b) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let b: Branch = from_json(data)?; + self.0.update_branch(&b).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_branch(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(WorktreeAdapter(dyn VcsEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("repository_id"), Some(pid)) => { + let items = self.0.list_worktrees(pid).await.map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, id: &str) -> Result { + let w = self.0.get_worktree(id).await.map_err(map_err)?; + to_json(&w) + } + async fn create_from_json(&self, data: Value) -> Result { + let w: Worktree = from_json(data)?; + self.0.create_worktree(&w).await.map_err(map_err)?; + to_json(&w) + } + async fn update_from_json(&self, data: Value) -> Result<(), String> { + let w: Worktree = from_json(data)?; + self.0.update_worktree(&w).await.map_err(map_err) + } + async fn delete_by_id(&self, id: &str) -> Result<(), String> { + self.0.delete_worktree(id).await.map_err(map_err) + } +}); + +impl_crud_adapter!(AgentWorktreeAssignmentAdapter(dyn VcsEntityRepository) { + async fn list_all(&self) -> Result, String> { + Ok(Vec::new()) + } + async fn list_filtered( + &self, + params: &FilterParams, + valid_sort_fields: &HashSet, + ) -> Result { + let records = match (params.parent_field.as_deref(), params.parent_id.as_deref()) { + (Some("worktree_id"), Some(pid)) => { + let items = self + .0 + .list_assignments_by_worktree(pid) + .await + .map_err(map_err)?; + to_json_vec(&items)? + } + _ => self.list_all().await?, + }; + Ok(apply_filter_pipeline(records, params, valid_sort_fields)) + } + async fn get_by_id(&self, id: &str) -> Result { + let a = self.0.get_assignment(id).await.map_err(map_err)?; + to_json(&a) + } + async fn create_from_json(&self, data: Value) -> Result { + let a: AgentWorktreeAssignment = from_json(data)?; + self.0.create_assignment(&a).await.map_err(map_err)?; + to_json(&a) + } + async fn update_from_json(&self, _data: Value) -> Result<(), String> { + Err("AgentWorktreeAssignment update not supported — release instead".to_string()) + } + async fn delete_by_id(&self, _id: &str) -> Result<(), String> { + Err("AgentWorktreeAssignment delete not supported — release instead".to_string()) + } +}); diff --git a/crates/mcb-validate/tests/test_utils.rs b/crates/mcb-validate/tests/test_utils.rs new file mode 100644 index 000000000..f52948487 --- /dev/null +++ b/crates/mcb-validate/tests/test_utils.rs @@ -0,0 +1,491 @@ +//! Shared test utilities for mcb-validate tests +//! +//! This module provides common test helpers to avoid duplication across test +//! files. It is the single source of truth for: +//! +//! - **Crate creation**: `create_test_crate`, `create_test_crate_with_file`, etc. +//! - **Fixture loading**: `copy_fixture_crate`, `setup_fixture_workspace` +//! - **DRY helpers**: `with_fixture_crate`, `with_inline_crate`, `with_fixture_workspace` +//! - **Assertions**: `assert_no_violations`, +//! `assert_has_violation_matching`, `assert_no_violation_from_file` +#![allow(dead_code)] + +use std::fs; + +use tempfile::TempDir; + +use crate::test_constants::{ + CARGO_TOML_TEMPLATE, CONFIG_FILE_NAME, CRATE_LAYER_MAPPINGS, CRATES_DIR, DEFAULT_VERSION, + GRL_SIMPLE_RULE, LIB_RS, PROJECT_PREFIX, TEST_WORKSPACE_PATH, WORKSPACE_CARGO_TOML, +}; + +// --------------------------------------------------------------------------- +// Crate creation utilities (for inline / generated code) +// --------------------------------------------------------------------------- + +/// Create a minimal crate structure for testing +pub fn create_test_crate(temp: &TempDir, name: &str, content: &str) { + create_test_crate_with_file(temp, name, LIB_RS, content); +} + +/// Create a crate structure with a specific file name +pub fn create_test_crate_with_file(temp: &TempDir, name: &str, file_name: &str, content: &str) { + // Create workspace Cargo.toml if it doesn't exist + let workspace_cargo = temp.path().join("Cargo.toml"); + if !workspace_cargo.exists() { + fs::write(&workspace_cargo, WORKSPACE_CARGO_TOML).unwrap(); + } + + // Create crate structure + let crate_dir = temp.path().join(CRATES_DIR).join(name).join("src"); + fs::create_dir_all(&crate_dir).unwrap(); + fs::write(crate_dir.join(file_name), content).unwrap(); + + let cargo_dir = temp.path().join(CRATES_DIR).join(name); + fs::write( + cargo_dir.join("Cargo.toml"), + format!( + r#"[package] +name = "{name}" +version = "{}" +"#, + DEFAULT_VERSION + ), + ) + .unwrap(); +} + +/// Get the workspace root for integration tests +pub fn get_workspace_root() -> std::path::PathBuf { + std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .parent() + .unwrap() + .to_path_buf() +} + +// --------------------------------------------------------------------------- +// Assertion helpers +// --------------------------------------------------------------------------- + +/// Assert that violations list is empty with descriptive message +pub fn assert_no_violations(violations: &[V], context: &str) { + assert!( + violations.is_empty(), + "{}: expected no violations, got {} - {:?}", + context, + violations.len(), + violations + ); +} + +/// Asserts that at least one violation in the list satisfies the predicate. +/// +/// Replaces the common pattern: +/// ```rust,ignore +/// let found = violations.iter().any(|v| matches!(v, SomeVariant { .. })); +/// assert!(found, "Expected SomeVariant violation"); +/// ``` +/// +/// # Example +/// ```rust,ignore +/// assert_has_violation_matching( +/// &violations, +/// |v| matches!(v, QualityViolation::FileTooLarge { .. }), +/// "FileTooLarge", +/// ); +/// ``` +pub fn assert_has_violation_matching( + violations: &[V], + predicate: impl Fn(&V) -> bool, + violation_name: &str, +) { + assert!( + violations.iter().any(predicate), + "Expected at least one {violation_name} violation, got: {violations:?}" + ); +} + +/// Asserts that NO violation in the list matches a file name pattern. +/// +/// Useful for testing exemptions (e.g., null.rs, constants.rs should not +/// produce violations). +/// +/// # Example +/// ```rust,ignore +/// assert_no_violation_from_file(&violations, "null.rs"); +/// ``` +pub fn assert_no_violation_from_file(violations: &[V], file_name: &str) { + for v in violations { + let msg = format!("{v:?}"); + assert!( + !msg.contains(file_name), + "{file_name} should be exempt from this check: {v:?}" + ); + } +} + +/// Asserts that the violations list matches the expected set **exactly**. +/// +/// Each expected entry is `(file_suffix, line, msg_contains)`. +/// Fails if any expected violation is missing or if there are unexpected violations. +/// +/// # Example +/// ```rust,ignore +/// assert_violations_exact(&violations, &[ +/// ("my-test/src/lib.rs", 17, "UnwrapInProduction"), +/// ("my-test/src/lib.rs", 19, "ExpectInProduction"), +/// ], "QualityValidator"); +/// ``` +pub fn assert_violations_exact( + violations: &[V], + expected: &[(&str, usize, &str)], + context: &str, +) { + let debug_strs: Vec = violations.iter().map(|v| format!("{v:?}")).collect(); + + // Check each expected violation is present + let mut missing: Vec = Vec::new(); + for (file_suffix, line, msg_contains) in expected { + let found = debug_strs.iter().any(|d| { + d.contains(file_suffix) + && (*line == 0 || d.contains(&format!("line: {line}"))) + && d.contains(msg_contains) + }); + if !found { + missing.push(format!(" {}:{} {:?}", file_suffix, line, msg_contains)); + } + } + + // Check there are no unexpected violations (count mismatch means extras) + let mut extras: Vec = Vec::new(); + if violations.len() != expected.len() { + for (i, d) in debug_strs.iter().enumerate() { + let matched = expected.iter().any(|(file_suffix, line, msg_contains)| { + d.contains(file_suffix) + && (*line == 0 || d.contains(&format!("line: {line}"))) + && d.contains(msg_contains) + }); + if !matched { + extras.push(format!(" [{}] {}", i, d)); + } + } + } + + if !missing.is_empty() || !extras.is_empty() { + let mut msg = format!( + "{}: expected {} violations, got {}\n", + context, + expected.len(), + violations.len() + ); + if !missing.is_empty() { + msg.push_str(&format!( + "MISSING ({}):\n{}\n", + missing.len(), + missing.join("\n") + )); + } + if !extras.is_empty() { + msg.push_str(&format!( + "UNEXPECTED ({}):\n{}\n", + extras.len(), + extras.join("\n") + )); + } + msg.push_str(&format!("ALL VIOLATIONS:\n{}", debug_strs.join("\n"))); + panic!("{msg}"); + } +} + +// --------------------------------------------------------------------------- +// Fixture loading utilities +// --------------------------------------------------------------------------- + +/// Returns the path to the `tests/fixtures/rust/` directory. +pub fn fixtures_dir() -> std::path::PathBuf { + std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("tests") + .join("fixtures") + .join("rust") +} + +/// Copies an entire fixture crate directory into the temp workspace. +/// +/// This recursively copies `tests/fixtures/rust/crates/{crate_name}/` into +/// `{temp}/crates/{crate_name}/`, preserving the full directory structure +/// including Cargo.toml, src/**, and tests/**. +/// +/// Useful for testing validators against realistic multi-file crate sources +/// that contain hard-to-find violations spread across multiple files. +pub fn copy_fixture_crate(temp: &TempDir, crate_name: &str) { + // Ensure workspace Cargo.toml exists + let workspace_cargo = temp.path().join("Cargo.toml"); + if !workspace_cargo.exists() { + let fixture_workspace = fixtures_dir().join("Cargo.toml"); + if fixture_workspace.exists() { + fs::copy(&fixture_workspace, &workspace_cargo).unwrap(); + } else { + fs::write(&workspace_cargo, WORKSPACE_CARGO_TOML).unwrap(); + } + } + + // Config file + let config_dest = temp.path().join(CONFIG_FILE_NAME); + if !config_dest.exists() { + let fixture_config = fixtures_dir().join(CONFIG_FILE_NAME); + if fixture_config.exists() { + fs::copy(&fixture_config, &config_dest).unwrap(); + } + } + + let src = fixtures_dir().join(CRATES_DIR).join(crate_name); + let dst = temp.path().join(CRATES_DIR).join(crate_name); + + assert!( + src.exists(), + "Fixture crate '{}' not found at {}", + crate_name, + src.display() + ); + + copy_dir_recursive(&src, &dst); +} + +/// Recursively copies a directory tree. +fn copy_dir_recursive(src: &std::path::Path, dst: &std::path::Path) { + fs::create_dir_all(dst).unwrap(); + for entry in fs::read_dir(src).unwrap() { + let entry = entry.unwrap(); + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dst_path); + } else { + fs::copy(&src_path, &dst_path).unwrap(); + } + } +} + +/// Sets up a temp workspace with multiple fixture crates copied in. +/// +/// This is the recommended way to set up multi-crate integration tests: +/// ```rust,ignore +/// let temp = TempDir::new().unwrap(); +/// setup_fixture_workspace(&temp, &[DOMAIN_CRATE, SERVER_CRATE, INFRA_CRATE]); +/// // Now run your validator against temp.path() +/// ``` +pub fn setup_fixture_workspace(temp: &TempDir, crate_names: &[&str]) { + for name in crate_names { + copy_fixture_crate(temp, name); + } +} + +// --------------------------------------------------------------------------- +// DRY test setup helpers — eliminate TempDir/copy/validator boilerplate +// --------------------------------------------------------------------------- + +/// Sets up a temp workspace with a single fixture crate copied in. +/// +/// Returns `(TempDir, workspace_path)` — the caller creates the validator +/// with `workspace_path`. Keeps ownership of `TempDir` alive for the test. +/// +/// # Example +/// ```rust,ignore +/// let (temp, root) = with_fixture_crate(TEST_CRATE); +/// let validator = QualityValidator::new(&root); +/// ``` +pub fn with_fixture_crate(crate_name: &str) -> (TempDir, std::path::PathBuf) { + let temp = TempDir::new().unwrap(); + copy_fixture_crate(&temp, crate_name); + let root = temp.path().to_path_buf(); + (temp, root) +} + +/// Sets up a temp workspace with multiple fixture crates copied in. +/// +/// Returns `(TempDir, workspace_path)`. +/// +/// # Example +/// ```rust,ignore +/// let (temp, root) = with_fixture_workspace(&[DOMAIN_CRATE, SERVER_CRATE]); +/// let validator = RefactoringValidator::new(&root); +/// ``` +pub fn with_fixture_workspace(crate_names: &[&str]) -> (TempDir, std::path::PathBuf) { + let temp = TempDir::new().unwrap(); + setup_fixture_workspace(&temp, crate_names); + let root = temp.path().to_path_buf(); + (temp, root) +} + +/// Sets up a temp workspace with a single inline crate (generated code). +/// +/// Use this for negative tests or generated content that doesn't make +/// sense as a fixture file. +/// +/// # Example +/// ```rust,ignore +/// let (temp, root) = with_inline_crate(TEST_CRATE, "pub fn clean() {}"); +/// let validator = QualityValidator::new(&root); +/// ``` +pub fn with_inline_crate(crate_name: &str, content: &str) -> (TempDir, std::path::PathBuf) { + let temp = TempDir::new().unwrap(); + create_test_crate(&temp, crate_name, content); + let root = temp.path().to_path_buf(); + (temp, root) +} + +// =========================================================================== +// Engine test helpers — shared across expression, rete, cargo, architecture +// =========================================================================== + +/// Creates a minimal `RuleContext` with empty file contents. +/// +/// Shared by `cargo_dependency_tests` and any test that needs a bare context. +/// +/// # Example +/// ```rust,ignore +/// let ctx = create_rule_context(); +/// let result = engine.execute(&rule, &ctx); +/// ``` +pub fn create_rule_context() -> mcb_validate::engines::RuleContext { + use std::collections::HashMap; + use std::path::PathBuf; + + mcb_validate::engines::RuleContext { + workspace_root: PathBuf::from(TEST_WORKSPACE_PATH), + config: mcb_validate::ValidationConfig::new(TEST_WORKSPACE_PATH), + ast_data: HashMap::new(), + cargo_data: HashMap::new(), + file_contents: HashMap::new(), + facts: std::sync::Arc::new(Vec::new()), + graph: std::sync::Arc::new(mcb_validate::graph::DependencyGraph::new()), + } +} + +/// Creates a `RuleContext` pre-loaded with given file entries. +/// +/// Shared by `expression_engine_tests` which needs file_contents populated. +/// +/// # Example +/// ```rust,ignore +/// let ctx = create_rule_context_with_files(&[ +/// ("src/main.rs", SNIPPET_MAIN_RS), +/// ("src/lib.rs", SNIPPET_LIB_RS), +/// ]); +/// ``` +pub fn create_rule_context_with_files( + files: &[(&str, &str)], +) -> mcb_validate::engines::RuleContext { + let mut ctx = create_rule_context(); + for (path, content) in files { + ctx.file_contents + .insert(path.to_string(), content.to_string()); + } + ctx +} + +/// Builds the YAML variable mapping required by `YamlRuleLoader`. +/// +/// Populates `project_prefix` and all `{key}_crate` / `{key}_module` entries +/// from [`CRATE_LAYER_MAPPINGS`]. +/// +/// # Example +/// ```rust,ignore +/// let vars = build_yaml_variables(); +/// let loader = YamlRuleLoader::with_variables(rules_dir, Some(vars)).unwrap(); +/// ``` +pub fn build_yaml_variables() -> serde_yaml::Value { + let mut variables = serde_yaml::Mapping::new(); + variables.insert( + serde_yaml::Value::String("project_prefix".to_string()), + serde_yaml::Value::String(PROJECT_PREFIX.to_string()), + ); + + for &(key, crate_name, module_name) in CRATE_LAYER_MAPPINGS { + variables.insert( + serde_yaml::Value::String(format!("{key}_crate")), + serde_yaml::Value::String(crate_name.to_string()), + ); + variables.insert( + serde_yaml::Value::String(format!("{key}_module")), + serde_yaml::Value::String(module_name.to_string()), + ); + } + + serde_yaml::Value::Mapping(variables) +} + +/// Builds a GRL rule string from name, condition, and action. +/// +/// # Example +/// ```rust,ignore +/// let grl = build_grl_rule("TestRule", "Facts.x == true", "Facts.y = true"); +/// ``` +pub fn build_grl_rule(name: &str, condition: &str, action: &str) -> String { + GRL_SIMPLE_RULE + .replace("{name}", name) + .replace("{condition}", condition) + .replace("{action}", action) +} + +/// Parses a GRL string and returns a populated `KnowledgeBase`. +/// +/// # Panics +/// Panics if GRL parsing fails (test-only helper). +/// +/// # Example +/// ```rust,ignore +/// let grl = build_grl_rule("Test", "Facts.x == true", "Facts.y = true"); +/// let kb = build_kb_from_grl("test", &grl); +/// let mut engine = RustRuleEngine::new(kb); +/// ``` +pub fn build_kb_from_grl(kb_name: &str, grl: &str) -> rust_rule_engine::KnowledgeBase { + use rust_rule_engine::{GRLParser, KnowledgeBase}; + + let kb = KnowledgeBase::new(kb_name); + let rules = GRLParser::parse_rules(grl).expect("Should parse GRL"); + for rule in rules { + kb.add_rule(rule).expect("Should add rule"); + } + kb +} + +/// Creates `Facts` pre-populated with the given key-value pairs. +/// +/// # Example +/// ```rust,ignore +/// let facts = create_facts(&[ +/// (FACT_HAS_INTERNAL_DEPS, RreValue::Boolean(true)), +/// (FACT_VIOLATION_TRIGGERED, RreValue::Boolean(false)), +/// ]); +/// ``` +pub fn create_facts(entries: &[(&str, rust_rule_engine::Value)]) -> rust_rule_engine::Facts { + let facts = rust_rule_engine::Facts::new(); + for (key, value) in entries { + facts.set(key, value.clone()); + } + facts +} + +/// Generates a `Cargo.toml` string with the given crate name and dependencies. +/// +/// # Example +/// ```rust,ignore +/// let toml = cargo_toml_with_deps("my-crate", &[ +/// ("serde", "1.0"), +/// ("my-infrastructure", "0.1.0"), +/// ]); +/// ``` +pub fn cargo_toml_with_deps(crate_name: &str, deps: &[(&str, &str)]) -> String { + let deps_str: Vec = deps + .iter() + .map(|(name, version)| format!("{name} = \"{version}\"")) + .collect(); + + CARGO_TOML_TEMPLATE + .replace("{crate_name}", crate_name) + .replace("{version}", DEFAULT_VERSION) + .replace("{deps}", &deps_str.join("\n")) +}