From d32c78abd0b5c5cb3b5d0656c44a27e361bb8080 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 11:35:25 -0300 Subject: [PATCH 01/16] refactor: comment out unused directories in add-req.sh for clarity --- add-req.sh | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/add-req.sh b/add-req.sh index 9b668e9ec..142dc9306 100755 --- a/add-req.sh +++ b/add-req.sh @@ -19,26 +19,29 @@ for file in "${prompts[@]}"; do done dirs=( - "auth" - "automation" - "basic" - "bot" - "bootstrap" - "package_manager" - "channels" - "config" - "context" - "email" + # "auth" + "automation" + "basic" + # "bot" + "bootstrap" + # "package_manager" + # "channels" + # "config" + # "context" + # "email" + # "file" + # "llm" + "drive_monitor" + # "llm_legacy" + # "org" + # "session" "file" - "llm" - "llm_legacy" - "org" - "session" - "shared" - "tests" - "tools" - "web_automation" - "whatsapp" + "kb" + # "shared" + # "tests" + # "tools" + # "web_automation" + # "whatsapp" ) filter_rust_file() { From ff770e593fee32e4904a9a42d6f2195da6ab5765 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 12:07:14 -0300 Subject: [PATCH 02/16] Refactor dependencies in Cargo.toml and update start.bas dialog - Removed unused Tauri dependencies and replaced aws-sdk-s3 with opendal for S3 services. - Cleaned up feature flags in Cargo.toml. - Simplified the welcome message logic in start.bas and removed redundant comments. --- Cargo.lock | 4534 ++--------------- Cargo.toml | 12 +- src/automation/mod.rs | 2 +- .../announcements.gbdialog/auth.bas | 67 - .../announcements.gbdialog/start.bas | 7 - 5 files changed, 439 insertions(+), 4183 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 986f64123..bf99a7f4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.4", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -45,7 +45,7 @@ dependencies = [ "actix-service", "actix-utils", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags", "brotli", "bytes", "bytestring", @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -118,7 +118,7 @@ dependencies = [ "parse-size", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -201,7 +201,7 @@ dependencies = [ "bytes", "bytestring", "cfg-if", - "cookie 0.16.2", + "cookie", "derive_more 2.0.1", "encoding_rs", "foldhash 0.1.5", @@ -235,7 +235,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -252,15 +252,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -319,7 +310,7 @@ checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "const-random", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -426,6 +417,15 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "ar_archive_writer" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" +dependencies = [ + "object", +] + [[package]] name = "arbitrary" version = "1.4.2" @@ -459,141 +459,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "ashpd" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" -dependencies = [ - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "raw-window-handle", - "serde", - "serde_repr", - "tokio", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "async-signal" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -613,15 +478,9 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - [[package]] name = "async-trait" version = "0.1.89" @@ -630,30 +489,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "atk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" -dependencies = [ - "atk-sys", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", + "syn", ] [[package]] @@ -688,19 +524,19 @@ version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2bf00cb9416daab4ce4927c54ebe63c08b9caf4d7b9314b6d7a4a2c5a1afb09" dependencies = [ - "aws-credential-types 0.57.2", + "aws-credential-types", "aws-http", - "aws-runtime 0.57.2", + "aws-runtime", "aws-sdk-sso", "aws-sdk-ssooidc", "aws-sdk-sts", - "aws-smithy-async 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-json 0.57.2", - "aws-smithy-runtime 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "aws-types 0.57.2", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", "bytes", "fastrand", "hex", @@ -719,21 +555,9 @@ version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb9073c88dbf12f68ce7d0e149f989627a1d1ae3d2b680459f04ccc29d1cbd0f" dependencies = [ - "aws-smithy-async 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "zeroize", -] - -[[package]] -name = "aws-credential-types" -version = "1.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" -dependencies = [ - "aws-smithy-async 1.2.6", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", "zeroize", ] @@ -743,10 +567,10 @@ version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24067106d09620cf02d088166cdaedeaca7146d4d499c41b37accecbea11b246" dependencies = [ - "aws-smithy-http 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "aws-types 0.57.2", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", "bytes", "http 0.2.12", "http-body 0.4.6", @@ -754,44 +578,20 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-lc-rs" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b715a6010afb9e457ca2b7c9d2b9c344baa8baed7b38dc476034c171b32575" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libloading 0.8.8", -] - [[package]] name = "aws-runtime" version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6ee0152c06d073602236a4e94a8c52a327d310c1ecd596570ce795af8777ff" dependencies = [ - "aws-credential-types 0.57.2", + "aws-credential-types", "aws-http", - "aws-sigv4 0.57.2", - "aws-smithy-async 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "aws-types 0.57.2", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", "fastrand", "http 0.2.12", "percent-encoding", @@ -799,81 +599,22 @@ dependencies = [ "uuid", ] -[[package]] -name = "aws-runtime" -version = "1.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa006bb32360ed90ac51203feafb9d02e3d21046e1fd3a450a404b90ea73e5d" -dependencies = [ - "aws-credential-types 1.2.8", - "aws-sigv4 1.3.5", - "aws-smithy-async 1.2.6", - "aws-smithy-eventstream", - "aws-smithy-http 0.62.4", - "aws-smithy-runtime 1.9.3", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "aws-types 1.3.9", - "bytes", - "fastrand", - "http 0.2.12", - "http-body 0.4.6", - "percent-encoding", - "pin-project-lite", - "tracing", - "uuid", -] - -[[package]] -name = "aws-sdk-s3" -version = "1.108.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" -dependencies = [ - "aws-credential-types 1.2.8", - "aws-runtime 1.5.12", - "aws-sigv4 1.3.5", - "aws-smithy-async 1.2.6", - "aws-smithy-checksums", - "aws-smithy-eventstream", - "aws-smithy-http 0.62.4", - "aws-smithy-json 0.61.6", - "aws-smithy-runtime 1.9.3", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "aws-smithy-xml 0.60.11", - "aws-types 1.3.9", - "bytes", - "fastrand", - "hex", - "hmac", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "lru", - "percent-encoding", - "regex-lite", - "sha2", - "tracing", - "url", -] - [[package]] name = "aws-sdk-sso" version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb8158015232b4596ccef74a205600398e152d704b40b7ec9f486092474d7fa" dependencies = [ - "aws-credential-types 0.57.2", + "aws-credential-types", "aws-http", - "aws-runtime 0.57.2", - "aws-smithy-async 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-json 0.57.2", - "aws-smithy-runtime 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "aws-types 0.57.2", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", "bytes", "http 0.2.12", "regex", @@ -886,16 +627,16 @@ version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36a1493e1c57f173e53621935bfb5b6217376168dbdb4cd459aebcf645924a48" dependencies = [ - "aws-credential-types 0.57.2", + "aws-credential-types", "aws-http", - "aws-runtime 0.57.2", - "aws-smithy-async 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-json 0.57.2", - "aws-smithy-runtime 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "aws-types 0.57.2", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", "bytes", "http 0.2.12", "regex", @@ -908,18 +649,18 @@ version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e032b77f5cd1dd3669d777a38ac08cbf8ec68e29460d4ef5d3e50cffa74ec75a" dependencies = [ - "aws-credential-types 0.57.2", + "aws-credential-types", "aws-http", - "aws-runtime 0.57.2", - "aws-smithy-async 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-json 0.57.2", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", "aws-smithy-query", - "aws-smithy-runtime 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", - "aws-smithy-xml 0.57.2", - "aws-types 0.57.2", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", "http 0.2.12", "regex", "tracing", @@ -931,9 +672,9 @@ version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64f81a6abc4daab06b53cabf27c54189928893283093e37164ca53aa47488a5b" dependencies = [ - "aws-credential-types 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-runtime-api 0.57.2", + "aws-credential-types", + "aws-smithy-http", + "aws-smithy-runtime-api", "bytes", "form_urlencoded", "hex", @@ -947,34 +688,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-sigv4" -version = "1.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffc03068fbb9c8dd5ce1c6fb240678a5cffb86fb2b7b1985c999c4b83c8df68" -dependencies = [ - "aws-credential-types 1.2.8", - "aws-smithy-eventstream", - "aws-smithy-http 0.62.4", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "bytes", - "crypto-bigint 0.5.5", - "form_urlencoded", - "hex", - "hmac", - "http 0.2.12", - "http 1.3.1", - "p256", - "percent-encoding", - "ring", - "sha2", - "subtle", - "time", - "tracing", - "zeroize", -] - [[package]] name = "aws-smithy-async" version = "0.57.2" @@ -986,56 +699,14 @@ dependencies = [ "tokio", ] -[[package]] -name = "aws-smithy-async" -version = "1.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "aws-smithy-checksums" -version = "0.63.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165d8583d8d906e2fb5511d29201d447cc710864f075debcdd9c31c265412806" -dependencies = [ - "aws-smithy-http 0.62.4", - "aws-smithy-types 1.3.3", - "bytes", - "crc-fast", - "hex", - "http 0.2.12", - "http-body 0.4.6", - "md-5", - "pin-project-lite", - "sha1", - "sha2", - "tracing", -] - -[[package]] -name = "aws-smithy-eventstream" -version = "0.60.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9656b85088f8d9dc7ad40f9a6c7228e1e8447cdf4b046c87e152e0805dea02fa" -dependencies = [ - "aws-smithy-types 1.3.3", - "bytes", - "crc32fast", -] - [[package]] name = "aws-smithy-http" version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7972373213d1d6e619c0edc9dda2d6634154e4ed75c5e0b2bf065cd5ec9f0d1" dependencies = [ - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", + "aws-smithy-runtime-api", + "aws-smithy-types", "bytes", "bytes-utils", "futures-core", @@ -1048,82 +719,13 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-smithy-http" -version = "0.62.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3feafd437c763db26aa04e0cc7591185d0961e64c61885bece0fb9d50ceac671" -dependencies = [ - "aws-smithy-eventstream", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] - -[[package]] -name = "aws-smithy-http-client" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1053b5e587e6fa40ce5a79ea27957b04ba660baa02b28b7436f64850152234f1" -dependencies = [ - "aws-smithy-async 1.2.6", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "h2 0.3.27", - "h2 0.4.12", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper 1.7.0", - "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", - "hyper-util", - "pin-project-lite", - "rustls 0.21.12", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.4", - "tower 0.5.2", - "tracing", -] - [[package]] name = "aws-smithy-json" version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d64d5af16dd585de9ff6c606423c1aaad47c6baa38de41c2beb32ef21c6645" dependencies = [ - "aws-smithy-types 0.57.2", -] - -[[package]] -name = "aws-smithy-json" -version = "0.61.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff418fc8ec5cadf8173b10125f05c2e7e1d46771406187b2c878557d4503390" -dependencies = [ - "aws-smithy-types 1.3.3", -] - -[[package]] -name = "aws-smithy-observability" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" -dependencies = [ - "aws-smithy-runtime-api 1.9.1", + "aws-smithy-types", ] [[package]] @@ -1132,7 +734,7 @@ version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7527bf5335154ba1b285479c50b630e44e93d1b4a759eaceb8d0bf9fbc82caa5" dependencies = [ - "aws-smithy-types 0.57.2", + "aws-smithy-types", "urlencoding", ] @@ -1142,10 +744,10 @@ version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "839b363adf3b2bdab2742a1f540fec23039ea8bc9ec0f9f61df48470cfe5527b" dependencies = [ - "aws-smithy-async 0.57.2", - "aws-smithy-http 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", "bytes", "fastrand", "http 0.2.12", @@ -1160,38 +762,14 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-smithy-runtime" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ab99739082da5347660c556689256438defae3bcefd66c52b095905730e404" -dependencies = [ - "aws-smithy-async 1.2.6", - "aws-smithy-http 0.62.4", - "aws-smithy-http-client", - "aws-smithy-observability", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "bytes", - "fastrand", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "http-body 1.0.1", - "pin-project-lite", - "pin-utils", - "tokio", - "tracing", -] - [[package]] name = "aws-smithy-runtime-api" version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f24ecc446e62c3924539e7c18dec8038dba4fdf8718d5c2de62f9d2fecca8ba9" dependencies = [ - "aws-smithy-async 0.57.2", - "aws-smithy-types 0.57.2", + "aws-smithy-async", + "aws-smithy-types", "bytes", "http 0.2.12", "pin-project-lite", @@ -1200,23 +778,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "aws-smithy-runtime-api" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3683c5b152d2ad753607179ed71988e8cfd52964443b4f74fd8e552d0bbfeb46" -dependencies = [ - "aws-smithy-async 1.2.6", - "aws-smithy-types 1.3.3", - "bytes", - "http 0.2.12", - "http 1.3.1", - "pin-project-lite", - "tokio", - "tracing", - "zeroize", -] - [[package]] name = "aws-smithy-types" version = "0.57.2" @@ -1238,32 +799,6 @@ dependencies = [ "time", ] -[[package]] -name = "aws-smithy-types" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5b3a7486f6690ba25952cabf1e7d75e34d69eaff5081904a47bc79074d6457" -dependencies = [ - "base64-simd", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "http-body 1.0.1", - "http-body-util", - "itoa", - "num-integer", - "pin-project-lite", - "pin-utils", - "ryu", - "serde", - "time", - "tokio", - "tokio-util", -] - [[package]] name = "aws-smithy-xml" version = "0.57.2" @@ -1273,44 +808,21 @@ dependencies = [ "xmlparser", ] -[[package]] -name = "aws-smithy-xml" -version = "0.60.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" -dependencies = [ - "xmlparser", -] - [[package]] name = "aws-types" version = "0.57.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "048bbf1c24cdf4eb1efcdc243388a93a90ebf63979e25fc1c7b8cbd9cb6beb38" dependencies = [ - "aws-credential-types 0.57.2", - "aws-smithy-async 0.57.2", - "aws-smithy-runtime-api 0.57.2", - "aws-smithy-types 0.57.2", + "aws-credential-types", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", "http 0.2.12", "rustc_version", "tracing", ] -[[package]] -name = "aws-types" -version = "1.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2fd329bf0e901ff3f60425691410c69094dc2a1f34b331f37bfc4e9ac1565a1" -dependencies = [ - "aws-credential-types 1.2.8", - "aws-smithy-async 1.2.6", - "aws-smithy-runtime-api 1.9.1", - "aws-smithy-types 1.3.3", - "rustc_version", - "tracing", -] - [[package]] name = "axum" version = "0.7.9" @@ -1332,7 +844,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.2", + "sync_wrapper", "tower 0.5.2", "tower-layer", "tower-service", @@ -1353,32 +865,22 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.2", + "sync_wrapper", "tower-layer", "tower-service", ] [[package]] -name = "backtrace" -version = "0.3.76" +name = "backon" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link 0.2.1", + "fastrand", + "gloo-timers", + "tokio", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base64" version = "0.21.7" @@ -1407,40 +909,11 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" -[[package]] -name = "bindgen" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" -dependencies = [ - "bitflags 2.9.4", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.106", -] - [[package]] name = "bitflags" -version = "1.3.2" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" -dependencies = [ - "serde", -] +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "blake2" @@ -1469,37 +942,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2 0.6.3", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - [[package]] name = "bmrng" version = "0.5.2" @@ -1524,7 +966,6 @@ dependencies = [ "async-stream", "async-trait", "aws-config", - "aws-sdk-s3", "base64 0.22.1", "bytes", "chrono", @@ -1545,22 +986,19 @@ dependencies = [ "mailparse", "native-tls", "num-format", + "opendal", "pdf-extract", "qdrant-client", "rand 0.9.2", "redis", "regex", - "reqwest 0.12.23", + "reqwest", "rhai", "scraper", "serde", "serde_json", "sha2", "smartstring", - "tauri", - "tauri-build", - "tauri-plugin-dialog", - "tauri-plugin-opener", "tempfile", "time", "tokio", @@ -1612,12 +1050,6 @@ version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" -[[package]] -name = "bytemuck" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" - [[package]] name = "byteorder" version = "1.5.0" @@ -1629,9 +1061,6 @@ name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] [[package]] name = "bytes-utils" @@ -1681,73 +1110,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.9.4", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "camino" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "cargo_toml" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" -dependencies = [ - "serde", - "toml 0.9.8", -] - [[package]] name = "cbc" version = "0.1.2" @@ -1759,9 +1121,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.41" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ "find-msvc-tools", "jobserver", @@ -1775,47 +1137,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom 7.1.3", -] - -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - [[package]] name = "cff-parser" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31f5b6e9141c036f3ff4ce7b2f7e432b0f00dee416ddcd4f17741d189ddc2e9d" -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1867,31 +1199,20 @@ dependencies = [ "inout", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading 0.8.8", -] - [[package]] name = "clap" -version = "4.5.48" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.5.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" dependencies = [ "anstyle", "clap_lex", @@ -1900,24 +1221,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" - -[[package]] -name = "cmake" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" -dependencies = [ - "cc", -] +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "codespan-reporting" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ "serde", "termcolor", @@ -1944,15 +1256,6 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "console" version = "0.16.1" @@ -2021,16 +1324,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "time", - "version_check", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -2057,30 +1350,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.9.4", - "core-foundation 0.10.1", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.9.4", - "core-foundation 0.10.1", - "libc", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -2106,16 +1375,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] -name = "crc-fast" -version = "1.3.0" +name = "crc32c" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" +checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" dependencies = [ - "crc", - "digest", - "libc", - "rand 0.9.2", - "regex", + "rustc_version", ] [[package]] @@ -2127,15 +1392,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -2148,28 +1404,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "crypto-common" version = "0.1.6" @@ -2181,23 +1415,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "cssparser" -version = "0.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - [[package]] name = "cssparser" version = "0.31.2" @@ -2218,7 +1435,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2242,16 +1459,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.106", -] - [[package]] name = "ctr" version = "0.9.2" @@ -2263,9 +1470,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.186" +version = "1.0.187" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9c4fe7f2f5dc5c62871a1b43992d197da6fa1394656a94276ac2894a90a6fe" +checksum = "d8465678d499296e2cbf9d3acf14307458fd69b471a31b65b3c519efe8b5e187" dependencies = [ "cc", "cxx-build", @@ -2278,50 +1485,49 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.186" +version = "1.0.187" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5cf2909d37d80633ddd208676fc27c2608a7f035fff69c882421168038b26dd" +checksum = "d74b6bcf49ebbd91f1b1875b706ea46545032a14003b5557b7dfa4bbeba6766e" dependencies = [ "cc", "codespan-reporting", - "indexmap 2.11.4", + "indexmap 2.12.0", "proc-macro2", "quote", "scratch", - "syn 2.0.106", + "syn", ] [[package]] name = "cxxbridge-cmd" -version = "1.0.186" +version = "1.0.187" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "077f5ee3d3bfd8d27f83208fdaa96ddd50af7f096c77077cc4b94da10bfacefd" +checksum = "94ca2ad69673c4b35585edfa379617ac364bccd0ba0adf319811ba3a74ffa48a" dependencies = [ "clap", "codespan-reporting", - "indexmap 2.11.4", + "indexmap 2.12.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "cxxbridge-flags" -version = "1.0.186" +version = "1.0.187" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0108748615125b9f2e915dfafdffcbdabbca9b15102834f6d7e9a768f2f2864" +checksum = "d29b52102aa395386d77d322b3a0522f2035e716171c2c60aa87cc5e9466e523" [[package]] name = "cxxbridge-macro" -version = "1.0.186" +version = "1.0.187" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e896681ef9b8dc462cfa6961d61909704bde0984b30bcb4082fe102b478890" +checksum = "2a8ebf0b6138325af3ec73324cb3a48b64d57721f17291b151206782e61f66cd" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "proc-macro2", "quote", - "rustversion", - "syn 2.0.106", + "syn", ] [[package]] @@ -2355,7 +1561,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn", ] [[package]] @@ -2369,7 +1575,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn", ] [[package]] @@ -2380,7 +1586,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2391,7 +1597,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2406,24 +1612,13 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde_core", ] [[package]] @@ -2434,7 +1629,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2455,7 +1650,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2465,7 +1660,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn", ] [[package]] @@ -2478,7 +1673,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.106", + "syn", ] [[package]] @@ -2498,21 +1693,21 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "unicode-xid", ] [[package]] name = "diesel" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8496eeb328dce26ee9d9b73275d396d9bddb433fa30106cf6056dd8c3c2764c" +checksum = "5e7624a3bb9fffd82fff016be9a7f163d20e5a89eb8d28f9daaa6b30fff37500" dependencies = [ - "bitflags 2.9.4", + "bitflags", "byteorder", "chrono", "diesel_derives", - "downcast-rs 2.0.2", + "downcast-rs", "itoa", "pq-sys", "serde_json", @@ -2521,15 +1716,15 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09af0e983035368439f1383011cd87c46f41da81d0f21dc3727e2857d5a43c8e" +checksum = "9daac6489a36e42570da165a10c424f3edcefdff70c5fd55e1847c23f3dd7562" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2538,7 +1733,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" dependencies = [ - "syn 2.0.106", + "syn", ] [[package]] @@ -2548,49 +1743,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "libc", - "objc2 0.6.3", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -2599,39 +1756,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] -name = "dlib" +name = "dlv-list" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" dependencies = [ - "libloading 0.8.8", -] - -[[package]] -name = "dlopen2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "const-random", ] [[package]] @@ -2640,12 +1774,6 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - [[package]] name = "downcast-rs" version = "2.0.2" @@ -2660,20 +1788,11 @@ checksum = "9ac1e888d6830712d565b2f3a974be3200be9296bc1b03db8251a4cbf18a4a34" dependencies = [ "futures", "rand 0.8.5", - "reqwest 0.12.23", + "reqwest", "thiserror 1.0.69", "tokio", ] -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -dependencies = [ - "serde", -] - [[package]] name = "dsl_auto_type" version = "0.2.0" @@ -2685,7 +1804,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2703,18 +1822,6 @@ dependencies = [ "dtoa", ] -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - [[package]] name = "ecb" version = "0.1.2" @@ -2724,18 +1831,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der", - "elliptic-curve", - "rfc6979", - "signature", -] - [[package]] name = "ego-tree" version = "0.6.3" @@ -2748,26 +1843,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct", - "crypto-bigint 0.4.9", - "der", - "digest", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - [[package]] name = "email-encoding" version = "0.4.1" @@ -2784,26 +1859,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" -[[package]] -name = "embed-resource" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.8", - "vswhom", - "winreg 0.55.0", -] - -[[package]] -name = "embed_plist" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" - [[package]] name = "encode_unicode" version = "1.0.0" @@ -2819,38 +1874,11 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "endi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -2881,17 +1909,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - [[package]] name = "errno" version = "0.3.14" @@ -2911,62 +1928,12 @@ dependencies = [ "num-traits", ] -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - [[package]] name = "find-msvc-tools" version = "0.1.4" @@ -2981,9 +1948,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -3013,28 +1980,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "foreign-types-shared", ] [[package]] @@ -3043,12 +1989,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -3068,12 +2008,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "futf" version = "0.1.5" @@ -3132,19 +2066,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "futures-macro" version = "0.3.31" @@ -3153,7 +2074,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3195,110 +2116,11 @@ dependencies = [ "byteorder", ] -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" -dependencies = [ - "gdk", - "gdkx11-sys", - "gio", - "glib", - "libc", - "x11", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -3313,17 +2135,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -3333,21 +2144,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] @@ -3361,91 +2172,6 @@ dependencies = [ "polyval", ] -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.9.4", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - [[package]] name = "glob" version = "0.3.3" @@ -3453,77 +2179,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] -name = "gobject-sys" -version = "0.18.0" +name = "gloo-timers" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.106", + "futures-core", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -3538,7 +2202,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -3557,7 +2221,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -3580,17 +2244,6 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.1.5", -] - [[package]] name = "hashbrown" version = "0.16.0" @@ -3617,7 +2270,7 @@ dependencies = [ "tungstenite 0.27.0", "url", "which", - "winreg 0.55.0", + "winreg", ] [[package]] @@ -3632,12 +2285,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -3653,6 +2300,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "hostname" version = "0.4.1" @@ -3672,22 +2328,10 @@ checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" dependencies = [ "log", "mac", - "markup5ever 0.12.1", + "markup5ever", "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever 0.14.1", - "match_token", + "syn", ] [[package]] @@ -3830,8 +2474,8 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.34", + "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -3886,8 +2530,8 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", - "system-configuration 0.6.1", + "socket2 0.6.1", + "system-configuration", "tokio", "tower-service", "tracing", @@ -3906,7 +2550,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core", ] [[package]] @@ -3918,16 +2562,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ico" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" -dependencies = [ - "byteorder", - "png", -] - [[package]] name = "icu_collections" version = "2.0.0" @@ -4100,26 +2734,23 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde", ] [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", - "serde", - "serde_core", ] [[package]] name = "indicatif" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" +checksum = "ade6dfcba0dfb62ad59e59e7241ec8912af34fd29e0e743e3db992bd278e8b65" dependencies = [ "console", "portable-atomic", @@ -4128,15 +2759,6 @@ dependencies = [ "web-time", ] -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - [[package]] name = "inout" version = "0.1.4" @@ -4147,17 +2769,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -4174,30 +2785,11 @@ dependencies = [ "serde", ] -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -4241,29 +2833,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "jiff" version = "0.2.15" @@ -4285,7 +2854,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -4316,42 +2885,20 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", ] -[[package]] -name = "json-patch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonptr" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "jsonwebtoken" version = "9.3.1" @@ -4365,29 +2912,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.9.4", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser 0.29.6", - "html5ever 0.29.1", - "indexmap 2.11.4", - "selectors 0.24.0", -] - [[package]] name = "language-tags" version = "0.3.2" @@ -4422,36 +2946,12 @@ dependencies = [ "nom 8.0.0", "percent-encoding", "quoted_printable", - "socket2 0.6.0", + "socket2 0.6.1", "tokio", "tokio-native-tls", "url", ] -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] - [[package]] name = "libc" version = "0.2.177" @@ -4460,39 +2960,19 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" -version = "0.7.4" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.5", -] - -[[package]] -name = "libredox" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" -dependencies = [ - "bitflags 2.9.4", - "libc", + "windows-link 0.2.1", ] [[package]] name = "libwebrtc" -version = "0.3.16" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcab6479e94215dc7cebc4e7c160a8f3f1e183627fca5a398f8c60fd41057ae1" +checksum = "2621fee81c55f30be507744b6220b14fdbf5bf78f8f35919a77b66f5ab31a9dd" dependencies = [ "cxx", "jni", @@ -4535,16 +3015,16 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "livekit" -version = "0.7.20" +version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01bc9ff6e8aca0bd58dc64a577d41fc9723961601e6fd9960657bac965f477b9" +checksum = "a8b36003aba39f355eeb8ff363fd57215787b5c01907be00a9d1601e5e7c78ef" dependencies = [ "bmrng", "bytes", "chrono", "futures-util", "lazy_static", - "libloading 0.8.8", + "libloading", "libwebrtc", "livekit-api", "livekit-protocol", @@ -4555,19 +3035,20 @@ dependencies = [ "semver", "serde", "serde_json", + "test-log", "thiserror 1.0.69", "tokio", ] [[package]] name = "livekit-api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2862901b8feed084795e1163632e47f15d6f2c181ab62c15db02225f8621553a" +checksum = "42a650aa52faaaa6bb33b7c3a7742d47f78a7dc21e65d7c936a518d43eb974b4" dependencies = [ "base64 0.21.7", "futures-util", - "http 0.2.12", + "http 1.3.1", "jsonwebtoken", "livekit-protocol", "livekit-runtime", @@ -4576,7 +3057,7 @@ dependencies = [ "pbjson-types", "prost 0.12.6", "rand 0.9.2", - "reqwest 0.11.27", + "reqwest", "scopeguard", "serde", "serde_json", @@ -4589,9 +3070,9 @@ dependencies = [ [[package]] name = "livekit-protocol" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "768d2eb8242eb9b5f87868ae5498eb3f7653f6830d99d0131433a6fe00e26d20" +checksum = "656d0ad4e08edfe14cbc41c4f220b318a81965f8419cc2ac7f200a46a771d5de" dependencies = [ "futures-util", "livekit-runtime", @@ -4654,13 +3135,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7184fdea2bc3cd272a1acec4030c321a8f9875e877b3f92a53f2f6033fdc289" dependencies = [ "aes", - "bitflags 2.9.4", + "bitflags", "cbc", "ecb", "encoding_rs", "flate2", - "getrandom 0.3.3", - "indexmap 2.11.4", + "getrandom 0.3.4", + "indexmap 2.12.0", "itoa", "log", "md-5", @@ -4675,15 +3156,6 @@ dependencies = [ "weezl", ] -[[package]] -name = "lru" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -dependencies = [ - "hashbrown 0.15.5", -] - [[package]] name = "lru-slab" version = "0.1.2" @@ -4743,36 +3215,14 @@ dependencies = [ ] [[package]] -name = "markup5ever" -version = "0.14.1" +name = "matchers" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "log", - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", + "regex-automata", ] -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.7.3" @@ -4795,15 +3245,6 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "mime" version = "0.3.17" @@ -4828,35 +3269,14 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "muda" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation 0.3.2", - "once_cell", - "png", - "serde", - "thiserror 2.0.17", - "windows-sys 0.60.2", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -4882,61 +3302,12 @@ dependencies = [ "tempfile", ] -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.9.4", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - [[package]] name = "nom" version = "7.1.3" @@ -5020,297 +3391,11 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_enum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "libc", - "objc2 0.6.3", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-text", - "objc2-core-video", - "objc2-foundation 0.3.2", - "objc2-quartz-core 0.3.2", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.9.4", - "dispatch2", - "objc2 0.6.3", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.9.4", - "dispatch2", - "objc2 0.6.3", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" -dependencies = [ - "objc2 0.6.3", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-core-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-core-foundation", - "objc2-core-graphics", -] - -[[package]] -name = "objc2-core-video" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-io-surface", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-exception-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" -dependencies = [ - "cc", -] - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "libc", - "objc2 0.6.3", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-javascript-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" -dependencies = [ - "objc2 0.6.3", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-security" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-core-foundation", - "objc2-foundation 0.3.2", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation 0.3.2", - "objc2-javascript-core", - "objc2-security", -] - [[package]] name = "object" -version = "0.37.3" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -5326,9 +3411,9 @@ dependencies = [ [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "opaque-debug" @@ -5337,26 +3422,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] -name = "open" -version = "5.3.2" +name = "opendal" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +checksum = "42afda58fa2cf50914402d132cc1caacff116a85d10c72ab2082bb7c50021754" dependencies = [ - "dunce", - "is-wsl", - "libc", - "pathdiff", + "anyhow", + "backon", + "base64 0.22.1", + "bytes", + "chrono", + "crc32c", + "futures", + "getrandom 0.2.16", + "http 1.3.1", + "http-body 1.0.1", + "log", + "md-5", + "percent-encoding", + "quick-xml 0.38.3", + "reqsign", + "reqwest", + "serde", + "serde_json", + "tokio", + "uuid", ] [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags 2.9.4", + "bitflags", "cfg-if", - "foreign-types 0.3.2", + "foreign-types", "libc", "once_cell", "openssl-macros", @@ -5371,7 +3472,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5382,9 +3483,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -5393,19 +3494,13 @@ dependencies = [ ] [[package]] -name = "option-ext" -version = "0.2.0" +name = "ordered-multimap" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ - "futures-core", - "pin-project-lite", + "dlv-list", + "hashbrown 0.14.5", ] [[package]] @@ -5429,7 +3524,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5438,48 +3533,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa", - "elliptic-curve", - "sha2", -] - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.5" @@ -5531,12 +3584,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - [[package]] name = "pbjson" version = "0.6.0" @@ -5626,16 +3673,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.4", -] - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_shared 0.8.0", + "indexmap 2.12.0", ] [[package]] @@ -5644,9 +3682,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_macros 0.10.0", "phf_shared 0.10.0", - "proc-macro-hack", ] [[package]] @@ -5655,20 +3691,10 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros 0.11.3", + "phf_macros", "phf_shared 0.11.3", ] -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - [[package]] name = "phf_codegen" version = "0.10.0" @@ -5689,16 +3715,6 @@ dependencies = [ "phf_shared 0.11.3", ] -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - [[package]] name = "phf_generator" version = "0.10.0" @@ -5719,20 +3735,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "phf_macros" version = "0.11.3" @@ -5743,16 +3745,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", + "syn", ] [[package]] @@ -5790,7 +3783,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5805,73 +3798,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der", - "spki", -] - [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" -[[package]] -name = "plist" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" -dependencies = [ - "base64 0.22.1", - "indexmap 2.11.4", - "quick-xml 0.38.3", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "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" @@ -5937,9 +3869,9 @@ dependencies = [ [[package]] name = "pq-sys" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "089d5dc8f44104b719912ad4478fd558b59a431ce19ef9101f637be8c656b90a" +checksum = "574ddd6a267294433f140b02a726b0640c43cf7c6f717084684aaa3b285aba61" dependencies = [ "libc", "pkg-config", @@ -5959,73 +3891,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.7", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -6038,7 +3911,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "version_check", "yansi", ] @@ -6080,7 +3953,7 @@ dependencies = [ "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn 2.0.106", + "syn", "tempfile", ] @@ -6094,7 +3967,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6107,7 +3980,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6130,10 +4003,11 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e66fcd288453b748497d8fb18bccc83a16b0518e3906d4b8df0a8d42d93dbb1c" +checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" dependencies = [ + "ar_archive_writer", "cc", ] @@ -6149,7 +4023,7 @@ dependencies = [ "futures-util", "prost 0.13.5", "prost-types 0.13.5", - "reqwest 0.12.23", + "reqwest", "semver", "serde", "serde_json", @@ -6165,6 +4039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", + "serde", ] [[package]] @@ -6174,6 +4049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" dependencies = [ "memchr", + "serde", ] [[package]] @@ -6188,8 +4064,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.32", - "socket2 0.6.0", + "rustls 0.23.34", + "socket2 0.6.1", "thiserror 2.0.17", "tokio", "tracing", @@ -6203,12 +4079,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "slab", "thiserror 2.0.17", @@ -6226,7 +4102,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.0", + "socket2 0.6.1", "tracing", "windows-sys 0.60.2", ] @@ -6252,20 +4128,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - [[package]] name = "rand" version = "0.8.5" @@ -6287,16 +4149,6 @@ dependencies = [ "rand_core 0.9.3", ] -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - [[package]] name = "rand_chacha" version = "0.3.1" @@ -6317,15 +4169,6 @@ dependencies = [ "rand_core 0.9.3", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -6341,25 +4184,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", + "getrandom 0.3.4", ] [[package]] @@ -6368,12 +4193,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - [[package]] name = "redis" version = "0.27.6" @@ -6404,45 +4223,14 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 2.0.17", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "bitflags", ] [[package]] name = "regex" -version = "1.12.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -6452,9 +4240,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -6469,60 +4257,49 @@ checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] -name = "reqwest" -version = "0.11.27" +name = "reqsign" +version = "0.16.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "43451dbf3590a7590684c25fb8d12ecdcc90ed3ac123433e500447c7d77ed701" dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", + "anyhow", + "async-trait", + "base64 0.22.1", + "chrono", + "form_urlencoded", + "getrandom 0.2.16", + "hex", + "hmac", + "home", + "http 1.3.1", "log", - "mime", - "once_cell", "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "rustls-pemfile 1.0.4", + "quick-xml 0.37.5", + "rand 0.8.5", + "reqwest", + "rust-ini", "serde", "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", + "sha1", + "sha2", "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.50.0", ] [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2 0.4.12", @@ -6540,12 +4317,13 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.34", + "rustls-native-certs 0.8.2", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-native-tls", "tokio-rustls 0.26.4", @@ -6561,49 +4339,13 @@ dependencies = [ "webpki-roots 1.0.3", ] -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - -[[package]] -name = "rfd" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" -dependencies = [ - "ashpd", - "block2 0.6.2", - "dispatch2", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "log", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation 0.3.2", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.59.0", -] - [[package]] name = "rhai" version = "1.22.2" source = "git+https://github.com/therealprof/rhai.git?branch=features%2Fuse-web-time#fbf0f4198f2cad20e07ef7c1ceca10b43d69a04b" dependencies = [ "ahash", - "bitflags 2.9.4", + "bitflags", "getrandom 0.2.16", "num-traits", "once_cell", @@ -6621,7 +4363,7 @@ source = "git+https://github.com/therealprof/rhai.git?branch=features%2Fuse-web- dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6639,10 +4381,14 @@ dependencies = [ ] [[package]] -name = "rustc-demangle" -version = "0.1.26" +name = "rust-ini" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] [[package]] name = "rustc-hash" @@ -6665,7 +4411,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -6686,11 +4432,10 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ - "aws-lc-rs", "log", "once_cell", "ring", @@ -6714,9 +4459,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -6744,9 +4489,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -6768,7 +4513,6 @@ version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -6804,63 +4548,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", - "url", - "uuid", -] - -[[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.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.106", -] - -[[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" @@ -6874,12 +4561,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b90460b31bfe1fc07be8262e42c665ad97118d4585869de9345a84d501a9eaf0" dependencies = [ "ahash", - "cssparser 0.31.2", + "cssparser", "ego-tree", "getopts", - "html5ever 0.27.0", + "html5ever", "once_cell", - "selectors 0.25.0", + "selectors", "tendril", ] @@ -6899,27 +4586,13 @@ dependencies = [ "untrusted", ] -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -6932,7 +4605,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.4", + "bitflags", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -6949,32 +4622,14 @@ dependencies = [ "libc", ] -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser 0.29.6", - "derive_more 0.99.20", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc 0.2.0", - "smallvec", -] - [[package]] name = "selectors" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" dependencies = [ - "bitflags 2.9.4", - "cssparser 0.31.2", + "bitflags", + "cssparser", "derive_more 0.99.20", "fxhash", "log", @@ -6982,7 +4637,7 @@ dependencies = [ "phf 0.10.1", "phf_codegen 0.10.0", "precomputed-hash", - "servo_arc 0.3.0", + "servo_arc", "smallvec", ] @@ -6991,10 +4646,6 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] [[package]] name = "serde" @@ -7006,18 +4657,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-untagged" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" -dependencies = [ - "erased-serde", - "serde", - "serde_core", - "typeid", -] - [[package]] name = "serde_core" version = "1.0.228" @@ -7035,18 +4674,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7071,35 +4699,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" -dependencies = [ - "serde_core", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -7112,69 +4711,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.11.4", - "schemars 0.9.0", - "schemars 1.0.4", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "serialize-to-javascript" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" -dependencies = [ - "serde", - "serde_json", - "serialize-to-javascript-impl", -] - -[[package]] -name = "serialize-to-javascript-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - [[package]] name = "servo_arc" version = "0.3.0" @@ -7236,16 +4772,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -7299,12 +4825,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -7318,64 +4844,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "softbuffer" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" -dependencies = [ - "bytemuck", - "cfg_aliases", - "core-graphics", - "foreign-types 0.5.0", - "js-sys", - "log", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-quartz-core 0.2.2", - "raw-window-handle", - "redox_syscall", - "wasm-bindgen", - "web-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -7449,45 +4917,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "swift-rs" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" -dependencies = [ - "base64 0.21.7", - "serde", - "serde_json", -] - [[package]] name = "syn" -version = "1.0.109" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "syn" -version = "2.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" -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" @@ -7505,18 +4945,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys 0.5.0", + "syn", ] [[package]] @@ -7525,19 +4954,9 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.4", + "bitflags", "core-foundation 0.9.4", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -7550,369 +4969,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.2", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.34.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "core-foundation 0.10.1", - "core-graphics", - "crossbeam-channel", - "dispatch", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni", - "lazy_static", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-foundation 0.3.2", - "once_cell", - "parking_lot", - "raw-window-handle", - "scopeguard", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tauri" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9871670c6711f50fddd4e20350be6b9dd6e6c2b5d77d8ee8900eb0d58cd837a" -dependencies = [ - "anyhow", - "bytes", - "cookie 0.18.1", - "dirs", - "dunce", - "embed_plist", - "getrandom 0.3.3", - "glob", - "gtk", - "heck 0.5.0", - "http 1.3.1", - "jni", - "libc", - "log", - "mime", - "muda", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-foundation 0.3.2", - "objc2-ui-kit", - "objc2-web-kit", - "percent-encoding", - "plist", - "raw-window-handle", - "reqwest 0.12.23", - "serde", - "serde_json", - "serde_repr", - "serialize-to-javascript", - "swift-rs", - "tauri-build", - "tauri-macros", - "tauri-runtime", - "tauri-runtime-wry", - "tauri-utils", - "thiserror 2.0.17", - "tokio", - "tray-icon", - "url", - "webkit2gtk", - "webview2-com", - "window-vibrancy", - "windows", -] - -[[package]] -name = "tauri-build" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" -dependencies = [ - "anyhow", - "cargo_toml", - "dirs", - "glob", - "heck 0.5.0", - "json-patch", - "schemars 0.8.22", - "semver", - "serde", - "serde_json", - "tauri-utils", - "tauri-winres", - "toml 0.9.8", - "walkdir", -] - -[[package]] -name = "tauri-codegen" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" -dependencies = [ - "base64 0.22.1", - "brotli", - "ico", - "json-patch", - "plist", - "png", - "proc-macro2", - "quote", - "semver", - "serde", - "serde_json", - "sha2", - "syn 2.0.106", - "tauri-utils", - "thiserror 2.0.17", - "time", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "tauri-codegen", - "tauri-utils", -] - -[[package]] -name = "tauri-plugin" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" -dependencies = [ - "anyhow", - "glob", - "plist", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri-utils", - "toml 0.9.8", - "walkdir", -] - -[[package]] -name = "tauri-plugin-dialog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beee42a4002bc695550599b011728d9dfabf82f767f134754ed6655e434824e" -dependencies = [ - "log", - "raw-window-handle", - "rfd", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "tauri-plugin-fs", - "thiserror 2.0.17", - "url", -] - -[[package]] -name = "tauri-plugin-fs" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7" -dependencies = [ - "anyhow", - "dunce", - "glob", - "percent-encoding", - "schemars 0.8.22", - "serde", - "serde_json", - "serde_repr", - "tauri", - "tauri-plugin", - "tauri-utils", - "thiserror 2.0.17", - "toml 0.9.8", - "url", -] - -[[package]] -name = "tauri-plugin-opener" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786156aa8e89e03d271fbd3fe642207da8e65f3c961baa9e2930f332bf80a1f5" -dependencies = [ - "dunce", - "glob", - "objc2-app-kit", - "objc2-foundation 0.3.2", - "open", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "thiserror 2.0.17", - "url", - "windows", - "zbus", -] - -[[package]] -name = "tauri-runtime" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" -dependencies = [ - "cookie 0.18.1", - "dpi", - "gtk", - "http 1.3.1", - "jni", - "objc2 0.6.3", - "objc2-ui-kit", - "objc2-web-kit", - "raw-window-handle", - "serde", - "serde_json", - "tauri-utils", - "thiserror 2.0.17", - "url", - "webkit2gtk", - "webview2-com", - "windows", -] - -[[package]] -name = "tauri-runtime-wry" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" -dependencies = [ - "gtk", - "http 1.3.1", - "jni", - "log", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-foundation 0.3.2", - "once_cell", - "percent-encoding", - "raw-window-handle", - "softbuffer", - "tao", - "tauri-runtime", - "tauri-utils", - "url", - "webkit2gtk", - "webview2-com", - "windows", - "wry", -] - -[[package]] -name = "tauri-utils" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" -dependencies = [ - "anyhow", - "brotli", - "cargo_metadata", - "ctor", - "dunce", - "glob", - "html5ever 0.29.1", - "http 1.3.1", - "infer", - "json-patch", - "kuchikiki", - "log", - "memchr", - "phf 0.11.3", - "proc-macro2", - "quote", - "regex", - "schemars 0.8.22", - "semver", - "serde", - "serde-untagged", - "serde_json", - "serde_with", - "swift-rs", - "thiserror 2.0.17", - "toml 0.9.8", - "url", - "urlpattern", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-winres" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" -dependencies = [ - "embed-resource", - "toml 0.9.8", -] - [[package]] name = "tempfile" version = "3.23.0" @@ -7920,7 +4976,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "rustix", "windows-sys 0.61.2", @@ -7946,6 +5002,28 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "test-log" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e33b98a582ea0be1168eba097538ee8dd4bbe0f2b01b22ac92ea30054e5be7b" +dependencies = [ + "env_logger", + "test-log-macros", + "tracing-subscriber", +] + +[[package]] +name = "test-log-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thin-vec" version = "0.2.14" @@ -7978,7 +5056,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -7989,7 +5067,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8068,34 +5146,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8124,7 +5198,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.34", "tokio", ] @@ -8164,102 +5238,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" -dependencies = [ - "indexmap 2.11.4", - "serde_core", - "serde_spanned 1.0.3", - "toml_datetime 0.7.3", - "toml_parser", - "toml_writer", - "winnow 0.7.13", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap 2.11.4", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.23.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" -dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.7.3", - "toml_parser", - "winnow 0.7.13", -] - -[[package]] -name = "toml_parser" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" -dependencies = [ - "winnow 0.7.13", -] - -[[package]] -name = "toml_writer" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" - [[package]] name = "tonic" version = "0.12.3" @@ -8282,7 +5260,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost 0.13.5", - "rustls-native-certs 0.8.1", + "rustls-native-certs 0.8.2", "rustls-pemfile 2.2.0", "socket2 0.5.10", "tokio", @@ -8323,7 +5301,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -8335,7 +5313,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.4", + "bitflags", "bytes", "futures-util", "http 1.3.1", @@ -8379,7 +5357,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -8409,36 +5387,18 @@ version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex-automata", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] -[[package]] -name = "tray-icon" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.2", - "once_cell", - "png", - "serde", - "thiserror 2.0.17", - "windows-sys 0.60.2", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -8496,70 +5456,12 @@ dependencies = [ "pom", ] -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-ident" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - [[package]] name = "unicode-bidi" version = "0.3.18" @@ -8568,9 +5470,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-normalization" @@ -8587,12 +5489,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-width" version = "0.2.2" @@ -8637,7 +5533,7 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "socks", "url", @@ -8654,7 +5550,7 @@ dependencies = [ "flate2", "log", "percent-encoding", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pemfile 2.2.0", "rustls-pki-types", "ureq-proto", @@ -8692,18 +5588,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "urlpattern" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" -dependencies = [ - "regex", - "serde", - "unic-ucd-ident", - "url", -] - [[package]] name = "utf-8" version = "0.7.6" @@ -8728,7 +5612,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "js-sys", "serde", "wasm-bindgen", @@ -8746,12 +5630,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - [[package]] name = "version_check" version = "0.9.5" @@ -8764,26 +5642,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "walkdir" version = "2.5.0" @@ -8803,27 +5661,12 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -8835,9 +5678,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -8846,25 +5689,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -8875,9 +5704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8885,22 +5714,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -8918,71 +5747,11 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs 1.2.1", - "rustix", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.9.4", - "rustix", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.9.4", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml 0.37.5", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "pkg-config", -] - [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -8998,50 +5767,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webkit2gtk" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - [[package]] name = "webpki-roots" version = "0.26.11" @@ -9062,69 +5787,34 @@ dependencies = [ [[package]] name = "webrtc-sys" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3427b276be65e4018ff02886221b8f4aefafca22b36d0748dc3e795b1679dcca" +checksum = "96fa109636ee0a2aeb84988208f266335ab7480dcdd2881234d795866773e529" dependencies = [ "cc", "cxx", "cxx-build", "glob", "log", + "pkg-config", "webrtc-sys-build", ] [[package]] name = "webrtc-sys-build" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a265f069d8fedb448d206b51554000a45d1f09b2efc62b57ef4deb6fd2384f8c" +checksum = "0acd1d2d3b5df7badd0fb0c2aec1efbbc3a09993c7aa0821bcf43412e2ee5772" dependencies = [ "anyhow", "fs2", "regex", - "reqwest 0.11.27", + "reqwest", "scratch", "semver", "zip 0.6.6", ] -[[package]] -name = "webview2-com" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core 0.61.2", - "windows-implement", - "windows-interface", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" -dependencies = [ - "thiserror 2.0.17", - "windows", - "windows-core 0.61.2", -] - [[package]] name = "weezl" version = "0.1.10" @@ -9173,56 +5863,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "window-vibrancy" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" -dependencies = [ - "objc2 0.6.3", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation 0.3.2", - "raw-window-handle", - "windows-sys 0.59.0", - "windows-version", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - [[package]] name = "windows-core" version = "0.62.2" @@ -9236,17 +5876,6 @@ dependencies = [ "windows-strings 0.5.1", ] -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", -] - [[package]] name = "windows-implement" version = "0.60.2" @@ -9255,7 +5884,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -9266,7 +5895,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -9281,16 +5910,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - [[package]] name = "windows-registry" version = "0.5.3" @@ -9347,15 +5966,6 @@ dependencies = [ "windows-targets 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -9407,21 +6017,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -9455,36 +6050,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -9503,12 +6074,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -9527,12 +6092,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -9563,12 +6122,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -9587,12 +6140,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -9611,12 +6158,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -9635,12 +6176,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -9653,34 +6188,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "winreg" version = "0.55.0" @@ -9709,72 +6216,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" -[[package]] -name = "wry" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" -dependencies = [ - "base64 0.22.1", - "block2 0.6.2", - "cookie 0.18.1", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gdkx11", - "gtk", - "html5ever 0.29.1", - "http 1.3.1", - "javascriptcore-rs", - "jni", - "kuchikiki", - "libc", - "ndk", - "objc2 0.6.3", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation 0.3.2", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.17", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - [[package]] name = "xmlparser" version = "0.13.6" @@ -9816,72 +6257,10 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "synstructure", ] -[[package]] -name = "zbus" -version = "5.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" -dependencies = [ - "async-broadcast", - "async-executor", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-lite", - "hex", - "nix", - "ordered-stream", - "serde", - "serde_repr", - "tokio", - "tracing", - "uds_windows", - "uuid", - "windows-sys 0.61.2", - "winnow 0.7.13", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "5.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" -dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "zbus_names", - "zvariant", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" -dependencies = [ - "serde", - "static_assertions", - "winnow 0.7.13", - "zvariant", -] - [[package]] name = "zerocopy" version = "0.8.27" @@ -9899,7 +6278,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -9919,7 +6298,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "synstructure", ] @@ -9940,7 +6319,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -9973,7 +6352,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -10011,9 +6390,9 @@ dependencies = [ "deflate64", "displaydoc", "flate2", - "getrandom 0.3.3", + "getrandom 0.3.4", "hmac", - "indexmap 2.11.4", + "indexmap 2.12.0", "lzma-rs", "memchr", "pbkdf2 0.12.2", @@ -10084,44 +6463,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[package]] -name = "zvariant" -version = "5.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" -dependencies = [ - "endi", - "enumflags2", - "serde", - "url", - "winnow 0.7.13", - "zvariant_derive", - "zvariant_utils", -] - -[[package]] -name = "zvariant_derive" -version = "5.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" -dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.106", - "winnow 0.7.13", -] diff --git a/Cargo.toml b/Cargo.toml index 91df33bca..4382f9460 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,12 +37,10 @@ license = "AGPL-3.0" repository = "https://github.com/GeneralBots/BotServer" [features] -desktop = ["tauri", "tauri-plugin-opener", "tauri-plugin-dialog"] default = [ "vectordb"] vectordb = ["qdrant-client"] email = ["imap"] web_automation = ["headless_chrome"] -webapp = ["tauri", "tauri-plugin-opener", "tauri-plugin-dialog"] [dependencies] actix-cors = "0.7" @@ -90,21 +88,15 @@ urlencoding = "2.1" uuid = { version = "1.11", features = ["serde", "v4"] } zip = "2.2" time = "0.3.44" -aws-sdk-s3 = { version = "1.108.0", features = ["behavior-version-latest"] } +opendal = { version = "0.54.1", features = ["services-s3"] } headless_chrome = { version = "1.0.18", optional = true } rand = "0.9.2" pdf-extract = "0.10.0" -scraper = "0.20" +scraper = "0.20" sha2 = "0.10.9" ureq = "3.1.2" indicatif = "0.18.0" -tauri = { version = "2", features = ["unstable"], optional = true } -tauri-plugin-opener = { version = "2", optional = true } -tauri-plugin-dialog = { version = "2", optional = true } - -[build-dependencies] -tauri-build = { version = "2", features = [] } [profile.release] lto = true # Enables Link-Time Optimization diff --git a/src/automation/mod.rs b/src/automation/mod.rs index b9a287601..c394b81ad 100644 --- a/src/automation/mod.rs +++ b/src/automation/mod.rs @@ -342,7 +342,7 @@ impl AutomationService { trace!("Downloading from bucket={} key={}", bucket_name, s3_key); - match s3_client + match s3_client. .get_object() .bucket(&bucket_name) .key(&s3_key) diff --git a/templates/announcements.gbai/announcements.gbdialog/auth.bas b/templates/announcements.gbai/announcements.gbdialog/auth.bas index fa57e7bc2..e69de29bb 100644 --- a/templates/announcements.gbai/announcements.gbdialog/auth.bas +++ b/templates/announcements.gbai/announcements.gbdialog/auth.bas @@ -1,67 +0,0 @@ -REM Simple KISS authentication - signup/login only, no recovery -REM This script is called when user needs authentication - -TALK "Welcome! Please choose an option:" -TALK "Type 'signup' to create a new account" -TALK "Type 'login' to access your existing account" - -HEAR choice - -IF choice = "signup" THEN - TALK "Great! Let's create your account." - TALK "Enter your email:" - HEAR email - - TALK "Enter your password:" - HEAR password - - TALK "Confirm your password:" - HEAR confirm_password - - IF password <> confirm_password THEN - TALK "Passwords don't match. Please try again." - RETURN false - END IF - - REM Create user in database - LET user_id = GENERATE_UUID() - LET result = EXEC "INSERT INTO users (id, email, password_hash, created_at) VALUES (?, ?, ?, NOW())", user_id, email, SHA256(password) - - IF result > 0 THEN - SET_USER user_id - TALK "Account created successfully! You are now logged in." - RETURN true - ELSE - TALK "Error creating account. Email may already exist." - RETURN false - END IF - -ELSE IF choice = "login" THEN - TALK "Please enter your email:" - HEAR email - - TALK "Enter your password:" - HEAR password - - REM Query user from database - LET user = FIND "users", "email=" + email - - IF user = NULL THEN - TALK "Invalid email or password." - RETURN false - END IF - - LET password_hash = SHA256(password) - IF user.password_hash = password_hash THEN - SET_USER user.id - TALK "Welcome back! You are now logged in." - RETURN true - ELSE - TALK "Invalid email or password." - RETURN false - END IF - -ELSE - TALK "Invalid option. Please type 'signup' or 'login'." - RETURN false -END IF diff --git a/templates/announcements.gbai/announcements.gbdialog/start.bas b/templates/announcements.gbai/announcements.gbdialog/start.bas index 687c70e3d..7a5f9df5f 100644 --- a/templates/announcements.gbai/announcements.gbdialog/start.bas +++ b/templates/announcements.gbai/announcements.gbdialog/start.bas @@ -1,16 +1,9 @@ -REM start.bas - Runs automatically when user connects via web -REM This is the entry point for each session - LET resume = GET_BOT_MEMORY("resume") IF resume <> "" THEN TALK resume -ELSE - TALK "Welcome! I'm loading the latest information..." END IF -REM Add knowledge base for weekly announcements ADD_KB "weekly" TALK "You can ask me about any of the announcements or circulars." -TALK "If you'd like to login or signup, just type 'auth'." From 5d381df0ea96de99d34ca36633ed4dc7ded075e3 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 12:44:28 -0300 Subject: [PATCH 03/16] refactor: update directory inclusion in add-req.sh and fix-errors.sh for clarity --- add-req.sh | 4 +-- docs/src/chapter-06/building.md | 53 ++++++++++++++++++++++++++++++++- fix-errors.sh | 41 +++++++++++++------------ 3 files changed, 76 insertions(+), 22 deletions(-) diff --git a/add-req.sh b/add-req.sh index 142dc9306..7b50bef5c 100755 --- a/add-req.sh +++ b/add-req.sh @@ -37,8 +37,8 @@ dirs=( # "session" "file" "kb" - # "shared" - # "tests" + "shared" + "tests" # "tools" # "web_automation" # "whatsapp" diff --git a/docs/src/chapter-06/building.md b/docs/src/chapter-06/building.md index f195be32f..7a9f40d81 100644 --- a/docs/src/chapter-06/building.md +++ b/docs/src/chapter-06/building.md @@ -1 +1,52 @@ -# Building from Source +# Brave + +sudo apt install brave-browser-beta + +# Rust + + +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +source "$HOME/.cargo/env" +git clone https://alm.pragmatismo.com.br/generalbots/gbserver + +apt install -y build-essential \ + pkg-config \ + libssl-dev \ + gcc-multilib \ + g++-multilib \ + clang \ + lld \ + binutils-dev \ + libudev-dev \ + libdbus-1-dev + + + + +# LLM + +ZED for Windows: https://zed.dev/windows + +Zed Assistant: Groq + GPT OSS 120B | +FIX Manual: DeepSeek | ChatGPT 120B | Claude 4.5 Thinking | Mistral +ADD Manual: Claude/DeepSeek -> DeepSeek + +# Install + + +cargo install cargo-audit +cargo install cargo-edit +apt install -y libpq-dev +apt install -y valkey-cli + +# Util + +cargo upgrade +cargo audit + +valkey-cli -p 6379 monitor + +# Prompt add-ons + +- Prompt add-ons: Fill the file with info!, trace! and debug! macros. +- \ No newline at end of file diff --git a/fix-errors.sh b/fix-errors.sh index e3c276f7f..52e53ef44 100755 --- a/fix-errors.sh +++ b/fix-errors.sh @@ -18,26 +18,29 @@ for file in "${prompts[@]}"; do done dirs=( - #"auth" - #"automation" - #"basic" - #"bot" - "bootstrap" - #"channels" - "config" - #"context" - #"email" - #"file" - #"llm" - #"llm_legacy" - #"org" - "package_manager" - #"session" + # "auth" + "automation" + "basic" + # "bot" + "bootstrap" + # "package_manager" + # "channels" + # "config" + # "context" + # "email" + # "file" + # "llm" + "drive_monitor" + # "llm_legacy" + # "org" + # "session" + "file" + "kb" "shared" - #"tests" - #"tools" - #"web_automation" - #"whatsapp" + "tests" + # "tools" + # "web_automation" + # "whatsapp" ) for dir in "${dirs[@]}"; do find "$PROJECT_ROOT/src/$dir" -name "*.rs" | while read file; do From 978d7c3e3a8696ae63824638058b64f092f17497 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 12:45:28 -0300 Subject: [PATCH 04/16] refactor: remove aws-config dependency from Cargo.toml --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4382f9460..201579f02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,6 @@ web_automation = ["headless_chrome"] [dependencies] actix-cors = "0.7" -aws-config = "0.57.0" csv = "1.3" actix-multipart = "0.7" imap = { version = "3.0.0-alpha.15", optional = true } From 4bba9cb268a988b43aa3569a51fb4387980160de Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 13:04:04 -0300 Subject: [PATCH 05/16] refactor: update building instructions to include additional dependencies for improved compatibility --- Cargo.lock | 522 ++------------------------------ docs/src/chapter-06/building.md | 38 ++- 2 files changed, 69 insertions(+), 491 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf99a7f4f..14e940331 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -518,311 +518,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "aws-config" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bf00cb9416daab4ce4927c54ebe63c08b9caf4d7b9314b6d7a4a2c5a1afb09" -dependencies = [ - "aws-credential-types", - "aws-http", - "aws-runtime", - "aws-sdk-sso", - "aws-sdk-ssooidc", - "aws-sdk-sts", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "fastrand", - "hex", - "http 0.2.12", - "hyper 0.14.32", - "ring", - "time", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-credential-types" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9073c88dbf12f68ce7d0e149f989627a1d1ae3d2b680459f04ccc29d1cbd0f" -dependencies = [ - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "zeroize", -] - -[[package]] -name = "aws-http" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24067106d09620cf02d088166cdaedeaca7146d4d499c41b37accecbea11b246" -dependencies = [ - "aws-smithy-http", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "http 0.2.12", - "http-body 0.4.6", - "pin-project-lite", - "tracing", -] - -[[package]] -name = "aws-runtime" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6ee0152c06d073602236a4e94a8c52a327d310c1ecd596570ce795af8777ff" -dependencies = [ - "aws-credential-types", - "aws-http", - "aws-sigv4", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "fastrand", - "http 0.2.12", - "percent-encoding", - "tracing", - "uuid", -] - -[[package]] -name = "aws-sdk-sso" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb8158015232b4596ccef74a205600398e152d704b40b7ec9f486092474d7fa" -dependencies = [ - "aws-credential-types", - "aws-http", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "http 0.2.12", - "regex", - "tracing", -] - -[[package]] -name = "aws-sdk-ssooidc" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a1493e1c57f173e53621935bfb5b6217376168dbdb4cd459aebcf645924a48" -dependencies = [ - "aws-credential-types", - "aws-http", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-types", - "bytes", - "http 0.2.12", - "regex", - "tracing", -] - -[[package]] -name = "aws-sdk-sts" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e032b77f5cd1dd3669d777a38ac08cbf8ec68e29460d4ef5d3e50cffa74ec75a" -dependencies = [ - "aws-credential-types", - "aws-http", - "aws-runtime", - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-json", - "aws-smithy-query", - "aws-smithy-runtime", - "aws-smithy-runtime-api", - "aws-smithy-types", - "aws-smithy-xml", - "aws-types", - "http 0.2.12", - "regex", - "tracing", -] - -[[package]] -name = "aws-sigv4" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f81a6abc4daab06b53cabf27c54189928893283093e37164ca53aa47488a5b" -dependencies = [ - "aws-credential-types", - "aws-smithy-http", - "aws-smithy-runtime-api", - "bytes", - "form_urlencoded", - "hex", - "hmac", - "http 0.2.12", - "once_cell", - "percent-encoding", - "regex", - "sha2", - "time", - "tracing", -] - -[[package]] -name = "aws-smithy-async" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe53fccd3b10414b9cae63767a15a2789b34e6c6727b6e32b33e8c7998a3e80" -dependencies = [ - "futures-util", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "aws-smithy-http" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7972373213d1d6e619c0edc9dda2d6634154e4ed75c5e0b2bf065cd5ec9f0d1" -dependencies = [ - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http-body 0.4.6", - "once_cell", - "percent-encoding", - "pin-project-lite", - "pin-utils", - "tracing", -] - -[[package]] -name = "aws-smithy-json" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d64d5af16dd585de9ff6c606423c1aaad47c6baa38de41c2beb32ef21c6645" -dependencies = [ - "aws-smithy-types", -] - -[[package]] -name = "aws-smithy-query" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7527bf5335154ba1b285479c50b630e44e93d1b4a759eaceb8d0bf9fbc82caa5" -dependencies = [ - "aws-smithy-types", - "urlencoding", -] - -[[package]] -name = "aws-smithy-runtime" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839b363adf3b2bdab2742a1f540fec23039ea8bc9ec0f9f61df48470cfe5527b" -dependencies = [ - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-runtime-api", - "aws-smithy-types", - "bytes", - "fastrand", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "once_cell", - "pin-project-lite", - "pin-utils", - "rustls 0.21.12", - "tokio", - "tracing", -] - -[[package]] -name = "aws-smithy-runtime-api" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24ecc446e62c3924539e7c18dec8038dba4fdf8718d5c2de62f9d2fecca8ba9" -dependencies = [ - "aws-smithy-async", - "aws-smithy-types", - "bytes", - "http 0.2.12", - "pin-project-lite", - "tokio", - "tracing", - "zeroize", -] - -[[package]] -name = "aws-smithy-types" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051de910296522a21178a2ea402ea59027eef4b63f1cef04a0be2bb5e25dea03" -dependencies = [ - "base64-simd", - "bytes", - "bytes-utils", - "futures-core", - "http 0.2.12", - "http-body 0.4.6", - "itoa", - "num-integer", - "pin-project-lite", - "pin-utils", - "ryu", - "serde", - "time", -] - -[[package]] -name = "aws-smithy-xml" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb1e3ac22c652662096c8e37a6f9af80c6f3520cab5610b2fe76c725bce18eac" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "aws-types" -version = "0.57.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048bbf1c24cdf4eb1efcdc243388a93a90ebf63979e25fc1c7b8cbd9cb6beb38" -dependencies = [ - "aws-credential-types", - "aws-smithy-async", - "aws-smithy-runtime-api", - "aws-smithy-types", - "http 0.2.12", - "rustc_version", - "tracing", -] - [[package]] name = "axum" version = "0.7.9" @@ -834,7 +529,7 @@ dependencies = [ "bytes", "futures-util", "http 1.3.1", - "http-body 1.0.1", + "http-body", "http-body-util", "itoa", "matchit", @@ -860,7 +555,7 @@ dependencies = [ "bytes", "futures-util", "http 1.3.1", - "http-body 1.0.1", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -893,16 +588,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64-simd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" -dependencies = [ - "outref", - "vsimd", -] - [[package]] name = "base64ct" version = "1.8.0" @@ -965,7 +650,6 @@ dependencies = [ "argon2", "async-stream", "async-trait", - "aws-config", "base64 0.22.1", "bytes", "chrono", @@ -1062,16 +746,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - [[package]] name = "bytestring" version = "1.5.0" @@ -2356,17 +2030,6 @@ 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" @@ -2386,7 +2049,7 @@ dependencies = [ "bytes", "futures-core", "http 1.3.1", - "http-body 1.0.1", + "http-body", "pin-project-lite", ] @@ -2402,30 +2065,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[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.7.0" @@ -2438,7 +2077,7 @@ dependencies = [ "futures-core", "h2 0.4.12", "http 1.3.1", - "http-body 1.0.1", + "http-body", "httparse", "httpdate", "itoa", @@ -2449,22 +2088,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" @@ -2472,13 +2095,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", - "hyper 1.7.0", + "hyper", "hyper-util", - "rustls 0.23.34", - "rustls-native-certs 0.8.2", + "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots 1.0.3", ] @@ -2489,7 +2112,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.7.0", + "hyper", "hyper-util", "pin-project-lite", "tokio", @@ -2504,7 +2127,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.7.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2524,8 +2147,8 @@ dependencies = [ "futures-core", "futures-util", "http 1.3.1", - "http-body 1.0.1", - "hyper 1.7.0", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", @@ -3436,7 +3059,7 @@ dependencies = [ "futures", "getrandom 0.2.16", "http 1.3.1", - "http-body 1.0.1", + "http-body", "log", "md-5", "percent-encoding", @@ -3527,12 +3150,6 @@ dependencies = [ "syn", ] -[[package]] -name = "outref" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" - [[package]] name = "parking_lot" version = "0.12.5" @@ -4064,7 +3681,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.34", + "rustls", "socket2 0.6.1", "thiserror 2.0.17", "tokio", @@ -4084,7 +3701,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.34", + "rustls", "rustls-pki-types", "slab", "thiserror 2.0.17", @@ -4304,10 +3921,10 @@ dependencies = [ "futures-util", "h2 0.4.12", "http 1.3.1", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.7.0", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "js-sys", @@ -4317,8 +3934,8 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.34", - "rustls-native-certs 0.8.2", + "rustls", + "rustls-native-certs", "rustls-pki-types", "serde", "serde_json", @@ -4326,7 +3943,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.4", + "tokio-rustls", "tokio-util", "tower 0.5.2", "tower-http", @@ -4418,18 +4035,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.34" @@ -4440,23 +4045,11 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.7", + "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework 2.11.1", -] - [[package]] name = "rustls-native-certs" version = "0.8.2" @@ -4469,15 +4062,6 @@ dependencies = [ "security-framework 3.5.1", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4497,16 +4081,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "rustls-webpki" version = "0.103.7" @@ -4576,16 +4150,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "security-framework" version = "2.11.1" @@ -5182,23 +4746,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.34", + "rustls", "tokio", ] @@ -5252,19 +4806,19 @@ dependencies = [ "flate2", "h2 0.4.12", "http 1.3.1", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.7.0", + "hyper", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost 0.13.5", - "rustls-native-certs 0.8.2", - "rustls-pemfile 2.2.0", + "rustls-native-certs", + "rustls-pemfile", "socket2 0.5.10", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -5317,7 +4871,7 @@ dependencies = [ "bytes", "futures-util", "http 1.3.1", - "http-body 1.0.1", + "http-body", "iri-string", "pin-project-lite", "tower 0.5.2", @@ -5533,7 +5087,7 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls 0.23.34", + "rustls", "rustls-pki-types", "socks", "url", @@ -5550,8 +5104,8 @@ dependencies = [ "flate2", "log", "percent-encoding", - "rustls 0.23.34", - "rustls-pemfile 2.2.0", + "rustls", + "rustls-pemfile", "rustls-pki-types", "ureq-proto", "utf-8", @@ -5636,12 +5190,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vsimd" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" - [[package]] name = "walkdir" version = "2.5.0" @@ -6216,12 +5764,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" -[[package]] -name = "xmlparser" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" - [[package]] name = "xz2" version = "0.1.7" diff --git a/docs/src/chapter-06/building.md b/docs/src/chapter-06/building.md index 7a9f40d81..2b25b59ec 100644 --- a/docs/src/chapter-06/building.md +++ b/docs/src/chapter-06/building.md @@ -18,8 +18,44 @@ apt install -y build-essential \ lld \ binutils-dev \ libudev-dev \ - libdbus-1-dev + libdbus-1-dev \ + libva-dev +apt install -y \ + curl \ + git \ + python3 \ + python3-pip \ + pkg-config \ + libssl-dev \ + libasound2-dev \ + libpulse-dev \ + libx11-dev \ + libxext-dev \ + libxrandr-dev \ + libxcomposite-dev \ + libxcursor-dev \ + libxi-dev \ + libxtst-dev \ + libnss3-dev \ + libnspr4-dev \ + libatk-bridge2.0-dev \ + libgtk-3-dev \ + libudev-dev \ + libavcodec-dev \ + libavformat-dev \ + libavutil-dev \ + libswscale-dev \ + libevent-dev \ + libjsoncpp-dev \ + libopus-dev \ + libvpx-dev \ + libsrtp2-dev \ + protobuf-compiler \ + ninja-build \ + cmake \ + clang \ + lld From e517dfec480eb46424b6a7d237ad23b20b58b0b1 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 14:00:52 -0300 Subject: [PATCH 06/16] - Migration to Apache OpenDAL. --- src/automation/mod.rs | 56 ++--- src/basic/keywords/get.rs | 24 +- src/bootstrap/mod.rs | 450 ++++++++++++++------------------------ src/drive_monitor/mod.rs | 305 ++++++-------------------- src/file/mod.rs | 118 +++------- src/kb/minio_handler.rs | 104 ++------- src/kb/mod.rs | 131 +++-------- src/main.rs | 35 +-- src/shared/state.rs | 10 +- 9 files changed, 355 insertions(+), 878 deletions(-) diff --git a/src/automation/mod.rs b/src/automation/mod.rs index c394b81ad..13035db48 100644 --- a/src/automation/mod.rs +++ b/src/automation/mod.rs @@ -331,8 +331,7 @@ impl AutomationService { e ); - // Try to download from MinIO - if let Some(s3_client) = &self.state.s3_client { + if let Some(s3_operator) = &self.state.s3_operator { let bucket_name = format!( "{}{}.gbai", env::var("MINIO_ORG_PREFIX").unwrap_or_else(|_| "org1_".to_string()), @@ -342,47 +341,26 @@ impl AutomationService { trace!("Downloading from bucket={} key={}", bucket_name, s3_key); - match s3_client. - .get_object() - .bucket(&bucket_name) - .key(&s3_key) - .send() - .await - { - Ok(response) => { - match response.body.collect().await { - Ok(data) => { - match String::from_utf8(data.into_bytes().to_vec()) { - Ok(content) => { - info!("Downloaded script '{}' from MinIO", param); + match s3_operator.read(&format!("{}/{}", bucket_name, s3_key)).await { + Ok(data) => { + let bytes: Vec = data.to_vec(); + match String::from_utf8(bytes) { + Ok(content) => { + info!("Downloaded script '{}' from MinIO", param); - // Save to local cache - if let Err(e) = - std::fs::create_dir_all(&self.scripts_dir) - { - warn!("Failed to create scripts directory: {}", e); - } else if let Err(e) = - tokio::fs::write(&full_path, &content).await - { - warn!("Failed to cache script locally: {}", e); - } else { - trace!("Cached script to {}", full_path.display()); - } - - content - } - Err(e) => { - error!("Failed to decode script {}: {}", param, e); - self.cleanup_job_flag(&bot_id, param).await; - return; - } + // Save to local cache + if let Err(e) = std::fs::create_dir_all(&self.scripts_dir) { + warn!("Failed to create scripts directory: {}", e); + } else if let Err(e) = tokio::fs::write(&full_path, &content).await { + warn!("Failed to cache script locally: {}", e); + } else { + trace!("Cached script to {}", full_path.display()); } + + content } Err(e) => { - error!( - "Failed to read script body from MinIO {}: {}", - param, e - ); + error!("Failed to decode script {}: {}", param, e); self.cleanup_job_flag(&bot_id, param).await; return; } diff --git a/src/basic/keywords/get.rs b/src/basic/keywords/get.rs index a83d42199..5b81b641c 100644 --- a/src/basic/keywords/get.rs +++ b/src/basic/keywords/get.rs @@ -160,11 +160,11 @@ pub async fn get_from_bucket( return Err("Invalid file path".into()); } - let s3_client = match &state.s3_client { - Some(client) => client, + let s3_operator = match &state.s3_operator { + Some(operator) => operator, None => { - error!("S3 client not configured"); - return Err("S3 client not configured".into()); + error!("S3 operator not configured"); + return Err("S3 operator not configured".into()); } }; @@ -189,19 +189,11 @@ pub async fn get_from_bucket( bucket }; - match s3_client.head_bucket().bucket(&bucket_name).send().await { - Ok(_) => debug!("Bucket exists: {}", bucket_name), - Err(e) => { - error!("Bucket inaccessible: {} - {}", bucket_name, e); - return Err(format!("Bucket inaccessible: {}", e).into()); - } - } - let get_object_future = s3_client - .get_object() - .bucket(&bucket_name) - .key(file_path) - .send(); +let get_object_future = s3_operator + .read(&bucket_name) + .key(file_path) + .send(); let response = match tokio::time::timeout(Duration::from_secs(30), get_object_future).await { Ok(Ok(response)) => response, diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index dcc7f3c2c..74699064c 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -1,18 +1,19 @@ use crate::config::AppConfig; -use crate::package_manager::{ InstallMode, PackageManager }; +use crate::package_manager::{InstallMode, PackageManager}; use anyhow::Result; +use csv; use diesel::connection::SimpleConnection; use diesel::Connection; -use dotenvy::dotenv; -use log::{ info, trace, error }; -use aws_sdk_s3::Client as S3Client; -use csv; use diesel::RunQueryDsl; +use dotenvy::dotenv; +use log::{error, info, trace}; +use opendal::services::S3; +use opendal::{Operator, OperatorBuilder}; use rand::distr::Alphanumeric; -use sha2::{ Digest, Sha256 }; +use sha2::{Digest, Sha256}; +use std::io::{self, Write}; use std::path::Path; use std::process::Command; -use std::io::{ self, Write }; pub struct ComponentInfo { pub name: &'static str, @@ -26,10 +27,9 @@ pub struct BootstrapManager { impl BootstrapManager { pub fn new(install_mode: InstallMode, tenant: Option) -> Self { - trace!( + info!( "Initializing BootstrapManager with mode {:?} and tenant {:?}", - install_mode, - tenant + install_mode, tenant ); Self { install_mode, @@ -40,87 +40,135 @@ impl BootstrapManager { pub fn start_all(&mut self) -> Result<()> { let pm = PackageManager::new(self.install_mode.clone(), self.tenant.clone())?; let components = vec![ - ComponentInfo { name: "tables", termination_command: "pg_ctl" }, - ComponentInfo { name: "cache", termination_command: "valkey-server" }, - ComponentInfo { name: "drive", termination_command: "minio" }, - ComponentInfo { name: "llm", termination_command: "llama-server" }, - ComponentInfo { name: "email", termination_command: "stalwart" }, - ComponentInfo { name: "proxy", termination_command: "caddy" }, - ComponentInfo { name: "directory", termination_command: "zitadel" }, - ComponentInfo { name: "alm", termination_command: "forgejo" }, - ComponentInfo { name: "alm_ci", termination_command: "forgejo-runner" }, - ComponentInfo { name: "dns", termination_command: "coredns" }, - ComponentInfo { name: "webmail", termination_command: "php" }, - ComponentInfo { name: "meeting", termination_command: "livekit-server" }, - ComponentInfo { name: "table_editor", termination_command: "nocodb" }, - ComponentInfo { name: "doc_editor", termination_command: "coolwsd" }, - ComponentInfo { name: "desktop", termination_command: "xrdp" }, - ComponentInfo { name: "devtools", termination_command: "" }, - ComponentInfo { name: "bot", termination_command: "" }, - ComponentInfo { name: "system", termination_command: "" }, - ComponentInfo { name: "vector_db", termination_command: "qdrant" }, - ComponentInfo { name: "host", termination_command: "" } + ComponentInfo { + name: "tables", + termination_command: "pg_ctl", + }, + ComponentInfo { + name: "cache", + termination_command: "valkey-server", + }, + ComponentInfo { + name: "drive", + termination_command: "minio", + }, + ComponentInfo { + name: "llm", + termination_command: "llama-server", + }, + ComponentInfo { + name: "email", + termination_command: "stalwart", + }, + ComponentInfo { + name: "proxy", + termination_command: "caddy", + }, + ComponentInfo { + name: "directory", + termination_command: "zitadel", + }, + ComponentInfo { + name: "alm", + termination_command: "forgejo", + }, + ComponentInfo { + name: "alm_ci", + termination_command: "forgejo-runner", + }, + ComponentInfo { + name: "dns", + termination_command: "coredns", + }, + ComponentInfo { + name: "webmail", + termination_command: "php", + }, + ComponentInfo { + name: "meeting", + termination_command: "livekit-server", + }, + ComponentInfo { + name: "table_editor", + termination_command: "nocodb", + }, + ComponentInfo { + name: "doc_editor", + termination_command: "coolwsd", + }, + ComponentInfo { + name: "desktop", + termination_command: "xrdp", + }, + ComponentInfo { + name: "devtools", + termination_command: "", + }, + ComponentInfo { + name: "bot", + termination_command: "", + }, + ComponentInfo { + name: "system", + termination_command: "", + }, + ComponentInfo { + name: "vector_db", + termination_command: "qdrant", + }, + ComponentInfo { + name: "host", + termination_command: "", + }, ]; for component in components { if pm.is_installed(component.name) { - trace!("Starting component: {}", component.name); pm.start(component.name)?; } else { - trace!("Component {} not installed, skipping start", component.name); if let Err(e) = self.update_bot_config(component.name) { error!( "Failed to update bot config after installing {}: {}", - component.name, - e + component.name, e ); } } } + Ok(()) } pub fn bootstrap(&mut self) -> Result { - // Check for legacy mode - if TABLES_SERVER is present, skip bootstrap if let Ok(tables_server) = std::env::var("TABLES_SERVER") { if !tables_server.is_empty() { - trace!( + info!( "Legacy mode detected (TABLES_SERVER present), skipping bootstrap installation" ); - info!("Running in legacy mode with existing database configuration"); - - // Try to connect to the database and load config let database_url = std::env::var("DATABASE_URL").unwrap_or_else(|_| { - let username = std::env - ::var("TABLES_USERNAME") - .unwrap_or_else(|_| "postgres".to_string()); - let password = std::env - ::var("TABLES_PASSWORD") - .unwrap_or_else(|_| "postgres".to_string()); - let server = std::env - ::var("TABLES_SERVER") - .unwrap_or_else(|_| "localhost".to_string()); + let username = + std::env::var("TABLES_USERNAME").unwrap_or_else(|_| "postgres".to_string()); + let password = + std::env::var("TABLES_PASSWORD").unwrap_or_else(|_| "postgres".to_string()); + let server = + std::env::var("TABLES_SERVER").unwrap_or_else(|_| "localhost".to_string()); let port = std::env::var("TABLES_PORT").unwrap_or_else(|_| "5432".to_string()); - let database = std::env - ::var("TABLES_DATABASE") - .unwrap_or_else(|_| "gbserver".to_string()); - format!("postgres://{}:{}@{}:{}/{}", username, password, server, port, database) + let database = + std::env::var("TABLES_DATABASE").unwrap_or_else(|_| "gbserver".to_string()); + format!( + "postgres://{}:{}@{}:{}/{}", + username, password, server, port, database + ) }); match diesel::PgConnection::establish(&database_url) { Ok(mut conn) => { - info!("Successfully connected to legacy database, loading configuration"); - - // Apply migrations if let Err(e) = self.apply_migrations(&mut conn) { log::warn!("Failed to apply migrations: {}", e); } - return Ok(AppConfig::from_database(&mut conn)); } Err(e) => { log::warn!("Failed to connect to legacy database: {}", e); - info!("Using environment variables as fallback"); return Ok(AppConfig::from_env()); } } @@ -133,16 +181,17 @@ impl BootstrapManager { for component in required_components { if !pm.is_installed(component) { - // Determine termination command from package manager component config - let termination_cmd = pm.components + let termination_cmd = pm + .components .get(component) .and_then(|cfg| cfg.binary_name.clone()) .unwrap_or_else(|| component.to_string()); - // If a termination command is defined, check for leftover running process if !termination_cmd.is_empty() { - let check = Command::new("pgrep").arg("-f").arg(&termination_cmd).output(); - + let check = Command::new("pgrep") + .arg("-f") + .arg(&termination_cmd) + .output(); if let Ok(output) = check { if !output.stdout.is_empty() { println!("Component '{}' appears to be already running from a previous install.", component); @@ -157,7 +206,10 @@ impl BootstrapManager { .status(); println!("Terminated existing '{}' process.", component); } else { - println!("Skipping start of '{}' as it is already running.", component); + println!( + "Skipping start of '{}' as it is already running.", + component + ); continue; } } @@ -167,29 +219,20 @@ impl BootstrapManager { if component == "tables" { let db_password = self.generate_secure_password(16); let farm_password = self.generate_secure_password(32); - let env_contents = format!( "FARM_PASSWORD={}\nDATABASE_URL=postgres://gbuser:{}@localhost:5432/botserver", - farm_password, - db_password + farm_password, db_password ); - - std::fs - ::write(".env", &env_contents) + std::fs::write(".env", &env_contents) .map_err(|e| anyhow::anyhow!("Failed to write .env file: {}", e))?; dotenv().ok(); - trace!("Generated database credentials and wrote to .env file"); } - trace!("Installing required component: {}", component); futures::executor::block_on(pm.install(component))?; if component == "tables" { - trace!("Component {} installed successfully", component); - let database_url = std::env::var("DATABASE_URL").unwrap(); - let mut conn = diesel::PgConnection - ::establish(&database_url) + let mut conn = diesel::PgConnection::establish(&database_url) .map_err(|e| anyhow::anyhow!("Failed to connect to database: {}", e))?; let migration_dir = include_dir::include_dir!("./migrations"); @@ -197,27 +240,21 @@ impl BootstrapManager { .files() .filter_map(|file| { let path = file.path(); - trace!("Found file: {:?}", path); if path.extension()? == "sql" { - trace!(" -> SQL file included"); Some(file) } else { - trace!(" -> Not a SQL file, skipping"); None } }) .collect(); - trace!("Total migration files found: {}", migration_files.len()); migration_files.sort_by_key(|f| f.path()); for migration_file in migration_files { let migration = migration_file .contents_utf8() .ok_or_else(|| anyhow::anyhow!("Migration file is not valid UTF-8"))?; - trace!("Executing migration: {}", migration_file.path().display()); - // Use batch_execute to handle multiple statements including those with dollar-quoted strings if let Err(e) = conn.batch_execute(migration) { log::error!( "Failed to execute migration {}: {}", @@ -226,14 +263,13 @@ impl BootstrapManager { ); return Err(e.into()); } - trace!( + info!( "Successfully executed migration: {}", migration_file.path().display() ); } config = AppConfig::from_database(&mut conn); - info!("Database migrations completed and configuration loaded"); } } } @@ -242,12 +278,9 @@ impl BootstrapManager { } fn generate_secure_password(&self, length: usize) -> String { - // Ensure the Rng trait is in scope for `sample` use rand::Rng; let mut rng = rand::rng(); - - std::iter - ::repeat_with(|| rng.sample(Alphanumeric) as char) + std::iter::repeat_with(|| rng.sample(Alphanumeric) as char) .take(length) .collect() } @@ -259,175 +292,58 @@ impl BootstrapManager { format!("{:x}", hasher.finalize()) } - /// Update the bot configuration after a component is installed. - /// This reads the existing `config.csv` from the default bot bucket, - ///fix s values based on the installed component, and - /// writes the updated CSV back to the bucket. It also upserts the - /// key/value pairs into the `bot_config` table. fn update_bot_config(&self, component: &str) -> Result<()> { - // Determine bucket name: DRIVE_ORG_PREFIX + "default.gbai" - let org_prefix = std::env - ::var("DRIVE_ORG_PREFIX") - .unwrap_or_else(|_| "pragmatismo-".to_string()); - let bucket_name = format!("{}default.gbai", org_prefix); - let config_key = "default.gbot/config.csv"; - - // Build S3 client using default SDK config (compatible with S3Client) - let s3_client = S3Client::from_conf(aws_sdk_s3::Config::builder().build()); - - // Attempt to download existing config.csv - let existing_csv = match - futures::executor::block_on( - s3_client.get_object().bucket(&bucket_name).key(config_key).send() - ) - { - Ok(resp) => { - let data = futures::executor::block_on(resp.body.collect())?; - String::from_utf8(data.into_bytes().to_vec()).unwrap_or_default() - } - Err(_) => String::new(), // No existing file – start fresh - }; - - // Parse CSV into a map - let mut config_map: std::collections::HashMap< - String, - String - > = std::collections::HashMap::new(); - if !existing_csv.is_empty() { - let mut rdr = csv::ReaderBuilder - ::new() - .has_headers(false) - .from_reader(existing_csv.as_bytes()); - for result in rdr.records() { - if let Ok(record) = result { - if record.len() >= 2 { - config_map.insert(record[0].to_string(), record[1].to_string()); - } - } - } - } - - // Update configuration based on the installed component - config_map.insert(component.to_string(), "true".to_string()); - - // Serialize back to CSV - let mut wtr = csv::WriterBuilder - ::new() - .has_headers(false) - .from_writer(vec![]); - for (k, v) in &config_map { - wtr.write_record(&[k, v])?; - } - wtr.flush()?; - let csv_bytes = wtr.into_inner()?; - - // Upload updated CSV to S3 - futures::executor::block_on( - s3_client - .put_object() - .bucket(&bucket_name) - .key(config_key) - .body(csv_bytes.clone().into()) - .send() - )?; - - // Upsert into bot_config table - let database_url = std::env - ::var("DATABASE_URL") + let database_url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()); let mut conn = diesel::pg::PgConnection::establish(&database_url)?; - for (k, v) in config_map { - diesel - ::sql_query( - "INSERT INTO bot_config (key, value) VALUES ($1, $2) \ - ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value" - ) - .bind::(&k) - .bind::(&v) - .execute(&mut conn)?; + for (k, v) in vec![(component.to_string(), "true".to_string())] { + diesel::sql_query( + "INSERT INTO bot_config (key, value) VALUES ($1, $2) \ + ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value", + ) + .bind::(&k) + .bind::(&v) + .execute(&mut conn)?; } Ok(()) } pub async fn upload_templates_to_minio(&self, config: &AppConfig) -> Result<()> { - use aws_sdk_s3::config::Credentials; - use aws_sdk_s3::config::Region; - - info!("Uploading template bots to MinIO and creating bot entries..."); - - // First, create bot entries in database for each template let database_url = std::env::var("DATABASE_URL").unwrap_or_else(|_| config.database_url()); let mut conn = diesel::PgConnection::establish(&database_url)?; self.create_bots_from_templates(&mut conn)?; - let creds = Credentials::new( - &config.minio.access_key, - &config.minio.secret_key, - None, - None, - "minio" - ); + let builder = S3::default(); + builder + .root("/") + .endpoint(&config.minio.server) + .access_key_id(&config.minio.access_key) + .secret_access_key(&config.minio.secret_key); - let s3_config = aws_sdk_s3::Config - ::builder() - .credentials_provider(creds) - .endpoint_url(&config.minio.server) - .region(Region::new("us-east-1")) - .force_path_style(true) - .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest()) - .build(); + // if !config.minio.use_ssl { + // builder.disable_ssl_verification(true); + // } - let client = aws_sdk_s3::Client::from_conf(s3_config); + let client = Operator::new(builder)?.finish(); - // Upload templates from templates/ directory let templates_dir = Path::new("templates"); if !templates_dir.exists() { - trace!("Templates directory not found, skipping upload"); return Ok(()); } - // Walk through each .gbai folder in templates/ for entry in std::fs::read_dir(templates_dir)? { let entry = entry?; let path = entry.path(); - - if - path.is_dir() && - path - .extension() - .map(|e| e == "gbai") - .unwrap_or(false) - { + if path.is_dir() && path.extension().map(|e| e == "gbai").unwrap_or(false) { let bot_name = path.file_name().unwrap().to_string_lossy().to_string(); - let bucket_name = format!("{}{}", config.minio.org_prefix, bot_name); - trace!("Creating bucket: {}", bucket_name); - - // Create bucket if it doesn't exist - match client.create_bucket().bucket(&bucket_name).send().await { - Ok(_) => info!("Created bucket: {}", bucket_name), - Err(e) => { - let err_str = e.to_string(); - if - err_str.contains("BucketAlreadyOwnedByYou") || - err_str.contains("BucketAlreadyExists") - { - trace!("Bucket {} already exists", bucket_name); - } else { - log::warn!("Failed to create bucket {}: {}", bucket_name, e); - } - } - } - - // Upload all files recursively - self.upload_directory_recursive(&client, &path, &bucket_name, "").await?; - info!("Uploaded template bot: {}", bot_name); + self.upload_directory_recursive(&client, &path, &bot_name, "") + .await?; } } - info!("Template bots uploaded successfully"); Ok(()) } @@ -435,31 +351,17 @@ impl BootstrapManager { use crate::shared::models::schema::bots; use diesel::prelude::*; - info!("Creating bot entries from template folders..."); - let templates_dir = Path::new("templates"); if !templates_dir.exists() { - trace!("Templates directory not found, skipping bot creation"); return Ok(()); } - // Walk through each .gbai folder in templates/ for entry in std::fs::read_dir(templates_dir)? { let entry = entry?; let path = entry.path(); - - if - path.is_dir() && - path - .extension() - .map(|e| e == "gbai") - .unwrap_or(false) - { + if path.is_dir() && path.extension().map(|e| e == "gbai").unwrap_or(false) { let bot_folder = path.file_name().unwrap().to_string_lossy().to_string(); - // Remove .gbai extension to get bot name let bot_name = bot_folder.trim_end_matches(".gbai"); - - // Format the name nicely (capitalize first letter of each word) let formatted_name = bot_name .split('_') .map(|word| { @@ -474,7 +376,6 @@ impl BootstrapManager { .collect::>() .join(" "); - // Check if bot already exists let existing: Option = bots::table .filter(bots::name.eq(&formatted_name)) .select(bots::name) @@ -482,39 +383,30 @@ impl BootstrapManager { .optional()?; if existing.is_none() { - // Insert new bot - diesel - ::sql_query( - "INSERT INTO bots (id, name, description, llm_provider, llm_config, context_provider, context_config, is_active) \ + diesel::sql_query( + "INSERT INTO bots (id, name, description, llm_provider, llm_config, context_provider, context_config, is_active) \ VALUES (gen_random_uuid(), $1, $2, 'openai', '{\"model\": \"gpt-4\", \"temperature\": 0.7}', 'database', '{}', true)" - ) - .bind::(&formatted_name) - .bind::( - format!("Bot for {} template", bot_name) - ) - .execute(conn)?; - - info!("Created bot entry: {}", formatted_name); + ) + .bind::(&formatted_name) + .bind::(format!("Bot for {} template", bot_name)) + .execute(conn)?; } else { - trace!("Bot already exists: {}", formatted_name); + trace!("Bot {} already exists", formatted_name); } } } - info!("Bot creation from templates completed"); Ok(()) } fn upload_directory_recursive<'a>( &'a self, - client: &'a aws_sdk_s3::Client, + client: &'a Operator, local_path: &'a Path, bucket: &'a str, - prefix: &'a str + prefix: &'a str, ) -> std::pin::Pin> + 'a>> { Box::pin(async move { - use aws_sdk_s3::primitives::ByteStream; - for entry in std::fs::read_dir(local_path)? { let entry = entry?; let path = entry.path(); @@ -526,39 +418,30 @@ impl BootstrapManager { }; if path.is_file() { - trace!( + info!( "Uploading file: {} to bucket: {} with key: {}", path.display(), bucket, key ); - - let body = ByteStream::from_path(&path).await?; - - client.put_object().bucket(bucket).key(&key).body(body).send().await?; - - trace!("Uploaded: {}", key); + let content = std::fs::read(&path)?; + client.write(&key, content).await?; } else if path.is_dir() { - self.upload_directory_recursive(client, &path, bucket, &key).await?; + self.upload_directory_recursive(client, &path, bucket, &key) + .await?; } } - Ok(()) }) } fn apply_migrations(&self, conn: &mut diesel::PgConnection) -> Result<()> { - info!("Applying database migrations..."); - let migrations_dir = std::path::Path::new("migrations"); if !migrations_dir.exists() { - trace!("No migrations directory found, skipping"); return Ok(()); } - // Get all .sql files sorted - let mut sql_files: Vec<_> = std::fs - ::read_dir(migrations_dir)? + let mut sql_files: Vec<_> = std::fs::read_dir(migrations_dir)? .filter_map(|entry| entry.ok()) .filter(|entry| { entry @@ -575,26 +458,19 @@ impl BootstrapManager { for entry in sql_files { let path = entry.path(); let filename = path.file_name().unwrap().to_string_lossy(); - - trace!("Reading migration: {}", filename); match std::fs::read_to_string(&path) { - Ok(sql) => { - trace!("Applying migration: {}", filename); - match conn.batch_execute(&sql) { - Ok(_) => info!("Applied migration: {}", filename), - Err(e) => { - // Ignore errors for already applied migrations - trace!("Migration {} result: {}", filename, e); - } + Ok(sql) => match conn.batch_execute(&sql) { + Err(e) => { + log::warn!("Migration {} failed: {}", filename, e); } - } + _ => {} + }, Err(e) => { log::warn!("Failed to read migration {}: {}", filename, e); } } } - info!("Migrations check completed"); Ok(()) } } diff --git a/src/drive_monitor/mod.rs b/src/drive_monitor/mod.rs index 6a55d494c..a78754788 100644 --- a/src/drive_monitor/mod.rs +++ b/src/drive_monitor/mod.rs @@ -2,14 +2,13 @@ use crate::basic::compiler::BasicCompiler; use crate::kb::embeddings; use crate::kb::qdrant_client; use crate::shared::state::AppState; -use aws_sdk_s3::Client as S3Client; use log::{debug, error, info, warn}; +use opendal::Operator; use std::collections::HashMap; use std::error::Error; use std::sync::Arc; use tokio::time::{interval, Duration}; -/// Tracks file state for change detection #[derive(Debug, Clone)] pub struct FileState { pub path: String, @@ -18,7 +17,6 @@ pub struct FileState { pub last_modified: Option, } -/// Drive monitor that watches for changes and triggers compilation/indexing pub struct DriveMonitor { state: Arc, bucket_name: String, @@ -34,18 +32,12 @@ impl DriveMonitor { } } - /// Start the drive monitoring service pub fn spawn(self: Arc) -> tokio::task::JoinHandle<()> { tokio::spawn(async move { - info!( - "Drive Monitor service started for bucket: {}", - self.bucket_name - ); - let mut tick = interval(Duration::from_secs(30)); // Check every 30 seconds - + info!("Drive Monitor service started for bucket: {}", self.bucket_name); + let mut tick = interval(Duration::from_secs(30)); loop { tick.tick().await; - if let Err(e) = self.check_for_changes().await { error!("Error checking for drive changes: {}", e); } @@ -53,101 +45,66 @@ impl DriveMonitor { }) } - /// Check for file changes in the drive async fn check_for_changes(&self) -> Result<(), Box> { - let s3_client = match &self.state.s3_client { - Some(client) => client, + let op = match &self.state.s3_operator { + Some(op) => op, None => { - debug!("S3 client not configured"); return Ok(()); } }; - // Check .gbdialog folder for BASIC tools - self.check_gbdialog_changes(s3_client).await?; - - // Check .gbkb folder for KB documents - self.check_gbkb_changes(s3_client).await?; - // Check for default bot configuration in the drive bucket - if let Err(e) = self.check_default_gbot(s3_client).await { + self.check_gbdialog_changes(op).await?; + self.check_gbkb_changes(op).await?; + + if let Err(e) = self.check_default_gbot(op).await { error!("Error checking default bot config: {}", e); } Ok(()) } - /// Check .gbdialog folder for BASIC tool changes async fn check_gbdialog_changes( &self, - s3_client: &S3Client, + op: &Operator, ) -> Result<(), Box> { let prefix = ".gbdialog/"; - debug!("Checking {} folder for changes", prefix); - - let mut continuation_token: Option = None; + let mut current_files = HashMap::new(); - - loop { - let mut list_request = s3_client - .list_objects_v2() - .bucket(&self.bucket_name) - .prefix(prefix); - - if let Some(token) = continuation_token { - list_request = list_request.continuation_token(token); + + let mut lister = op.lister_with(prefix).recursive(true).await?; + while let Some(entry) = lister.next().await { + let entry = entry?; + let path = entry.path().to_string(); + + if path.ends_with('/') || !path.ends_with(".bas") { + continue; } - let list_result = list_request.send().await?; - - if let Some(contents) = list_result.contents { - for object in contents { - if let Some(key) = object.key { - // Skip directories and non-.bas files - if key.ends_with('/') || !key.ends_with(".bas") { - continue; - } - - let file_state = FileState { - path: key.clone(), - size: object.size.unwrap_or(0), - etag: object.e_tag.unwrap_or_default(), - last_modified: object.last_modified.map(|dt| dt.to_string()), - }; - - current_files.insert(key, file_state); - } - } - } - - if list_result.is_truncated.unwrap_or(false) { - continuation_token = list_result.next_continuation_token; - } else { - break; - } + let meta = entry.metadata().await?; + let file_state = FileState { + path: path.clone(), + size: meta.content_length() as i64, + etag: meta.etag().unwrap_or_default().to_string(), + last_modified: meta.last_modified().map(|dt| dt.to_rfc3339()), + }; + current_files.insert(path, file_state); } - // Compare with previous state and handle changes let mut file_states = self.file_states.write().await; - for (path, current_state) in current_files.iter() { if let Some(previous_state) = file_states.get(path) { - // File exists, check if modified if current_state.etag != previous_state.etag { - info!("BASIC tool modified: {}", path); - if let Err(e) = self.compile_tool(s3_client, path).await { + if let Err(e) = self.compile_tool(op, path).await { error!("Failed to compile tool {}: {}", path, e); } } } else { - // New file - info!("New BASIC tool detected: {}", path); - if let Err(e) = self.compile_tool(s3_client, path).await { + if let Err(e) = self.compile_tool(op, path).await { error!("Failed to compile tool {}: {}", path, e); } } } - // Check for deleted files let previous_paths: Vec = file_states .keys() .filter(|k| k.starts_with(prefix)) @@ -156,13 +113,10 @@ impl DriveMonitor { for path in previous_paths { if !current_files.contains_key(&path) { - info!("BASIC tool deleted: {}", path); - // TODO: Mark tool as inactive in database file_states.remove(&path); } } - // Update state with current files for (path, state) in current_files { file_states.insert(path, state); } @@ -170,84 +124,53 @@ impl DriveMonitor { Ok(()) } - /// Check .gbkb folder for KB document changes async fn check_gbkb_changes( &self, - s3_client: &S3Client, + op: &Operator, ) -> Result<(), Box> { let prefix = ".gbkb/"; - debug!("Checking {} folder for changes", prefix); - - let mut continuation_token: Option = None; + let mut current_files = HashMap::new(); - - loop { - let mut list_request = s3_client - .list_objects_v2() - .bucket(&self.bucket_name) - .prefix(prefix); - - if let Some(token) = continuation_token { - list_request = list_request.continuation_token(token); + + let mut lister = op.lister_with(prefix).recursive(true).await?; + while let Some(entry) = lister.next().await { + let entry = entry?; + let path = entry.path().to_string(); + + if path.ends_with('/') { + continue; } - let list_result = list_request.send().await?; - - if let Some(contents) = list_result.contents { - for object in contents { - if let Some(key) = object.key { - // Skip directories - if key.ends_with('/') { - continue; - } - - // Only process supported file types - let ext = key.rsplit('.').next().unwrap_or("").to_lowercase(); - if !["pdf", "txt", "md", "docx"].contains(&ext.as_str()) { - continue; - } - - let file_state = FileState { - path: key.clone(), - size: object.size.unwrap_or(0), - etag: object.e_tag.unwrap_or_default(), - last_modified: object.last_modified.map(|dt| dt.to_string()), - }; - - current_files.insert(key, file_state); - } - } + let ext = path.rsplit('.').next().unwrap_or("").to_lowercase(); + if !["pdf", "txt", "md", "docx"].contains(&ext.as_str()) { + continue; } - if list_result.is_truncated.unwrap_or(false) { - continuation_token = list_result.next_continuation_token; - } else { - break; - } + let meta = entry.metadata().await?; + let file_state = FileState { + path: path.clone(), + size: meta.content_length() as i64, + etag: meta.etag().unwrap_or_default().to_string(), + last_modified: meta.last_modified().map(|dt| dt.to_rfc3339()), + }; + current_files.insert(path, file_state); } - // Compare with previous state and handle changes let mut file_states = self.file_states.write().await; - for (path, current_state) in current_files.iter() { if let Some(previous_state) = file_states.get(path) { - // File exists, check if modified if current_state.etag != previous_state.etag { - info!("KB document modified: {}", path); - if let Err(e) = self.index_document(s3_client, path).await { + if let Err(e) = self.index_document(op, path).await { error!("Failed to index document {}: {}", path, e); } } } else { - // New file - info!("New KB document detected: {}", path); - if let Err(e) = self.index_document(s3_client, path).await { + if let Err(e) = self.index_document(op, path).await { error!("Failed to index document {}: {}", path, e); } } } - // Check for deleted files let previous_paths: Vec = file_states .keys() .filter(|k| k.starts_with(prefix)) @@ -256,13 +179,10 @@ impl DriveMonitor { for path in previous_paths { if !current_files.contains_key(&path) { - info!("KB document deleted: {}", path); - // TODO: Delete from Qdrant and mark in database file_states.remove(&path); } } - // Update state with current files for (path, state) in current_files { file_states.insert(path, state); } @@ -270,76 +190,36 @@ impl DriveMonitor { Ok(()) } - /// Check for default bot configuration in the drive bucket async fn check_default_gbot( &self, - s3_client: &S3Client, + op: &Operator, ) -> Result<(), Box> { - // The default bot configuration is expected at: - // /default.gbai/default.gbot/config.csv - // Construct the expected key prefix let prefix = format!("{}default.gbot/", self.bucket_name); let config_key = format!("{}config.csv", prefix); - - debug!("Checking for default bot config at key: {}", config_key); - - // Attempt to get the object metadata to see if it exists - let head_req = s3_client - .head_object() - .bucket(&self.bucket_name) - .key(&config_key) - .send() - .await; - - match head_req { + + match op.stat(&config_key).await { Ok(_) => { - info!("Default bot config found, downloading {}", config_key); - // Download the CSV file - let get_resp = s3_client - .get_object() - .bucket(&self.bucket_name) - .key(&config_key) - .send() - .await?; - - let data = get_resp.body.collect().await?; - let csv_content = String::from_utf8(data.into_bytes().to_vec()) + let content = op.read(&config_key).await?; + let csv_content = String::from_utf8(content.to_vec()) .map_err(|e| format!("UTF-8 error in config.csv: {}", e))?; - - // Log the retrieved configuration (in a real implementation this would be parsed - // and used to populate the bot_config table, respecting overrides from .gbot files) - info!("Retrieved default bot config CSV:\n{}", csv_content); - // TODO: Parse CSV and upsert into bot_config table with appropriate precedence + debug!("Found config.csv: {} bytes", csv_content.len()); Ok(()) } Err(e) => { - // If the object does not exist, simply ignore - debug!("Default bot config not present: {}", e); + debug!("Config file not found or inaccessible: {}", e); Ok(()) } } } - /// Compile a BASIC tool file async fn compile_tool( &self, - s3_client: &S3Client, + op: &Operator, file_path: &str, ) -> Result<(), Box> { - info!("Compiling BASIC tool: {}", file_path); + let content = op.read(file_path).await?; + let source_content = String::from_utf8(content.to_vec())?; - // Download source from S3 - let get_response = s3_client - .get_object() - .bucket(&self.bucket_name) - .key(file_path) - .send() - .await?; - - let data = get_response.body.collect().await?; - let source_content = String::from_utf8(data.into_bytes().to_vec())?; - - // Extract tool name let tool_name = file_path .strip_prefix(".gbdialog/") .unwrap_or(file_path) @@ -347,10 +227,6 @@ impl DriveMonitor { .unwrap_or(file_path) .to_string(); - // Calculate file hash for change detection - let _file_hash = format!("{:x}", source_content.len()); - - // Create work directory using bot from bucket name let bot_name = self .bucket_name .strip_suffix(".gbai") @@ -358,46 +234,31 @@ impl DriveMonitor { let work_dir = format!("./work/{}.gbai/.gbdialog", bot_name); std::fs::create_dir_all(&work_dir)?; - // Write source to local file let local_source_path = format!("{}/{}.bas", work_dir, tool_name); std::fs::write(&local_source_path, &source_content)?; - // Compile using BasicCompiler let compiler = BasicCompiler::new(Arc::clone(&self.state)); let result = compiler.compile_file(&local_source_path, &work_dir)?; - info!("Tool compiled successfully: {}", tool_name); - info!(" AST: {}", result.ast_path); - - // Save to database if let Some(mcp_tool) = result.mcp_tool { info!( - " MCP tool definition generated with {} parameters", + "MCP tool definition generated with {} parameters", mcp_tool.input_schema.properties.len() ); } if result.openai_tool.is_some() { - info!(" OpenAI tool definition generated"); + debug!("OpenAI tool definition generated"); } - // TODO: Insert/update in basic_tools table - // INSERT INTO basic_tools (id, bot_id, tool_name, file_path, ast_path, file_hash, - // mcp_json, tool_json, compiled_at, is_active, created_at, updated_at) - // VALUES (...) ON CONFLICT (bot_id, tool_name) DO UPDATE SET ... - Ok(()) } - /// Index a KB document async fn index_document( &self, - s3_client: &S3Client, + op: &Operator, file_path: &str, ) -> Result<(), Box> { - info!("Indexing KB document: {}", file_path); - - // Extract collection name from path (.gbkb/collection_name/file.pdf) let parts: Vec<&str> = file_path.split('/').collect(); if parts.len() < 3 { warn!("Invalid KB path structure: {}", file_path); @@ -405,21 +266,10 @@ impl DriveMonitor { } let collection_name = parts[1]; - - // Download file from S3 - let get_response = s3_client - .get_object() - .bucket(&self.bucket_name) - .key(file_path) - .send() - .await?; - - let data = get_response.body.collect().await?; - let bytes = data.into_bytes().to_vec(); - - // Extract text based on file type + let content = op.read(file_path).await?; + let bytes = content.to_vec(); + let text_content = self.extract_text(file_path, &bytes)?; - if text_content.trim().is_empty() { warn!("No text extracted from: {}", file_path); return Ok(()); @@ -431,35 +281,21 @@ impl DriveMonitor { file_path ); - // Create Qdrant collection name let qdrant_collection = format!("kb_default_{}", collection_name); - - // Ensure collection exists qdrant_client::ensure_collection_exists(&self.state, &qdrant_collection).await?; - - // Index document + embeddings::index_document(&self.state, &qdrant_collection, file_path, &text_content) .await?; - info!("Document indexed successfully: {}", file_path); - - // TODO: Insert/update in kb_documents table - // INSERT INTO kb_documents (id, bot_id, user_id, collection_name, file_path, file_size, - // file_hash, first_published_at, last_modified_at, indexed_at, - // metadata, created_at, updated_at) - // VALUES (...) ON CONFLICT (...) DO UPDATE SET ... - Ok(()) } - /// Extract text from various file types fn extract_text( &self, file_path: &str, content: &[u8], ) -> Result> { let path_lower = file_path.to_ascii_lowercase(); - if path_lower.ends_with(".pdf") { match pdf_extract::extract_text_from_mem(content) { Ok(text) => Ok(text), @@ -472,16 +308,13 @@ impl DriveMonitor { String::from_utf8(content.to_vec()) .map_err(|e| format!("UTF-8 decoding failed: {}", e).into()) } else { - // Try as plain text String::from_utf8(content.to_vec()) .map_err(|e| format!("Unsupported file format or UTF-8 error: {}", e).into()) } } - /// Clear all tracked file states pub async fn clear_state(&self) { let mut states = self.file_states.write().await; states.clear(); - info!("Cleared all file states"); } } diff --git a/src/file/mod.rs b/src/file/mod.rs index c7120b9b5..c3b247045 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -1,11 +1,11 @@ use actix_multipart::Multipart; use actix_web::web; use actix_web::{post, HttpResponse}; -use aws_sdk_s3::{Client, Error as S3Error}; +use log::{error, info}; +use opendal::Operator; use std::io::Write; use tempfile::NamedTempFile; use tokio_stream::StreamExt as TokioStreamExt; - use crate::config::DriveConfig; use crate::shared::state::AppState; @@ -16,15 +16,11 @@ pub async fn upload_file( state: web::Data, ) -> Result { let folder_path = folder_path.into_inner(); - - // Create a temporary file that will hold the uploaded data let mut temp_file = NamedTempFile::new().map_err(|e| { actix_web::error::ErrorInternalServerError(format!("Failed to create temp file: {}", e)) })?; let mut file_name: Option = None; - - // Process multipart form data while let Some(mut field) = payload.try_next().await? { if let Some(disposition) = field.content_disposition() { if let Some(name) = disposition.get_filename() { @@ -32,7 +28,6 @@ pub async fn upload_file( } } - // Write each chunk of the field to the temporary file while let Some(chunk) = field.try_next().await? { temp_file.write_all(&chunk).map_err(|e| { actix_web::error::ErrorInternalServerError(format!( @@ -43,44 +38,24 @@ pub async fn upload_file( } } - // Use a fallback name if the client didn't supply one let file_name = file_name.unwrap_or_else(|| "unnamed_file".to_string()); - - // Convert the NamedTempFile into a TempPath so we can get a stable path let temp_file_path = temp_file.into_temp_path(); - - // Retrieve the bucket name from configuration, handling the case where it is missing - let bucket_name = match &state.get_ref().config { - Some(cfg) => cfg.s3_bucket.clone(), - None => { - // Clean up the temp file before returning the error - let _ = std::fs::remove_file(&temp_file_path); - return Err(actix_web::error::ErrorInternalServerError( - "S3 bucket configuration is missing", - )); - } - }; - - // Build the S3 object key (folder + filename) - let s3_key = format!("{}/{}", folder_path, file_name); - - // Retrieve a reference to the S3 client, handling the case where it is missing - let s3_client = state.get_ref().s3_client.as_ref().ok_or_else(|| { - actix_web::error::ErrorInternalServerError("S3 client is not initialized") + + let op = state.get_ref().s3_operator.as_ref().ok_or_else(|| { + actix_web::error::ErrorInternalServerError("S3 operator is not initialized") })?; - // Perform the upload - match upload_to_s3(s3_client, &bucket_name, &s3_key, &temp_file_path).await { + let s3_key = format!("{}/{}", folder_path, file_name); + + match upload_to_s3(op, &s3_key, &temp_file_path).await { Ok(_) => { - // Remove the temporary file now that the upload succeeded let _ = std::fs::remove_file(&temp_file_path); Ok(HttpResponse::Ok().body(format!( - "Uploaded file '{}' to folder '{}' in S3 bucket '{}'", - file_name, folder_path, bucket_name + "Uploaded file '{}' to folder '{}'", + file_name, folder_path ))) } Err(e) => { - // Ensure the temporary file is cleaned up even on failure let _ = std::fs::remove_file(&temp_file_path); Err(actix_web::error::ErrorInternalServerError(format!( "Failed to upload file to S3: {}", @@ -90,61 +65,34 @@ pub async fn upload_file( } } -// Helper function to get S3 client -pub async fn init_drive(cfg: &DriveConfig) -> Result> { - // Build static credentials from the Drive configuration. - let credentials = aws_sdk_s3::config::Credentials::new( - cfg.access_key.clone(), - cfg.secret_key.clone(), - None, - None, - "static", - ); +pub async fn init_drive(cfg: &DriveConfig) -> Result> { + use opendal::services::S3; + use opendal::Operator; + + let mut builder = S3::default(); + + builder.root("/"); + builder.endpoint(&cfg.server); + builder.access_key_id(&cfg.access_key); + builder.secret_access_key(&cfg.secret_key); + + + if cfg.server.contains("minio") || cfg.server.contains("localhost") { + builder.enable_virtual_host_style(); + } - // Construct the endpoint URL, respecting the SSL flag. - let scheme = if cfg.use_ssl { "https" } else { "http" }; - let endpoint = format!("{}://{}", scheme, cfg.server); - - // MinIO requires path‑style addressing. - let s3_config = aws_sdk_s3::config::Builder::new() - // Set the behavior version to the latest to satisfy the SDK requirement. - .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest()) - .region(aws_sdk_s3::config::Region::new("us-east-1")) - .endpoint_url(endpoint) - .credentials_provider(credentials) - .force_path_style(true) - .build(); - - Ok(Client::from_conf(s3_config)) + let op = Operator::new(builder)?.finish(); + + info!("OpenDAL S3 operator initialized for bucket: {}", cfg.bucket); + Ok(op) } -// Helper function to upload file to S3 async fn upload_to_s3( - client: &Client, - bucket: &str, + op: &Operator, key: &str, file_path: &std::path::Path, -) -> Result<(), S3Error> { - // Convert the file at `file_path` into a ByteStream, mapping any I/O error - // into the appropriate `SdkError` type expected by the function signature. - let body = aws_sdk_s3::primitives::ByteStream::from_path(file_path) - .await - .map_err(|e| { - aws_sdk_s3::error::SdkError::< - aws_sdk_s3::operation::put_object::PutObjectError, - aws_sdk_s3::primitives::ByteStream, - >::construction_failure(e) - })?; - - // Perform the actual upload to S3. - client - .put_object() - .bucket(bucket) - .key(key) - .body(body) - .send() - .await - .map(|_| ())?; // Convert the successful output to `()`. - +) -> Result<(), opendal::Error> { + let data = std::fs::read(file_path)?; + op.write(key, data).await?; Ok(()) } diff --git a/src/kb/minio_handler.rs b/src/kb/minio_handler.rs index 619948f8b..4ac206ba9 100644 --- a/src/kb/minio_handler.rs +++ b/src/kb/minio_handler.rs @@ -1,12 +1,11 @@ use crate::shared::state::AppState; -use aws_sdk_s3::Client as S3Client; use log::{debug, error, info}; +use opendal::Operator; use std::collections::HashMap; use std::error::Error; use std::sync::Arc; use tokio::time::{interval, Duration}; -/// MinIO file state tracker #[derive(Debug, Clone)] pub struct FileState { pub path: String, @@ -15,52 +14,41 @@ pub struct FileState { pub last_modified: Option, } -/// MinIO handler that monitors bucket changes pub struct MinIOHandler { state: Arc, - bucket_name: String, watched_prefixes: Arc>>, file_states: Arc>>, } impl MinIOHandler { - pub fn new(state: Arc, bucket_name: String) -> Self { + pub fn new(state: Arc) -> Self { Self { state, - bucket_name, watched_prefixes: Arc::new(tokio::sync::RwLock::new(Vec::new())), file_states: Arc::new(tokio::sync::RwLock::new(HashMap::new())), } } - /// Add a prefix to watch (e.g., ".gbkb/", ".gbdialog/") pub async fn watch_prefix(&self, prefix: String) { let mut prefixes = self.watched_prefixes.write().await; if !prefixes.contains(&prefix) { prefixes.push(prefix.clone()); - info!("Now watching MinIO prefix: {}", prefix); } } - /// Remove a prefix from watch list pub async fn unwatch_prefix(&self, prefix: &str) { let mut prefixes = self.watched_prefixes.write().await; prefixes.retain(|p| p != prefix); - info!("Stopped watching MinIO prefix: {}", prefix); } - /// Start the monitoring service pub fn spawn( self: Arc, change_callback: Arc, ) -> tokio::task::JoinHandle<()> { tokio::spawn(async move { - info!("MinIO Handler service started"); - let mut tick = interval(Duration::from_secs(15)); // Check every 15 seconds - + let mut tick = interval(Duration::from_secs(15)); loop { tick.tick().await; - if let Err(e) = self.check_for_changes(&change_callback).await { error!("Error checking for MinIO changes: {}", e); } @@ -68,93 +56,59 @@ impl MinIOHandler { }) } - /// Check for file changes in watched prefixes async fn check_for_changes( &self, callback: &Arc, ) -> Result<(), Box> { - let s3_client = match &self.state.s3_client { - Some(client) => client, + let op = match &self.state.s3_operator { + Some(op) => op, None => { - debug!("S3 client not configured"); return Ok(()); } }; let prefixes = self.watched_prefixes.read().await; - for prefix in prefixes.iter() { - debug!("Checking prefix: {}", prefix); - - if let Err(e) = self.check_prefix_changes(s3_client, prefix, callback).await { + if let Err(e) = self.check_prefix_changes(op, prefix, callback).await { error!("Error checking prefix {}: {}", prefix, e); } } - Ok(()) } - /// Check changes in a specific prefix async fn check_prefix_changes( &self, - s3_client: &S3Client, + op: &Operator, prefix: &str, callback: &Arc, ) -> Result<(), Box> { - // List all objects with the prefix - let mut continuation_token: Option = None; let mut current_files = HashMap::new(); - - loop { - let mut list_request = s3_client - .list_objects_v2() - .bucket(&self.bucket_name) - .prefix(prefix); - - if let Some(token) = continuation_token { - list_request = list_request.continuation_token(token); + + let mut lister = op.lister_with(prefix).recursive(true).await?; + while let Some(entry) = lister.next().await { + let entry = entry?; + let path = entry.path().to_string(); + + if path.ends_with('/') { + continue; } - let list_result = list_request.send().await?; - - if let Some(contents) = list_result.contents { - for object in contents { - if let Some(key) = object.key { - // Skip directories - if key.ends_with('/') { - continue; - } - - let file_state = FileState { - path: key.clone(), - size: object.size.unwrap_or(0), - etag: object.e_tag.unwrap_or_default(), - last_modified: object.last_modified.map(|dt| dt.to_string()), - }; - - current_files.insert(key, file_state); - } - } - } - - if list_result.is_truncated.unwrap_or(false) { - continuation_token = list_result.next_continuation_token; - } else { - break; - } + let meta = entry.metadata().await?; + let file_state = FileState { + path: path.clone(), + size: meta.content_length().parse::().unwrap_or(0), + etag: meta.etag().unwrap_or_default().to_string(), + last_modified: meta.last_modified().map(|dt| dt.to_rfc3339()), + }; + current_files.insert(path, file_state); } - // Compare with previous state let mut file_states = self.file_states.write().await; - - // Check for new or modified files for (path, current_state) in current_files.iter() { if let Some(previous_state) = file_states.get(path) { - // File exists, check if modified if current_state.etag != previous_state.etag || current_state.size != previous_state.size { - info!("File modified: {}", path); callback(FileChangeEvent::Modified { path: path.clone(), size: current_state.size, @@ -162,8 +116,6 @@ impl MinIOHandler { }); } } else { - // New file - info!("File created: {}", path); callback(FileChangeEvent::Created { path: path.clone(), size: current_state.size, @@ -172,7 +124,6 @@ impl MinIOHandler { } } - // Check for deleted files let previous_paths: Vec = file_states .keys() .filter(|k| k.starts_with(prefix)) @@ -181,13 +132,11 @@ impl MinIOHandler { for path in previous_paths { if !current_files.contains_key(&path) { - info!("File deleted: {}", path); callback(FileChangeEvent::Deleted { path: path.clone() }); file_states.remove(&path); } } - // Update state with current files for (path, state) in current_files { file_states.insert(path, state); } @@ -195,20 +144,16 @@ impl MinIOHandler { Ok(()) } - /// Get current state of a file pub async fn get_file_state(&self, path: &str) -> Option { let states = self.file_states.read().await; states.get(path).cloned() } - /// Clear all tracked file states pub async fn clear_state(&self) { let mut states = self.file_states.write().await; states.clear(); - info!("Cleared all file states"); } - /// Get all tracked files for a prefix pub async fn get_files_by_prefix(&self, prefix: &str) -> Vec { let states = self.file_states.read().await; states @@ -219,7 +164,6 @@ impl MinIOHandler { } } -/// File change event types #[derive(Debug, Clone)] pub enum FileChangeEvent { Created { @@ -266,7 +210,6 @@ mod tests { size: 100, etag: "abc123".to_string(), }; - assert_eq!(event.path(), "test.txt"); assert_eq!(event.event_type(), "created"); } @@ -286,7 +229,6 @@ mod tests { let deleted = FileChangeEvent::Deleted { path: "file3.txt".to_string(), }; - assert_eq!(created.event_type(), "created"); assert_eq!(modified.event_type(), "modified"); assert_eq!(deleted.event_type(), "deleted"); diff --git a/src/kb/mod.rs b/src/kb/mod.rs index a325fdcb1..9888d5c72 100644 --- a/src/kb/mod.rs +++ b/src/kb/mod.rs @@ -1,6 +1,7 @@ use crate::shared::models::KBCollection; use crate::shared::state::AppState; use log::{debug, error, info, warn}; +use opendal::Operator; use std::collections::HashMap; use std::error::Error; use std::sync::Arc; @@ -10,7 +11,6 @@ pub mod embeddings; pub mod minio_handler; pub mod qdrant_client; -/// Represents a change in a KB file #[derive(Debug, Clone)] pub enum FileChangeEvent { Created(String), @@ -18,7 +18,6 @@ pub enum FileChangeEvent { Deleted(String), } -/// KB Manager service that coordinates MinIO monitoring and Qdrant indexing pub struct KBManager { state: Arc, watched_collections: Arc>>, @@ -32,7 +31,6 @@ impl KBManager { } } - /// Start watching a KB collection folder pub async fn add_collection( &self, bot_id: String, @@ -41,13 +39,12 @@ impl KBManager { ) -> Result<(), Box> { let folder_path = format!(".gbkb/{}", collection_name); let qdrant_collection = format!("kb_{}_{}", bot_id, collection_name); - + info!( "Adding KB collection: {} -> {}", collection_name, qdrant_collection ); - // Create Qdrant collection if it doesn't exist qdrant_client::ensure_collection_exists(&self.state, &qdrant_collection).await?; let now = chrono::Utc::now().to_rfc3339(); @@ -67,30 +64,23 @@ impl KBManager { let mut collections = self.watched_collections.write().await; collections.insert(collection_name.to_string(), collection); - info!("KB collection added successfully: {}", collection_name); Ok(()) } - /// Remove a KB collection pub async fn remove_collection( &self, collection_name: &str, ) -> Result<(), Box> { let mut collections = self.watched_collections.write().await; collections.remove(collection_name); - info!("KB collection removed: {}", collection_name); Ok(()) } - /// Start the KB monitoring service pub fn spawn(self: Arc) -> tokio::task::JoinHandle<()> { tokio::spawn(async move { - info!("KB Manager service started"); let mut tick = interval(Duration::from_secs(30)); - loop { tick.tick().await; - let collections = self.watched_collections.read().await; for (name, collection) in collections.iter() { if let Err(e) = self.check_collection_updates(collection).await { @@ -101,67 +91,44 @@ impl KBManager { }) } - /// Check for updates in a collection async fn check_collection_updates( &self, collection: &KBCollection, ) -> Result<(), Box> { - debug!("Checking updates for collection: {}", collection.name); - - let s3_client = match &self.state.s3_client { - Some(client) => client, + let op = match &self.state.s3_operator { + Some(op) => op, None => { - warn!("S3 client not configured"); + warn!("S3 operator not configured"); return Ok(()); } }; - let config = match &self.state.config { - Some(cfg) => cfg, - None => { - error!("App configuration missing"); - return Err("App configuration missing".into()); + let mut lister = op.lister_with(&collection.folder_path).recursive(true).await?; + while let Some(entry) = lister.next().await { + let entry = entry?; + let path = entry.path().to_string(); + + if path.ends_with('/') { + continue; } - }; - let bucket_name = format!("{}default.gbai", config.minio.org_prefix); - - // List objects in the collection folder - let list_result = s3_client - .list_objects_v2() - .bucket(&bucket_name) - .prefix(&collection.folder_path) - .send() - .await?; - - if let Some(contents) = list_result.contents { - for object in contents { - if let Some(key) = object.key { - // Skip directories - if key.ends_with('/') { - continue; - } - - // Check if file needs indexing - if let Err(e) = self - .process_file( - &collection, - &key, - object.size.unwrap_or(0), - object.last_modified.map(|dt| dt.to_string()), - ) - .await - { - error!("Error processing file {}: {}", key, e); - } - } + let meta = entry.metadata().await?; + if let Err(e) = self + .process_file( + &collection, + &path, + meta.content_length() as i64, + meta.last_modified().map(|dt| dt.to_rfc3339()), + ) + .await + { + error!("Error processing file {}: {}", path, e); } } Ok(()) } - /// Process a single file (check if changed and index if needed) async fn process_file( &self, collection: &KBCollection, @@ -169,9 +136,7 @@ impl KBManager { file_size: i64, _last_modified: Option, ) -> Result<(), Box> { - // Get file content hash let content = self.get_file_content(file_path).await?; - // Simple hash using length and first/last bytes for change detection let file_hash = if content.len() > 100 { format!( "{:x}_{:x}_{}", @@ -183,24 +148,16 @@ impl KBManager { format!("{:x}", content.len()) }; - // Check if file is already indexed with same hash if self .is_file_indexed(collection.bot_id.clone(), file_path, &file_hash) .await? { - debug!("File already indexed: {}", file_path); return Ok(()); } - info!( - "Indexing file: {} to collection {}", - file_path, collection.name - ); - - // Extract text based on file type + info!("Indexing file: {} to collection {}", file_path, collection.name); let text_content = self.extract_text(file_path, &content).await?; - - // Generate embeddings and store in Qdrant + embeddings::index_document( &self.state, &collection.qdrant_collection, @@ -209,7 +166,6 @@ impl KBManager { ) .await?; - // Save metadata to database let metadata = serde_json::json!({ "file_type": self.get_file_type(file_path), "last_modified": _last_modified, @@ -225,48 +181,29 @@ impl KBManager { ) .await?; - info!("File indexed successfully: {}", file_path); Ok(()) } - /// Get file content from MinIO async fn get_file_content( &self, file_path: &str, ) -> Result, Box> { - let s3_client = self + let op = self .state - .s3_client + .s3_operator .as_ref() - .ok_or("S3 client not configured")?; + .ok_or("S3 operator not configured")?; - let config = self - .state - .config - .as_ref() - .ok_or("App configuration missing")?; - - let bucket_name = format!("{}default.gbai", config.minio.org_prefix); - - let response = s3_client - .get_object() - .bucket(&bucket_name) - .key(file_path) - .send() - .await?; - - let data = response.body.collect().await?; - Ok(data.into_bytes().to_vec()) + let content = op.read(file_path).await?; + Ok(content.to_vec()) } - /// Extract text from various file types async fn extract_text( &self, file_path: &str, content: &[u8], ) -> Result> { let path_lower = file_path.to_ascii_lowercase(); - if path_lower.ends_with(".pdf") { match pdf_extract::extract_text_from_mem(content) { Ok(text) => Ok(text), @@ -279,29 +216,23 @@ impl KBManager { String::from_utf8(content.to_vec()) .map_err(|e| format!("UTF-8 decoding failed: {}", e).into()) } else if path_lower.ends_with(".docx") { - // TODO: Add DOCX support warn!("DOCX format not yet supported: {}", file_path); Err("DOCX format not supported".into()) } else { - // Try as plain text String::from_utf8(content.to_vec()) .map_err(|e| format!("Unsupported file format or UTF-8 error: {}", e).into()) } } - /// Check if file is already indexed async fn is_file_indexed( &self, _bot_id: String, _file_path: &str, _file_hash: &str, ) -> Result> { - // TODO: Query database to check if file with same hash exists - // For now, return false to always reindex Ok(false) } - /// Save document metadata to database async fn save_document_metadata( &self, _bot_id: String, @@ -311,7 +242,6 @@ impl KBManager { file_hash: &str, _metadata: serde_json::Value, ) -> Result<(), Box> { - // TODO: Save to database using Diesel info!( "Saving metadata for {}: size={}, hash={}", file_path, file_size, file_hash @@ -319,7 +249,6 @@ impl KBManager { Ok(()) } - /// Get file type from path fn get_file_type(&self, file_path: &str) -> String { file_path .rsplit('.') diff --git a/src/main.rs b/src/main.rs index 783025f36..6abb60355 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ #![allow(dead_code)] #![cfg_attr(feature = "desktop", windows_subsystem = "windows")] + use actix_cors::Cors; use actix_web::middleware::Logger; use actix_web::{web, App, HttpServer}; @@ -19,10 +20,8 @@ mod context; mod drive_monitor; #[cfg(feature = "email")] mod email; - #[cfg(feature = "desktop")] mod ui; - mod file; mod kb; mod llm; @@ -65,7 +64,6 @@ use crate::whatsapp::WhatsAppAdapter; #[tokio::main] async fn main() -> std::io::Result<()> { let args: Vec = std::env::args().collect(); - if args.len() > 1 { let command = &args[1]; match command.as_str() { @@ -93,10 +91,8 @@ async fn main() -> std::io::Result<()> { dotenv().ok(); env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")) - .write_style(env_logger::WriteStyle::Always) - .init(); - - info!("Starting BotServer bootstrap process"); + .write_style(env_logger::WriteStyle::Always) + .init(); let install_mode = if args.contains(&"--container".to_string()) { InstallMode::Container @@ -113,19 +109,17 @@ async fn main() -> std::io::Result<()> { let mut bootstrap = BootstrapManager::new(install_mode.clone(), tenant.clone()); let cfg = match bootstrap.bootstrap() { Ok(config) => { - info!("Bootstrap completed successfully, configuration loaded from database"); + info!("Bootstrap completed successfully"); config } Err(e) => { log::error!("Bootstrap failed: {}", e); - info!("Attempting to load configuration from database"); match diesel::Connection::establish( &std::env::var("DATABASE_URL") .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()), ) { Ok(mut conn) => AppConfig::from_database(&mut conn), Err(_) => { - info!("Database not available, using environment variables as fallback"); AppConfig::from_env() } } @@ -133,15 +127,11 @@ async fn main() -> std::io::Result<()> { }; let _ = bootstrap.start_all(); - - // Upload template bots to MinIO on first startup if let Err(e) = bootstrap.upload_templates_to_minio(&cfg).await { log::warn!("Failed to upload templates to MinIO: {}", e); } let config = std::sync::Arc::new(cfg.clone()); - - info!("Establishing database connection to {}", cfg.database_url()); let db_pool = match diesel::Connection::establish(&cfg.database_url()) { Ok(conn) => Arc::new(Mutex::new(conn)), Err(e) => { @@ -154,8 +144,6 @@ async fn main() -> std::io::Result<()> { }; let db_custom_pool = db_pool.clone(); - - info!("Initializing LLM server at {}", cfg.ai.endpoint); ensure_llama_servers_running() .await .expect("Failed to initialize LLM local server"); @@ -176,7 +164,6 @@ async fn main() -> std::io::Result<()> { "empty".to_string(), Some(cfg.ai.endpoint.clone()), )); - let web_adapter = Arc::new(WebChannelAdapter::new()); let voice_adapter = Arc::new(VoiceAdapter::new( "https://livekit.example.com".to_string(), @@ -190,7 +177,6 @@ async fn main() -> std::io::Result<()> { )); let tool_api = Arc::new(tools::ToolApi::new()); - info!("Initializing drive at {}", cfg.minio.server); let drive = init_drive(&config.minio) .await .expect("Failed to initialize Drive"); @@ -199,13 +185,14 @@ async fn main() -> std::io::Result<()> { diesel::Connection::establish(&cfg.database_url()).unwrap(), redis_client.clone(), ))); + let auth_service = Arc::new(tokio::sync::Mutex::new(auth::AuthService::new( diesel::Connection::establish(&cfg.database_url()).unwrap(), redis_client.clone(), ))); let app_state = Arc::new(AppState { - s3_client: Some(drive.clone()), + s3_operator: Some(drive.clone()), config: Some(cfg.clone()), conn: db_pool.clone(), custom_conn: db_custom_pool.clone(), @@ -229,23 +216,17 @@ async fn main() -> std::io::Result<()> { tool_api: tool_api.clone(), }); - info!( - "Starting HTTP server on {}:{}", - config.server.host, config.server.port - ); - + info!("Starting HTTP server on {}:{}", config.server.host, config.server.port); let worker_count = std::thread::available_parallelism() .map(|n| n.get()) .unwrap_or(4); - // Spawn AutomationService in a LocalSet on a separate thread let automation_state = app_state.clone(); std::thread::spawn(move || { let rt = tokio::runtime::Builder::new_current_thread() .enable_all() .build() .expect("Failed to create runtime for automation"); - let local = tokio::task::LocalSet::new(); local.block_on(&rt, async move { let bot_guid = std::env::var("BOT_GUID").unwrap_or_else(|_| "default_bot".to_string()); @@ -267,8 +248,8 @@ async fn main() -> std::io::Result<()> { .allow_any_method() .allow_any_header() .max_age(3600); - let app_state_clone = app_state.clone(); + let app_state_clone = app_state.clone(); let mut app = App::new() .wrap(cors) .wrap(Logger::default()) diff --git a/src/shared/state.rs b/src/shared/state.rs index 07eeaf8ef..fe39d97f3 100644 --- a/src/shared/state.rs +++ b/src/shared/state.rs @@ -6,28 +6,26 @@ use crate::session::SessionManager; use crate::tools::{ToolApi, ToolManager}; use crate::whatsapp::WhatsAppAdapter; use diesel::{Connection, PgConnection}; +use opendal::Operator; use redis::Client; use std::collections::HashMap; use std::sync::Arc; use std::sync::Mutex; use tokio::sync::mpsc; - use crate::shared::models::BotResponse; pub struct AppState { - pub s3_client: Option, + pub s3_operator: Option, pub config: Option, pub conn: Arc>, pub custom_conn: Arc>, pub redis_client: Option>, - pub session_manager: Arc>, pub tool_manager: Arc, pub llm_provider: Arc, pub auth_service: Arc>, pub channels: Arc>>>, pub response_channels: Arc>>>, - pub web_adapter: Arc, pub voice_adapter: Arc, pub whatsapp_adapter: Arc, @@ -37,7 +35,7 @@ pub struct AppState { impl Clone for AppState { fn clone(&self) -> Self { Self { - s3_client: self.s3_client.clone(), + s3_operator: self.s3_operator.clone(), config: self.config.clone(), conn: Arc::clone(&self.conn), custom_conn: Arc::clone(&self.custom_conn), @@ -59,7 +57,7 @@ impl Clone for AppState { impl Default for AppState { fn default() -> Self { Self { - s3_client: None, + s3_operator: None, config: None, conn: Arc::new(Mutex::new( diesel::PgConnection::establish("postgres://localhost/test").unwrap(), From b7449f45fb7b1ea1ae18e83533251d8266009e5a Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 14:20:55 -0300 Subject: [PATCH 07/16] - Migration to Open ADAL. --- fix-errors.sh | 8 +++++--- src/basic/keywords/get.rs | 32 +++++++------------------------- src/bootstrap/mod.rs | 29 ++++++++++++----------------- src/drive_monitor/mod.rs | 10 ++++------ src/file/mod.rs | 5 +---- src/kb/minio_handler.rs | 7 +++---- src/kb/mod.rs | 5 ++--- 7 files changed, 34 insertions(+), 62 deletions(-) diff --git a/fix-errors.sh b/fix-errors.sh index 52e53ef44..b003f0a63 100755 --- a/fix-errors.sh +++ b/fix-errors.sh @@ -19,8 +19,8 @@ done dirs=( # "auth" - "automation" - "basic" + # "automation" + #"basic" # "bot" "bootstrap" # "package_manager" @@ -37,7 +37,7 @@ dirs=( "file" "kb" "shared" - "tests" + #"tests" # "tools" # "web_automation" # "whatsapp" @@ -54,6 +54,8 @@ done echo "$PROJECT_ROOT/src/main.rs" >> "$OUTPUT_FILE" cat "$PROJECT_ROOT/src/main.rs" >> "$OUTPUT_FILE" +echo "$PROJECT_ROOT/src/basic/keywords/get.rs" >> "$OUTPUT_FILE" +cat "$PROJECT_ROOT/src/basic/keywords/get.rs" >> "$OUTPUT_FILE" echo "" >> "$OUTPUT_FILE" echo "Compiling..." diff --git a/src/basic/keywords/get.rs b/src/basic/keywords/get.rs index 5b81b641c..089c75f76 100644 --- a/src/basic/keywords/get.rs +++ b/src/basic/keywords/get.rs @@ -28,7 +28,6 @@ pub fn get_keyword(state: Arc, _user: UserSession, engine: &mut Engine let state_for_blocking = Arc::clone(&state_clone); let url_for_blocking = url_str.clone(); - // ---- fixed section: spawn on separate thread runtime ---- let (tx, rx) = std::sync::mpsc::channel(); std::thread::spawn(move || { let rt = tokio::runtime::Builder::new_multi_thread() @@ -76,7 +75,6 @@ pub fn get_keyword(state: Arc, _user: UserSession, engine: &mut Engine .unwrap(); } -/// Enhanced security check for path traversal and unsafe paths fn is_safe_path(path: &str) -> bool { if path.starts_with("https://") || path.starts_with("http://") { return true; @@ -189,38 +187,22 @@ pub async fn get_from_bucket( bucket }; - -let get_object_future = s3_operator - .read(&bucket_name) - .key(file_path) - .send(); - - let response = match tokio::time::timeout(Duration::from_secs(30), get_object_future).await { + let response = match tokio::time::timeout( + Duration::from_secs(30), + s3_operator.read(&format!("{}/{}", bucket_name, file_path)) + ).await { Ok(Ok(response)) => response, Ok(Err(e)) => { - error!("S3 get_object failed: {}", e); + error!("S3 read failed: {}", e); return Err(format!("S3 operation failed: {}", e).into()); } Err(_) => { - error!("S3 get_object timed out"); + error!("S3 read timed out"); return Err("S3 operation timed out".into()); } }; - let body_future = response.body.collect(); - let data = match tokio::time::timeout(Duration::from_secs(30), body_future).await { - Ok(Ok(data)) => data, - Ok(Err(e)) => { - error!("Failed to collect S3 response body: {}", e); - return Err(format!("Failed to read S3 response: {}", e).into()); - } - Err(_) => { - error!("Timeout collecting S3 response body"); - return Err("Timeout reading S3 response body".into()); - } - }; - - let bytes = data.into_bytes().to_vec(); + let bytes = response.to_vec(); debug!( "Retrieved {} bytes from S3 for key: {}", bytes.len(), diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index 74699064c..25ea6fe03 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -1,14 +1,15 @@ use crate::config::AppConfig; use crate::package_manager::{InstallMode, PackageManager}; +use actix_web::http::uri::Builder; use anyhow::Result; -use csv; use diesel::connection::SimpleConnection; use diesel::Connection; use diesel::RunQueryDsl; use dotenvy::dotenv; -use log::{error, info, trace}; +use log::{error, info}; use opendal::services::S3; -use opendal::{Operator, OperatorBuilder}; +use opendal::Operator; +use rand::Rng; use rand::distr::Alphanumeric; use sha2::{Digest, Sha256}; use std::io::{self, Write}; @@ -278,7 +279,6 @@ impl BootstrapManager { } fn generate_secure_password(&self, length: usize) -> String { - use rand::Rng; let mut rng = rand::rng(); std::iter::repeat_with(|| rng.sample(Alphanumeric) as char) .take(length) @@ -315,18 +315,13 @@ impl BootstrapManager { let mut conn = diesel::PgConnection::establish(&database_url)?; self.create_bots_from_templates(&mut conn)?; - let builder = S3::default(); - builder - .root("/") - .endpoint(&config.minio.server) - .access_key_id(&config.minio.access_key) - .secret_access_key(&config.minio.secret_key); - - // if !config.minio.use_ssl { - // builder.disable_ssl_verification(true); - // } - - let client = Operator::new(builder)?.finish(); + let client = Operator::new( + S3::default() + .root("/") + .endpoint(&config.minio.server) + .access_key_id(&config.minio.access_key) + .secret_access_key(&config.minio.secret_key) + )?.finish(); let templates_dir = Path::new("templates"); if !templates_dir.exists() { @@ -391,7 +386,7 @@ impl BootstrapManager { .bind::(format!("Bot for {} template", bot_name)) .execute(conn)?; } else { - trace!("Bot {} already exists", formatted_name); + log::trace!("Bot {} already exists", formatted_name); } } } diff --git a/src/drive_monitor/mod.rs b/src/drive_monitor/mod.rs index a78754788..b617eac7c 100644 --- a/src/drive_monitor/mod.rs +++ b/src/drive_monitor/mod.rs @@ -72,15 +72,14 @@ impl DriveMonitor { let mut current_files = HashMap::new(); let mut lister = op.lister_with(prefix).recursive(true).await?; - while let Some(entry) = lister.next().await { - let entry = entry?; + while let Some(entry) = lister.try_next().await? { let path = entry.path().to_string(); if path.ends_with('/') || !path.ends_with(".bas") { continue; } - let meta = entry.metadata().await?; + let meta = op.stat(&path).await?; let file_state = FileState { path: path.clone(), size: meta.content_length() as i64, @@ -133,8 +132,7 @@ impl DriveMonitor { let mut current_files = HashMap::new(); let mut lister = op.lister_with(prefix).recursive(true).await?; - while let Some(entry) = lister.next().await { - let entry = entry?; + while let Some(entry) = lister.try_next().await? { let path = entry.path().to_string(); if path.ends_with('/') { @@ -146,7 +144,7 @@ impl DriveMonitor { continue; } - let meta = entry.metadata().await?; + let meta = op.stat(&path).await?; let file_state = FileState { path: path.clone(), size: meta.content_length() as i64, diff --git a/src/file/mod.rs b/src/file/mod.rs index c3b247045..ae28856c5 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -1,7 +1,6 @@ use actix_multipart::Multipart; use actix_web::web; use actix_web::{post, HttpResponse}; -use log::{error, info}; use opendal::Operator; use std::io::Write; use tempfile::NamedTempFile; @@ -76,14 +75,12 @@ pub async fn init_drive(cfg: &DriveConfig) -> Result Result<(), opendal::Error> { +) -> Result<(), Box> { let data = std::fs::read(file_path)?; op.write(key, data).await?; Ok(()) diff --git a/src/kb/minio_handler.rs b/src/kb/minio_handler.rs index 4ac206ba9..deedb907b 100644 --- a/src/kb/minio_handler.rs +++ b/src/kb/minio_handler.rs @@ -85,18 +85,17 @@ impl MinIOHandler { let mut current_files = HashMap::new(); let mut lister = op.lister_with(prefix).recursive(true).await?; - while let Some(entry) = lister.next().await { - let entry = entry?; + while let Some(entry) = lister.try_next().await? { let path = entry.path().to_string(); if path.ends_with('/') { continue; } - let meta = entry.metadata().await?; + let meta = op.stat(&path).await?; let file_state = FileState { path: path.clone(), - size: meta.content_length().parse::().unwrap_or(0), + size: meta.content_length() as i64, etag: meta.etag().unwrap_or_default().to_string(), last_modified: meta.last_modified().map(|dt| dt.to_rfc3339()), }; diff --git a/src/kb/mod.rs b/src/kb/mod.rs index 9888d5c72..62af851a2 100644 --- a/src/kb/mod.rs +++ b/src/kb/mod.rs @@ -104,15 +104,14 @@ impl KBManager { }; let mut lister = op.lister_with(&collection.folder_path).recursive(true).await?; - while let Some(entry) = lister.next().await { - let entry = entry?; + while let Some(entry) = lister.try_next().await? { let path = entry.path().to_string(); if path.ends_with('/') { continue; } - let meta = entry.metadata().await?; + let meta = op.stat(&path).await?; if let Err(e) = self .process_file( &collection, From 930c47f705c7218115ffa2d3a07ec321e936ed07 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 14:53:45 -0300 Subject: [PATCH 08/16] - Migration to Open ADAL. --- Cargo.toml | 31 ++++++++++++++++--------------- migrations/6.0.8.sql | 2 ++ src/bootstrap/mod.rs | 5 ++--- src/drive_monitor/mod.rs | 4 ++-- src/file/mod.rs | 33 ++++++++++++++------------------- src/kb/minio_handler.rs | 3 ++- src/kb/mod.rs | 4 ++-- 7 files changed, 40 insertions(+), 42 deletions(-) create mode 100644 migrations/6.0.8.sql diff --git a/Cargo.toml b/Cargo.toml index 201579f02..667fd2031 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,60 +41,61 @@ default = [ "vectordb"] vectordb = ["qdrant-client"] email = ["imap"] web_automation = ["headless_chrome"] +desktop = [] [dependencies] actix-cors = "0.7" -csv = "1.3" actix-multipart = "0.7" -imap = { version = "3.0.0-alpha.15", optional = true } actix-web = "4.9" actix-ws = "0.3" +aes-gcm = "0.10" anyhow = "1.0" +argon2 = "0.5" async-stream = "0.3" async-trait = "0.1" -aes-gcm = "0.10" -argon2 = "0.5" base64 = "0.22" bytes = "1.8" chrono = { version = "0.4", features = ["serde"] } +csv = "1.3" diesel = { version = "2.1", features = ["postgres", "uuid", "chrono", "serde_json"] } dotenvy = "0.15" downloader = "0.2" env_logger = "0.11" futures = "0.3" futures-util = "0.3" +headless_chrome = { version = "1.0.18", optional = true } +imap = { version = "3.0.0-alpha.15", optional = true } +include_dir = "0.7" +indicatif = "0.18.0" lettre = { version = "0.11", features = ["smtp-transport", "builder", "tokio1", "tokio1-native-tls"] } livekit = "0.7" -include_dir = "0.7" log = "0.4" mailparse = "0.15" native-tls = "0.2" num-format = "0.4" +opendal = { version = "0.54.1", features = ["services-s3"] } +pdf-extract = "0.10.0" qdrant-client = { version = "1.12", optional = true } -rhai = { git = "https://github.com/therealprof/rhai.git", branch = "features/use-web-time" } +rand = "0.9.2" redis = { version = "0.27", features = ["tokio-comp"] } regex = "1.11" reqwest = { version = "0.12", features = ["json", "stream"] } +rhai = { git = "https://github.com/therealprof/rhai.git", branch = "features/use-web-time" } +scraper = "0.20" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +sha2 = "0.10.9" smartstring = "1.0" tempfile = "3" +time = "0.3.44" tokio = { version = "1.41", features = ["full"] } tokio-stream = "0.1" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["fmt"] } +ureq = "3.1.2" urlencoding = "2.1" uuid = { version = "1.11", features = ["serde", "v4"] } zip = "2.2" -time = "0.3.44" -opendal = { version = "0.54.1", features = ["services-s3"] } -headless_chrome = { version = "1.0.18", optional = true } -rand = "0.9.2" -pdf-extract = "0.10.0" -scraper = "0.20" -sha2 = "0.10.9" -ureq = "3.1.2" -indicatif = "0.18.0" [profile.release] diff --git a/migrations/6.0.8.sql b/migrations/6.0.8.sql new file mode 100644 index 000000000..5850b86d1 --- /dev/null +++ b/migrations/6.0.8.sql @@ -0,0 +1,2 @@ +ALTER TABLE bot_configuration +ADD CONSTRAINT bot_configuration_config_key_unique UNIQUE (config_key); diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index 25ea6fe03..4262e11e7 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -1,6 +1,5 @@ use crate::config::AppConfig; use crate::package_manager::{InstallMode, PackageManager}; -use actix_web::http::uri::Builder; use anyhow::Result; use diesel::connection::SimpleConnection; use diesel::Connection; @@ -299,8 +298,8 @@ impl BootstrapManager { for (k, v) in vec![(component.to_string(), "true".to_string())] { diesel::sql_query( - "INSERT INTO bot_config (key, value) VALUES ($1, $2) \ - ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value", + "INSERT INTO bot_configuration (config_key, config_value) VALUES ($1, $2) \ + ON CONFLICT (config_key) DO UPDATE SET config_value = EXCLUDED.config_value", ) .bind::(&k) .bind::(&v) diff --git a/src/drive_monitor/mod.rs b/src/drive_monitor/mod.rs index b617eac7c..956636719 100644 --- a/src/drive_monitor/mod.rs +++ b/src/drive_monitor/mod.rs @@ -72,7 +72,7 @@ impl DriveMonitor { let mut current_files = HashMap::new(); let mut lister = op.lister_with(prefix).recursive(true).await?; - while let Some(entry) = lister.try_next().await? { + while let Some(entry) = futures::TryStreamExt::try_next(&mut lister).await? { let path = entry.path().to_string(); if path.ends_with('/') || !path.ends_with(".bas") { @@ -132,7 +132,7 @@ impl DriveMonitor { let mut current_files = HashMap::new(); let mut lister = op.lister_with(prefix).recursive(true).await?; - while let Some(entry) = lister.try_next().await? { + while let Some(entry) = futures::TryStreamExt::try_next(&mut lister).await? { let path = entry.path().to_string(); if path.ends_with('/') { diff --git a/src/file/mod.rs b/src/file/mod.rs index ae28856c5..bf1530ea3 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -1,3 +1,5 @@ +use crate::config::DriveConfig; +use crate::shared::state::AppState; use actix_multipart::Multipart; use actix_web::web; use actix_web::{post, HttpResponse}; @@ -5,8 +7,6 @@ use opendal::Operator; use std::io::Write; use tempfile::NamedTempFile; use tokio_stream::StreamExt as TokioStreamExt; -use crate::config::DriveConfig; -use crate::shared::state::AppState; #[post("/files/upload/{folder_path}")] pub async fn upload_file( @@ -39,13 +39,13 @@ pub async fn upload_file( let file_name = file_name.unwrap_or_else(|| "unnamed_file".to_string()); let temp_file_path = temp_file.into_temp_path(); - + let op = state.get_ref().s3_operator.as_ref().ok_or_else(|| { actix_web::error::ErrorInternalServerError("S3 operator is not initialized") })?; let s3_key = format!("{}/{}", folder_path, file_name); - + match upload_to_s3(op, &s3_key, &temp_file_path).await { Ok(_) => { let _ = std::fs::remove_file(&temp_file_path); @@ -64,24 +64,19 @@ pub async fn upload_file( } } -pub async fn init_drive(cfg: &DriveConfig) -> Result> { +pub async fn init_drive(config: &DriveConfig) -> Result> { use opendal::services::S3; use opendal::Operator; - - let mut builder = S3::default(); - - builder.root("/"); - builder.endpoint(&cfg.server); - builder.access_key_id(&cfg.access_key); - builder.secret_access_key(&cfg.secret_key); - - if cfg.server.contains("minio") || cfg.server.contains("localhost") { - builder.enable_virtual_host_style(); - } + let client = Operator::new( + S3::default() + .root("/") + .endpoint(&config.server) + .access_key_id(&config.access_key) + .secret_access_key(&config.secret_key), + )? + .finish(); - let op = Operator::new(builder)?.finish(); - - Ok(op) + Ok(client) } async fn upload_to_s3( diff --git a/src/kb/minio_handler.rs b/src/kb/minio_handler.rs index deedb907b..82608bac8 100644 --- a/src/kb/minio_handler.rs +++ b/src/kb/minio_handler.rs @@ -1,6 +1,7 @@ use crate::shared::state::AppState; -use log::{debug, error, info}; +use log::error; use opendal::Operator; +use tokio_stream::StreamExt; use std::collections::HashMap; use std::error::Error; use std::sync::Arc; diff --git a/src/kb/mod.rs b/src/kb/mod.rs index 62af851a2..084236bb4 100644 --- a/src/kb/mod.rs +++ b/src/kb/mod.rs @@ -1,7 +1,7 @@ use crate::shared::models::KBCollection; use crate::shared::state::AppState; -use log::{debug, error, info, warn}; -use opendal::Operator; +use log::{ error, info, warn}; +use tokio_stream::StreamExt; use std::collections::HashMap; use std::error::Error; use std::sync::Arc; From ab8a8b32633782e635430cae5e1dad36cb9c615f Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 19:47:29 -0300 Subject: [PATCH 09/16] - Docs updated. --- docs/src/chapter-06/architecture.md | 70 ++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/docs/src/chapter-06/architecture.md b/docs/src/chapter-06/architecture.md index 4c636fbb3..cb7923336 100644 --- a/docs/src/chapter-06/architecture.md +++ b/docs/src/chapter-06/architecture.md @@ -1 +1,69 @@ -# Rust Architecture +# Architecture + +## Auto Bootstrap Process Overview + +The Auto Bootstrap process is responsible for initializing and configuring the entire BotServer environment after installation. It ensures that all system components are installed, configured, and started automatically, and that bots are created from predefined templates. + +### 1. Bootstrap Initialization + +The process begins with the `BootstrapManager`, which is instantiated with an installation mode (`Local` or `Container`) and an optional tenant name. It initializes the `PackageManager`, which detects the operating system and sets up the base installation path (e.g., `/opt/gbo` or `botserver-stack`). + +### 2. Component Registration and Installation + +The `PackageManager` registers all system components such as: + +- **tables** (PostgreSQL database) +- **cache** (Valkey/Redis) +- **drive** (MinIO object storage) +- **llm** (local LLM server) +- **email**, **proxy**, **directory**, **alm**, **dns**, **meeting**, **table_editor**, **doc_editor**, **desktop**, **devtools**, **bot**, **system**, **vector_db**, **host** + +Each component has a `ComponentConfig` defining: +- Ports and dependencies +- Download URLs and binaries +- Pre/post-install commands +- Environment variables +- Execution commands + +During bootstrap, required components (`tables`, `drive`, `cache`) are installed and started automatically. +For example: +- The **tables** component generates secure database credentials, writes them to `.env`, and applies SQL migrations to initialize the schema. +- The **drive** component creates secure credentials and stores them encrypted in the database. + +### 3. Bot Configuration + +After components are installed, the bootstrap process updates the bot configuration in the database. +The method `update_bot_config()` ensures each component’s configuration is linked to a bot record in the `bot_configuration` table. +If no bot exists, a new UUID is generated to associate configuration entries. + +### 4. Template-Based Bot Creation + +The method `create_bots_from_templates()` scans the `templates/` directory for folders ending in `.gbai` (e.g., `default.gbai`, `announcements.gbai`). +Each `.gbai` folder represents a bot template. + +For each template: +- The folder name is converted into a human-readable bot name (e.g., `default.gbai` → “Default”). +- If the bot doesn’t exist in the `bots` table, a new record is inserted with: + - Default LLM provider (`openai`) + - Default configuration (`{"model": "gpt-4", "temperature": 0.7}`) + - Context provider (`database`) + - Active status (`true`) + +This automatically creates bots from templates during bootstrap. + +### 5. Template Upload to MinIO + +After bots are created, the method `upload_templates_to_minio()` uploads all template files recursively to a MinIO bucket (S3-compatible storage). +This makes templates accessible for runtime bot operations and ensures persistence across environments. + +### 6. Summary + +The Auto Bootstrap process performs the following steps automatically: +1. Detects environment and installation mode. +2. Registers and installs required components. +3. Initializes the database and applies migrations. +4. Updates bot configuration records. +5. Creates bots from `.gbai` templates. +6. Uploads templates to MinIO for storage. + +This process ensures that after installation, the system is fully operational with preconfigured bots derived from templates, ready to serve requests immediately. From eb4907e93b53b05d150fb4852e876394bbf14dca Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 20:39:14 -0300 Subject: [PATCH 10/16] Fix installer: write DATABASE_URL after DB creation and append drive credentials later; update drive credentials only after DB ready --- src/package_manager/installer.rs | 53 +++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/src/package_manager/installer.rs b/src/package_manager/installer.rs index eca43f3af..7c5c2562b 100644 --- a/src/package_manager/installer.rs +++ b/src/package_manager/installer.rs @@ -63,8 +63,8 @@ impl PackageManager { fn register_drive(&mut self) { let drive_password = self.generate_secure_password(16); let drive_user = "gbdriveuser".to_string(); - let farm_password = std::env::var("FARM_PASSWORD") - .unwrap_or_else(|_| self.generate_secure_password(32)); + let farm_password = + std::env::var("FARM_PASSWORD").unwrap_or_else(|_| self.generate_secure_password(32)); let encrypted_drive_password = self.encrypt_password(&drive_password, &farm_password); let env_path = self.base_path.join(".env"); @@ -111,8 +111,37 @@ impl PackageManager { }, ); - self.update_drive_credentials_in_database(&encrypted_drive_password) - .ok(); + // Delay updating drive credentials until database is created + let db_env_path = self.base_path.join(".env"); + let database_url = std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()); + let db_line = format!("DATABASE_URL={}\n", database_url); + let _ = std::fs::write(&db_env_path, db_line); + + // Append drive credentials after database creation + let env_path = self.base_path.join(".env"); + let drive_lines = format!( + "DRIVE_USER={}\nDRIVE_PASSWORD={}\nFARM_PASSWORD={}\nDRIVE_ROOT_USER={}\nDRIVE_ROOT_PASSWORD={}\n", + drive_user, drive_password, farm_password, drive_user, drive_password + ); + let _ = std::fs::OpenOptions::new() + .append(true) + .open(&env_path) + .and_then(|mut file| std::io::Write::write_all(&mut file, drive_lines.as_bytes())); + + // Update drive credentials in database only after database is ready + if std::process::Command::new("pg_isready") + .arg("-h") + .arg("localhost") + .arg("-p") + .arg("5432") + .output() + .map(|o| o.status.success()) + .unwrap_or(false) + { + self.update_drive_credentials_in_database(&encrypted_drive_password) + .ok(); + } } fn update_drive_credentials_in_database(&self, encrypted_drive_password: &str) -> Result<()> { @@ -750,7 +779,10 @@ post_install_cmds_linux: vec![ if let Ok(output) = check_output { if output.status.success() { - trace!("Component {} is already running, skipping start", component.name); + trace!( + "Component {} is already running, skipping start", + component.name + ); return Ok(std::process::Command::new("sh") .arg("-c") .arg("echo 'Already running'") @@ -766,7 +798,11 @@ post_install_cmds_linux: vec![ .replace("{{CONF_PATH}}", &conf_path.to_string_lossy()) .replace("{{LOGS_PATH}}", &logs_path.to_string_lossy()); - trace!("Starting component {} with command: {}", component.name, rendered_cmd); + trace!( + "Starting component {} with command: {}", + component.name, + rendered_cmd + ); let child = std::process::Command::new("sh") .current_dir(&bin_path) @@ -779,7 +815,10 @@ post_install_cmds_linux: vec![ Err(e) => { let err_msg = e.to_string(); if err_msg.contains("already running") || component.name == "tables" { - trace!("Component {} may already be running, continuing anyway", component.name); + trace!( + "Component {} may already be running, continuing anyway", + component.name + ); Ok(std::process::Command::new("sh") .arg("-c") .arg("echo 'Already running'") From 5d32bb13b8ee30278c146b4670f4b76d87827425 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 20:41:21 -0300 Subject: [PATCH 11/16] feat(bootstrap): associate bot configuration updates with bot ID Add logic to retrieve a default bot ID from the database and pass it to `update_bot_config`, ensuring configuration entries are linked to a specific bot. Updated SQL queries to include `bot_id` and `id` fields for consistency and improved data integrity. --- src/bootstrap/mod.rs | 35 +++++++++++++++++++++++++++-------- src/config/mod.rs | 14 ++++++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index 4262e11e7..216a099ae 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -2,19 +2,25 @@ use crate::config::AppConfig; use crate::package_manager::{InstallMode, PackageManager}; use anyhow::Result; use diesel::connection::SimpleConnection; -use diesel::Connection; +use diesel::{Connection, QueryableByName}; use diesel::RunQueryDsl; use dotenvy::dotenv; use log::{error, info}; use opendal::services::S3; use opendal::Operator; -use rand::Rng; use rand::distr::Alphanumeric; +use rand::Rng; use sha2::{Digest, Sha256}; use std::io::{self, Write}; use std::path::Path; use std::process::Command; +#[derive(QueryableByName)] +struct BotIdRow { + #[diesel(sql_type = diesel::sql_types::Uuid)] + id: uuid::Uuid, +} + pub struct ComponentInfo { pub name: &'static str, pub termination_command: &'static str, @@ -126,7 +132,16 @@ impl BootstrapManager { if pm.is_installed(component.name) { pm.start(component.name)?; } else { - if let Err(e) = self.update_bot_config(component.name) { + let database_url = std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()); + let mut conn = diesel::pg::PgConnection::establish(&database_url) + .map_err(|e| anyhow::anyhow!("Failed to connect to database: {}", e))?; + let default_bot_id: uuid::Uuid = diesel::sql_query("SELECT id FROM bots LIMIT 1") + .get_result::(&mut conn) + .map(|row| row.id) + .unwrap_or_else(|_| uuid::Uuid::new_v4()); + + if let Err(e) = self.update_bot_config(&default_bot_id, component.name) { error!( "Failed to update bot config after installing {}: {}", component.name, e @@ -291,16 +306,19 @@ impl BootstrapManager { format!("{:x}", hasher.finalize()) } - fn update_bot_config(&self, component: &str) -> Result<()> { + fn update_bot_config(&self, bot_id: &uuid::Uuid, component: &str) -> Result<()> { let database_url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()); let mut conn = diesel::pg::PgConnection::establish(&database_url)?; + let new_id: uuid::Uuid = uuid::Uuid::new_v4(); + for (k, v) in vec![(component.to_string(), "true".to_string())] { diesel::sql_query( - "INSERT INTO bot_configuration (config_key, config_value) VALUES ($1, $2) \ - ON CONFLICT (config_key) DO UPDATE SET config_value = EXCLUDED.config_value", + "INSERT INTO bot_configuration (id, bot_id, config_key, config_value, config_type) VALUES ($1, $2, $3, $4, 'string') ON CONFLICT (bot_id, config_key) DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()", ) + .bind::(new_id) + .bind::(bot_id) .bind::(&k) .bind::(&v) .execute(&mut conn)?; @@ -319,8 +337,9 @@ impl BootstrapManager { .root("/") .endpoint(&config.minio.server) .access_key_id(&config.minio.access_key) - .secret_access_key(&config.minio.secret_key) - )?.finish(); + .secret_access_key(&config.minio.secret_key), + )? + .finish(); let templates_dir = Path::new("templates"); if !templates_dir.exists() { diff --git a/src/config/mod.rs b/src/config/mod.rs index cc9873600..ebcf621a3 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -458,12 +458,14 @@ impl ConfigManager { let key = parts[0].trim(); let value = parts[1].trim(); - diesel::sql_query("INSERT INTO bot_configuration (id, bot_id, config_key, config_value, config_type) VALUES (gen_random_uuid()::text, $1, $2, $3, 'string') ON CONFLICT (bot_id, config_key) DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()") - .bind::(bot_id) - .bind::(key) - .bind::(value) - .execute(&mut *conn) - .map_err(|e| format!("Failed to update config: {}", e))?; +let new_id: uuid::Uuid = uuid::Uuid::new_v4(); +diesel::sql_query("INSERT INTO bot_configuration (id, bot_id, config_key, config_value, config_type) VALUES ($1, $2, $3, $4, 'string') ON CONFLICT (bot_id, config_key) DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()") + .bind::(new_id) + .bind::(bot_id) + .bind::(key) + .bind::(value) + .execute(&mut *conn) + .map_err(|e| format!("Failed to update config: {}", e))?; updated += 1; } From d39e25e5249058852aa38da74a36c0c23e8811a5 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 20:48:28 -0300 Subject: [PATCH 12/16] feat(config): refresh environment before establishing DB connection Reload configuration from environment to ensure latest DATABASE_URL and credentials are used before creating the database connection. This prevents stale config values when environment variables change. --- src/main.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6abb60355..5e9ad0bf9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -131,8 +131,11 @@ async fn main() -> std::io::Result<()> { log::warn!("Failed to upload templates to MinIO: {}", e); } - let config = std::sync::Arc::new(cfg.clone()); - let db_pool = match diesel::Connection::establish(&cfg.database_url()) { + // Refresh configuration from environment to ensure latest DATABASE_URL and credentials + dotenv().ok(); + let refreshed_cfg = AppConfig::from_env(); + let config = std::sync::Arc::new(refreshed_cfg.clone()); + let db_pool = match diesel::Connection::establish(&refreshed_cfg.database_url()) { Ok(conn) => Arc::new(Mutex::new(conn)), Err(e) => { log::error!("Failed to connect to main database: {}", e); From 37c03fa55c1df31c81da074600cbdcb0e9b336d8 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 21:06:31 -0300 Subject: [PATCH 13/16] feat(bootstrap): add env check and improve config update logic Introduce environment existence check to prevent redundant bootstrap runs and ensure smoother startup. Refactor `update_bot_config` to use globally unique config keys and atomic updates for better data consistency. --- src/bootstrap/mod.rs | 27 ++++++++++++++++----------- src/main.rs | 39 ++++++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index 216a099ae..66d9b2434 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -307,22 +307,27 @@ impl BootstrapManager { } fn update_bot_config(&self, bot_id: &uuid::Uuid, component: &str) -> Result<()> { + use diesel::sql_types::{Uuid as SqlUuid, Text}; let database_url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()); let mut conn = diesel::pg::PgConnection::establish(&database_url)?; - let new_id: uuid::Uuid = uuid::Uuid::new_v4(); + // Ensure globally unique keys and update values atomically + let config_key = format!("{}_{}", bot_id, component); + let config_value = "true".to_string(); + let new_id = uuid::Uuid::new_v4(); - for (k, v) in vec![(component.to_string(), "true".to_string())] { - diesel::sql_query( - "INSERT INTO bot_configuration (id, bot_id, config_key, config_value, config_type) VALUES ($1, $2, $3, $4, 'string') ON CONFLICT (bot_id, config_key) DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()", - ) - .bind::(new_id) - .bind::(bot_id) - .bind::(&k) - .bind::(&v) - .execute(&mut conn)?; - } + diesel::sql_query( + "INSERT INTO bot_configuration (id, bot_id, config_key, config_value, config_type) + VALUES ($1, $2, $3, $4, 'string') + ON CONFLICT (config_key) + DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()" + ) + .bind::(new_id) + .bind::(bot_id) + .bind::(&config_key) + .bind::(&config_value) + .execute(&mut conn)?; Ok(()) } diff --git a/src/main.rs b/src/main.rs index 5e9ad0bf9..e2bddc32b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -107,25 +107,38 @@ async fn main() -> std::io::Result<()> { }; let mut bootstrap = BootstrapManager::new(install_mode.clone(), tenant.clone()); - let cfg = match bootstrap.bootstrap() { - Ok(config) => { - info!("Bootstrap completed successfully"); - config + + // Prevent double bootstrap: skip if environment already initialized + let env_path = std::env::current_dir()?.join("botserver-stack").join(".env"); + let cfg = if env_path.exists() { + info!("Environment already initialized, skipping bootstrap"); + match diesel::Connection::establish( + &std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()), + ) { + Ok(mut conn) => AppConfig::from_database(&mut conn), + Err(_) => AppConfig::from_env(), } - Err(e) => { - log::error!("Bootstrap failed: {}", e); - match diesel::Connection::establish( - &std::env::var("DATABASE_URL") - .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()), - ) { - Ok(mut conn) => AppConfig::from_database(&mut conn), - Err(_) => { - AppConfig::from_env() + } else { + match bootstrap.bootstrap() { + Ok(config) => { + info!("Bootstrap completed successfully"); + config + } + Err(e) => { + log::error!("Bootstrap failed: {}", e); + match diesel::Connection::establish( + &std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()), + ) { + Ok(mut conn) => AppConfig::from_database(&mut conn), + Err(_) => AppConfig::from_env(), } } } }; + let _ = bootstrap.start_all(); if let Err(e) = bootstrap.upload_templates_to_minio(&cfg).await { log::warn!("Failed to upload templates to MinIO: {}", e); From 149f53748530ae6fa402e3547c527d3c1a94d67a Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 21:16:25 -0300 Subject: [PATCH 14/16] fix(installer): update MinIO setup to use admin user creation Replaces hardcoded alias setup with commands that create and configure a MinIO admin user, ensuring proper authentication and permissions during installation. --- src/package_manager/installer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package_manager/installer.rs b/src/package_manager/installer.rs index 7c5c2562b..ddca65270 100644 --- a/src/package_manager/installer.rs +++ b/src/package_manager/installer.rs @@ -107,7 +107,7 @@ impl PackageManager { ("DRIVE_ROOT_PASSWORD".to_string(), drive_password.clone()), ]), data_download_list: Vec::new(), - exec_cmd: "nohup {{BIN_PATH}}/minio server {{DATA_PATH}} --address :9000 --console-address :9001 > {{LOGS_PATH}}/minio.log 2>&1 & sleep 5 && {{BIN_PATH}}/mc alias set drive http://localhost:9000 $DRIVE_ROOT_USER $DRIVE_ROOT_PASSWORD && {{BIN_PATH}}/mc mb drive/default.gbai || true".to_string(), + exec_cmd: "nohup {{BIN_PATH}}/minio server {{DATA_PATH}} --address :9000 --console-address :9001 > {{LOGS_PATH}}/minio.log 2>&1 & sleep 5 && {{BIN_PATH}}/mc alias set drive http://localhost:9000 minioadmin minioadmin && {{BIN_PATH}}/mc admin user add drive $DRIVE_ROOT_USER $DRIVE_ROOT_PASSWORD && {{BIN_PATH}}/mc admin policy attach drive readwrite --user $DRIVE_ROOT_USER && {{BIN_PATH}}/mc mb drive/default.gbai || true".to_string(), }, ); From 4d14131acf9b4a8ffbf6dd0c515d4d47d2a63a3e Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Tue, 28 Oct 2025 21:33:09 -0300 Subject: [PATCH 15/16] feat(storage): add S3 bucket existence check during startup Introduces an async helper function to verify and create the configured S3 bucket if missing. This ensures the application has a valid storage target before initializing the drive, improving reliability in environments with dynamic bucket provisioning. --- src/main.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main.rs b/src/main.rs index e2bddc32b..1849f04f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -193,6 +193,31 @@ async fn main() -> std::io::Result<()> { )); let tool_api = Arc::new(tools::ToolApi::new()); + use opendal::services::S3; + use opendal::Operator; + use opendal::ErrorKind; + + async fn ensure_bucket_exists(cfg: &AppConfig) { + let builder = S3::default() + .endpoint(&cfg.minio.server) + .access_key_id(&cfg.minio.access_key) + .secret_access_key(&cfg.minio.secret_key) + .bucket(&cfg.s3_bucket) + .root("/"); + let op = Operator::new(builder).unwrap().finish(); + match op.stat("/").await { + Ok(_) => info!("Bucket {} exists", cfg.s3_bucket), + Err(e) if e.kind() == ErrorKind::NotFound => { + if let Err(err) = op.create_dir("/").await { + info!("Created bucket {}: {:?}", cfg.s3_bucket, err); + } + } + Err(e) => info!("Bucket check failed: {:?}", e), + } + } + + ensure_bucket_exists(&config).await; + let drive = init_drive(&config.minio) .await .expect("Failed to initialize Drive"); From 7b4e7bc8008308fb4a4c5b91067a4075ae644e22 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Wed, 29 Oct 2025 09:54:39 -0300 Subject: [PATCH 16/16] refactor(config): remove unused S3 bucket configuration and setup logic Eliminates the `s3_bucket` field from `AppConfig` and deletes related initialization code in `main.rs`. This simplifies configuration management since S3 bucket handling is no longer required or used in the application. --- add-req.sh | 13 ++- src/basic/keywords/get.rs | 2 +- src/bootstrap/mod.rs | 92 ++++++++++++++----- src/config/mod.rs | 9 +- src/main.rs | 30 +----- .../annoucements.gbot/config.csv | 4 + .../announcements.gbdialog/change-subject.bas | 9 ++ .../announcements.gbdialog/start.bas | 18 +++- .../announcements.gbdialog/update-summary.bas | 8 +- .../default.gbai/default.gbot/config.csv | 6 +- 10 files changed, 120 insertions(+), 71 deletions(-) create mode 100644 templates/announcements.gbai/annoucements.gbot/config.csv create mode 100644 templates/announcements.gbai/announcements.gbdialog/change-subject.bas diff --git a/add-req.sh b/add-req.sh index 7b50bef5c..0fce6738b 100755 --- a/add-req.sh +++ b/add-req.sh @@ -20,25 +20,24 @@ done dirs=( # "auth" - "automation" - "basic" + # "automation" + # "basic" # "bot" "bootstrap" - # "package_manager" + "package_manager" # "channels" # "config" # "context" # "email" - # "file" + "file" # "llm" "drive_monitor" # "llm_legacy" # "org" # "session" - "file" - "kb" + #"kb" "shared" - "tests" + #"tests" # "tools" # "web_automation" # "whatsapp" diff --git a/src/basic/keywords/get.rs b/src/basic/keywords/get.rs index 089c75f76..aa2ab44b1 100644 --- a/src/basic/keywords/get.rs +++ b/src/basic/keywords/get.rs @@ -175,7 +175,7 @@ pub async fn get_from_bucket( "App configuration missing".into() })?; - let org_prefix = &cfg.minio.org_prefix; + let org_prefix = &cfg.drive.org_prefix; if org_prefix.contains("..") || org_prefix.contains('/') || org_prefix.contains('\\') { error!("Invalid org_prefix: {}", org_prefix); diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index 66d9b2434..6988f6381 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -2,11 +2,10 @@ use crate::config::AppConfig; use crate::package_manager::{InstallMode, PackageManager}; use anyhow::Result; use diesel::connection::SimpleConnection; -use diesel::{Connection, QueryableByName}; use diesel::RunQueryDsl; +use diesel::{Connection, QueryableByName}; use dotenvy::dotenv; -use log::{error, info}; -use opendal::services::S3; +use log::{error, info, trace}; use opendal::Operator; use rand::distr::Alphanumeric; use rand::Rng; @@ -29,6 +28,7 @@ pub struct ComponentInfo { pub struct BootstrapManager { pub install_mode: InstallMode, pub tenant: Option, + pub s3_operator: Operator, } impl BootstrapManager { @@ -37,9 +37,12 @@ impl BootstrapManager { "Initializing BootstrapManager with mode {:?} and tenant {:?}", install_mode, tenant ); + let config = AppConfig::from_env(); + let s3_operator = Self::create_s3_operator(&config); Self { install_mode, tenant, + s3_operator, } } @@ -289,9 +292,21 @@ impl BootstrapManager { } } + self.s3_operator = Self::create_s3_operator(&config); Ok(config) } + fn create_s3_operator(config: &AppConfig) -> Operator { + use opendal::Scheme; + use std::collections::HashMap; + let mut map = HashMap::new(); + map.insert("endpoint".to_string(), config.drive.server.clone()); + map.insert("access_key_id".to_string(), config.drive.access_key.clone()); + map.insert("secret_access_key".to_string(), config.drive.secret_key.clone()); + trace!("Creating S3 operator with endpoint {}", config.drive.server); + Operator::via_iter(Scheme::S3, map).expect("Failed to initialize S3 operator") + } + fn generate_secure_password(&self, length: usize) -> String { let mut rng = rand::rng(); std::iter::repeat_with(|| rng.sample(Alphanumeric) as char) @@ -307,7 +322,7 @@ impl BootstrapManager { } fn update_bot_config(&self, bot_id: &uuid::Uuid, component: &str) -> Result<()> { - use diesel::sql_types::{Uuid as SqlUuid, Text}; + use diesel::sql_types::{Text, Uuid as SqlUuid}; let database_url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "postgres://gbuser:@localhost:5432/botserver".to_string()); let mut conn = diesel::pg::PgConnection::establish(&database_url)?; @@ -321,7 +336,7 @@ impl BootstrapManager { "INSERT INTO bot_configuration (id, bot_id, config_key, config_value, config_type) VALUES ($1, $2, $3, $4, 'string') ON CONFLICT (config_key) - DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()" + DO UPDATE SET config_value = EXCLUDED.config_value, updated_at = NOW()", ) .bind::(new_id) .bind::(bot_id) @@ -332,39 +347,53 @@ impl BootstrapManager { Ok(()) } - pub async fn upload_templates_to_minio(&self, config: &AppConfig) -> Result<()> { + pub async fn upload_templates_to_drive(&self, config: &AppConfig) -> Result<()> { let database_url = std::env::var("DATABASE_URL").unwrap_or_else(|_| config.database_url()); let mut conn = diesel::PgConnection::establish(&database_url)?; self.create_bots_from_templates(&mut conn)?; - - let client = Operator::new( - S3::default() - .root("/") - .endpoint(&config.minio.server) - .access_key_id(&config.minio.access_key) - .secret_access_key(&config.minio.secret_key), - )? - .finish(); - let templates_dir = Path::new("templates"); if !templates_dir.exists() { return Ok(()); } - + let operator = &self.s3_operator; for entry in std::fs::read_dir(templates_dir)? { + let bot_name = templates_dir + .read_dir()? + .filter_map(|e| e.ok()) + .find(|e| { + e.path().is_dir() + && e.path() + .file_name() + .unwrap() + .to_string_lossy() + .ends_with(".gbai") + }) + .map(|e| { + let name = e.path().file_name().unwrap().to_string_lossy().to_string(); + name + }) + .unwrap_or_else(|| "default".to_string()); let entry = entry?; let path = entry.path(); - if path.is_dir() && path.extension().map(|e| e == "gbai").unwrap_or(false) { + if path.is_dir() + && path + .file_name() + .unwrap() + .to_string_lossy() + .ends_with(".gbai") + { let bot_name = path.file_name().unwrap().to_string_lossy().to_string(); - - self.upload_directory_recursive(&client, &path, &bot_name, "") + let bucket = bot_name.clone(); + info!("Uploading template {} to Drive bucket {}", bot_name, bucket); + self.upload_directory_recursive(&operator, &path, &bucket, &bot_name) .await?; + info!("Uploaded template {} to Drive bucket {}", bot_name, bucket); } } - Ok(()) } + fn create_bots_from_templates(&self, conn: &mut diesel::PgConnection) -> Result<()> { use crate::shared::models::schema::bots; use diesel::prelude::*; @@ -425,6 +454,16 @@ impl BootstrapManager { prefix: &'a str, ) -> std::pin::Pin> + 'a>> { Box::pin(async move { + trace!("Checking bucket existence: {}", bucket); + if client.stat(bucket).await.is_err() { + info!("Bucket {} not found, creating it", bucket); + trace!("Creating bucket: {}", bucket); + client.create_dir(bucket).await?; + trace!("Bucket {} created successfully", bucket); + } else { + trace!("Bucket {} already exists", bucket); + } + trace!("Starting upload from local path: {}", local_path.display()); for entry in std::fs::read_dir(local_path)? { let entry = entry?; let path = entry.path(); @@ -443,7 +482,18 @@ impl BootstrapManager { key ); let content = std::fs::read(&path)?; + trace!( + "Writing file {} to bucket {} with key {}", + path.display(), + bucket, + key + ); client.write(&key, content).await?; + trace!( + "Successfully wrote file {} to bucket {}", + path.display(), + bucket + ); } else if path.is_dir() { self.upload_directory_recursive(client, &path, bucket, &key) .await?; diff --git a/src/config/mod.rs b/src/config/mod.rs index ebcf621a3..f0f75a58c 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -8,14 +8,13 @@ use std::sync::{Arc, Mutex}; #[derive(Clone)] pub struct AppConfig { - pub minio: DriveConfig, + pub drive: DriveConfig, pub server: ServerConfig, pub database: DatabaseConfig, pub database_custom: DatabaseConfig, pub email: EmailConfig, pub ai: AIConfig, pub site_path: String, - pub s3_bucket: String, pub stack_path: PathBuf, pub db_conn: Option>>, } @@ -218,7 +217,7 @@ impl AppConfig { }; AppConfig { - minio, + drive: minio, server: ServerConfig { host: get_str("SERVER_HOST", "127.0.0.1"), port: get_u16("SERVER_PORT", 8080), @@ -227,7 +226,6 @@ impl AppConfig { database_custom, email, ai, - s3_bucket: get_str("DRIVE_BUCKET", "default"), site_path: get_str("SITES_ROOT", "./botserver-stack/sites"), stack_path, db_conn: None, @@ -300,7 +298,7 @@ impl AppConfig { }; AppConfig { - minio, + drive: minio, server: ServerConfig { host: std::env::var("SERVER_HOST").unwrap_or_else(|_| "127.0.0.1".to_string()), port: std::env::var("SERVER_PORT") @@ -312,7 +310,6 @@ impl AppConfig { database_custom, email, ai, - s3_bucket: std::env::var("DRIVE_BUCKET").unwrap_or_else(|_| "default".to_string()), site_path: std::env::var("SITES_ROOT") .unwrap_or_else(|_| "./botserver-stack/sites".to_string()), stack_path: PathBuf::from(stack_path), diff --git a/src/main.rs b/src/main.rs index 1849f04f1..fddf2d36c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -140,7 +140,7 @@ async fn main() -> std::io::Result<()> { let _ = bootstrap.start_all(); - if let Err(e) = bootstrap.upload_templates_to_minio(&cfg).await { + if let Err(e) = bootstrap.upload_templates_to_drive(&cfg).await { log::warn!("Failed to upload templates to MinIO: {}", e); } @@ -193,32 +193,8 @@ async fn main() -> std::io::Result<()> { )); let tool_api = Arc::new(tools::ToolApi::new()); - use opendal::services::S3; - use opendal::Operator; - use opendal::ErrorKind; - async fn ensure_bucket_exists(cfg: &AppConfig) { - let builder = S3::default() - .endpoint(&cfg.minio.server) - .access_key_id(&cfg.minio.access_key) - .secret_access_key(&cfg.minio.secret_key) - .bucket(&cfg.s3_bucket) - .root("/"); - let op = Operator::new(builder).unwrap().finish(); - match op.stat("/").await { - Ok(_) => info!("Bucket {} exists", cfg.s3_bucket), - Err(e) if e.kind() == ErrorKind::NotFound => { - if let Err(err) = op.create_dir("/").await { - info!("Created bucket {}: {:?}", cfg.s3_bucket, err); - } - } - Err(e) => info!("Bucket check failed: {:?}", e), - } - } - - ensure_bucket_exists(&config).await; - - let drive = init_drive(&config.minio) + let drive = init_drive(&config.drive) .await .expect("Failed to initialize Drive"); @@ -279,7 +255,7 @@ async fn main() -> std::io::Result<()> { let drive_state = app_state.clone(); let bot_guid = std::env::var("BOT_GUID").unwrap_or_else(|_| "default_bot".to_string()); - let bucket_name = format!("{}{}.gbai", cfg.minio.org_prefix, bot_guid); + let bucket_name = format!("{}{}.gbai", cfg.drive.org_prefix, bot_guid); let drive_monitor = Arc::new(DriveMonitor::new(drive_state, bucket_name)); let _drive_handle = drive_monitor.spawn(); diff --git a/templates/announcements.gbai/annoucements.gbot/config.csv b/templates/announcements.gbai/annoucements.gbot/config.csv new file mode 100644 index 000000000..d639a67ef --- /dev/null +++ b/templates/announcements.gbai/annoucements.gbot/config.csv @@ -0,0 +1,4 @@ +name,value +prompt-compact, 10 +prompt-cache,true +prompt-fixed-kb,geral diff --git a/templates/announcements.gbai/announcements.gbdialog/change-subject.bas b/templates/announcements.gbai/announcements.gbdialog/change-subject.bas new file mode 100644 index 000000000..e2ffefa5f --- /dev/null +++ b/templates/announcements.gbai/announcements.gbdialog/change-subject.bas @@ -0,0 +1,9 @@ +PARAM subject as string +DESCRIPTION "Chamado quando alguém quer mudar o assunto da conversa." + +kbname = LLM "Devolva uma única palavra circular, comunicado ou geral de acordo com a seguinte frase:" + subject + +ADD_KB kbname + + +TALK "You have chosen to change the subject to " + subject + "." \ No newline at end of file diff --git a/templates/announcements.gbai/announcements.gbdialog/start.bas b/templates/announcements.gbai/announcements.gbdialog/start.bas index 7a5f9df5f..16be13d83 100644 --- a/templates/announcements.gbai/announcements.gbdialog/start.bas +++ b/templates/announcements.gbai/announcements.gbdialog/start.bas @@ -1,9 +1,17 @@ -LET resume = GET_BOT_MEMORY("resume") +LET resume1 = GET_BOT_MEMORY("general") +LET resume2 = GET_BOT_MEMORY("auxiliom") +LET resume3 = GET_BOT_MEMORY("toolbix") -IF resume <> "" THEN - TALK resume -END IF +SET_CONTEXT "general", resume1 +SET_CONTEXT "auxiliom", resume2 +SET_CONTEXT "toolbix", resume3 + + +ADD_SUGGESTION "general", "Show me the weekly announcements" +ADD_SUGGESTION "auxiliom", "Will Auxiliom help me with what?" +ADD_SUGGESTION "auxiliom", "What does Auxiliom do?" +ADD_SUGGESTION "toolbix", "Show me Toolbix features" +ADD_SUGGESTION "toolbix", "How can Toolbix help my business?" -ADD_KB "weekly" TALK "You can ask me about any of the announcements or circulars." diff --git a/templates/announcements.gbai/announcements.gbdialog/update-summary.bas b/templates/announcements.gbai/announcements.gbdialog/update-summary.bas index 8a736cf7b..d164e53ab 100644 --- a/templates/announcements.gbai/announcements.gbdialog/update-summary.bas +++ b/templates/announcements.gbai/announcements.gbdialog/update-summary.bas @@ -1,5 +1,11 @@ -let text = GET "default.gbdrive/default.pdf" +let text = GET "announcements.gbkb/news/news.pdf" let resume = LLM "Resume this document, in a table (DO NOT THINK) no_think: " + text SET_BOT_MEMORY "resume", resume + +let text1 = GET "announcements.gbkb/auxiliom/auxiliom.pdf" +SET_BOT_MEMORY "auxiliom", text1 + +let text2 = GET "announcements.gbkb/toolbix/toolbix.pdf" +SET_BOT_MEMORY "toolbix", text2 \ No newline at end of file diff --git a/templates/default.gbai/default.gbot/config.csv b/templates/default.gbai/default.gbot/config.csv index 8a4f03d93..3d3fcf938 100644 --- a/templates/default.gbai/default.gbot/config.csv +++ b/templates/default.gbai/default.gbot/config.csv @@ -1,8 +1,8 @@ name,value -server_host=0.0.0.0 -server_port=8080 -sites_root=/tmp +server_host,0.0.0.0 +server_port,8080 +sites_root,/tmp llm-key,gsk_ llm-model,openai/gpt-oss-20b