diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d46766b..e66623b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -132,6 +132,21 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -140,9 +155,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "serde_core", ] @@ -225,7 +240,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cairo-sys-rs", "glib", "libc", @@ -288,9 +303,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "shlex", @@ -442,11 +457,11 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation", "core-graphics-types", "foreign-types", @@ -459,7 +474,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation", "libc", ] @@ -524,6 +539,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + [[package]] name = "cssparser-macros" version = "0.6.1" @@ -573,9 +601,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ "darling_core", "darling_macro", @@ -583,11 +611,10 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", @@ -597,9 +624,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", @@ -650,6 +677,27 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + [[package]] name = "digest" version = "0.10.7" @@ -701,19 +749,15 @@ dependencies = [ "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" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", + "block2", + "libc", "objc2", ] @@ -751,6 +795,21 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + [[package]] name = "dpi" version = "0.1.2" @@ -814,9 +873,9 @@ dependencies = [ [[package]] name = "embed-resource" -version = "3.0.6" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" dependencies = [ "cc", "memchr", @@ -849,9 +908,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ "serde", "serde_core", @@ -868,6 +927,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + [[package]] name = "fdeflate" version = "0.3.7" @@ -932,6 +997,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.5.0" @@ -1200,20 +1271,20 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] @@ -1256,7 +1327,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "futures-channel", "futures-core", "futures-executor", @@ -1378,14 +1449,14 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" @@ -1413,10 +1484,20 @@ checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", - "markup5ever", + "markup5ever 0.14.1", "match_token", ] +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + [[package]] name = "http" version = "1.4.0" @@ -1458,9 +1539,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1471,7 +1552,6 @@ dependencies = [ "httparse", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1479,15 +1559,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1553,12 +1632,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1566,9 +1646,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1579,9 +1659,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1593,15 +1673,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1613,15 +1693,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1667,9 +1747,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", @@ -1691,12 +1771,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -1712,15 +1792,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -1747,9 +1827,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "javascriptcore-rs" @@ -1783,7 +1863,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -1792,16 +1872,40 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "js-sys" -version = "0.3.90" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dc6f6450b3f6d4ed5b16327f38fed626d375a886159ca555bd7822c0c3a5a6" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -1834,7 +1938,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "serde", "unicode-segmentation", ] @@ -1845,18 +1949,12 @@ version = "0.8.8-speedreader" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ - "cssparser", - "html5ever", - "indexmap 2.13.0", - "selectors", + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.14.0", + "selectors 0.24.0", ] -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - [[package]] name = "leb128fmt" version = "0.1.0" @@ -1889,9 +1987,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.182" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libloading" @@ -1905,12 +2003,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", + "plain", "redox_syscall 0.7.4", ] @@ -1922,9 +2021,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1962,9 +2061,20 @@ dependencies = [ "log", "phf 0.11.3", "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms", ] [[package]] @@ -2017,9 +2127,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi 0.11.1+wasi-snapshot-preview1", @@ -2028,9 +2138,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.11" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -2038,9 +2148,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.17.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" dependencies = [ "crossbeam-channel", "dpi", @@ -2063,8 +2173,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.0", - "jni-sys", + "bitflags 2.11.1", + "jni-sys 0.3.1", "log", "ndk-sys", "num_enum", @@ -2084,7 +2194,7 @@ version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "jni-sys", + "jni-sys 0.3.1", ] [[package]] @@ -2101,9 +2211,9 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-traits" @@ -2116,9 +2226,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -2126,11 +2236,11 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 3.5.0", "proc-macro2", "quote", "syn 2.0.117", @@ -2138,9 +2248,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", "objc2-exception-helper", @@ -2152,40 +2262,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2", - "libc", "objc2", - "objc2-cloud-kit", - "objc2-core-data", "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-text", - "objc2-core-video", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-data" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" -dependencies = [ - "bitflags 2.11.0", - "objc2", "objc2-foundation", ] @@ -2195,7 +2275,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "dispatch2", "objc2", ] @@ -2206,48 +2286,13 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "dispatch2", "objc2", "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", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "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.11.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-io-surface", -] - [[package]] name = "objc2-encode" version = "4.1.0" @@ -2269,9 +2314,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2", - "libc", "objc2", "objc2-core-foundation", ] @@ -2282,17 +2326,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.11.0", - "objc2", - "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 = [ + "bitflags 2.11.1", "objc2", "objc2-core-foundation", ] @@ -2303,30 +2337,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "objc2", "objc2-core-foundation", "objc2-foundation", ] -[[package]] -name = "objc2-security" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "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.11.0", + "bitflags 2.11.1", "objc2", "objc2-core-foundation", "objc2-foundation", @@ -2338,21 +2361,19 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2", "objc2", "objc2-app-kit", "objc2-core-foundation", "objc2-foundation", - "objc2-javascript-core", - "objc2-security", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "open" @@ -2472,6 +2493,17 @@ dependencies = [ "phf_shared 0.11.3", ] +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + [[package]] name = "phf_codegen" version = "0.8.0" @@ -2492,6 +2524,16 @@ dependencies = [ "phf_shared 0.11.3", ] +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + [[package]] name = "phf_generator" version = "0.8.0" @@ -2522,6 +2564,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + [[package]] name = "phf_macros" version = "0.10.0" @@ -2549,6 +2601,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "phf_shared" version = "0.8.0" @@ -2577,16 +2642,19 @@ dependencies = [ ] [[package]] -name = "pin-project-lite" -version = "0.2.16" +name = "phf_shared" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] [[package]] -name = "pin-utils" -version = "0.1.0" +name = "pin-project-lite" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkcs8" @@ -2600,9 +2668,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plist" @@ -2611,7 +2685,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", - "indexmap 2.13.0", + "indexmap 2.14.0", "quick-xml", "serde", "time", @@ -2636,7 +2710,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "crc32fast", "fdeflate", "flate2", @@ -2645,9 +2719,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2705,11 +2779,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -2753,12 +2827,9 @@ dependencies = [ [[package]] name = "pxfm" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" -dependencies = [ - "num-traits", -] +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" [[package]] name = "quick-xml" @@ -2798,7 +2869,7 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", "rustc-hash", "rustls", @@ -2826,9 +2897,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2839,6 +2910,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.7.3" @@ -2866,9 +2943,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -2961,7 +3038,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -2970,7 +3047,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -3135,9 +3212,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -3154,7 +3231,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys", @@ -3163,9 +3240,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" dependencies = [ "once_cell", "ring", @@ -3187,9 +3264,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "ring", "rustls-pki-types", @@ -3281,22 +3358,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", - "cssparser", - "derive_more", + "cssparser 0.29.6", + "derive_more 0.99.20", "fxhash", "log", "phf 0.8.0", "phf_codegen 0.8.0", "precomputed-hash", - "servo_arc", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.1", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", "smallvec", ] [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -3390,9 +3486,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -3411,15 +3507,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.17.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.0", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -3430,9 +3526,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.17.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ "darling", "proc-macro2", @@ -3472,6 +3568,15 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "sha2" version = "0.10.9" @@ -3542,9 +3647,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "siphasher" @@ -3572,12 +3677,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3657,6 +3762,18 @@ dependencies = [ "serde", ] +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + [[package]] name = "string_cache_codegen" version = "0.5.4" @@ -3669,6 +3786,18 @@ dependencies = [ "quote", ] +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + [[package]] name = "strsim" version = "0.11.1" @@ -3749,23 +3878,22 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.5" +version = "0.34.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" +checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2", "core-foundation", "core-graphics", "crossbeam-channel", - "dispatch", + "dispatch2", "dlopen2", "dpi", "gdkwayland-sys", "gdkx11-sys", "gtk", "jni", - "lazy_static", "libc", "log", "ndk", @@ -3777,7 +3905,6 @@ dependencies = [ "once_cell", "parking_lot", "raw-window-handle", - "scopeguard", "tao-macros", "unicode-segmentation", "url", @@ -3817,9 +3944,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.10.2" +version = "2.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" dependencies = [ "anyhow", "bytes", @@ -3869,9 +3996,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.5.5" +version = "2.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" dependencies = [ "anyhow", "cargo_toml", @@ -3891,9 +4018,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.5.4" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" dependencies = [ "base64 0.22.1", "brotli", @@ -3918,9 +4045,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.5.4" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3932,9 +4059,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" dependencies = [ "anyhow", "glob", @@ -3984,9 +4111,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" dependencies = [ "cookie", "dpi", @@ -4009,9 +4136,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" dependencies = [ "gtk", "http", @@ -4019,7 +4146,6 @@ dependencies = [ "log", "objc2", "objc2-app-kit", - "objc2-foundation", "once_cell", "percent-encoding", "raw-window-handle", @@ -4036,9 +4162,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.8.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" dependencies = [ "anyhow", "brotli", @@ -4046,7 +4172,7 @@ dependencies = [ "ctor", "dunce", "glob", - "html5ever", + "html5ever 0.29.1", "http", "infer", "json-patch", @@ -4094,6 +4220,16 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -4167,9 +4303,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -4177,9 +4313,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -4192,9 +4328,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" dependencies = [ "bytes", "libc", @@ -4246,13 +4382,13 @@ version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde_core", - "serde_spanned 1.0.4", + "serde_spanned 1.1.1", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.14", + "winnow 0.7.15", ] [[package]] @@ -4273,13 +4409,22 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +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.13.0", + "indexmap 2.14.0", "toml_datetime 0.6.3", "winnow 0.5.40", ] @@ -4290,7 +4435,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.3", @@ -4299,30 +4444,30 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 0.7.14", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 0.7.14", + "winnow 1.0.1", ] [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tower" @@ -4346,7 +4491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "async-compression", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytes", "futures-core", "futures-util", @@ -4482,9 +4627,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-xid" @@ -4543,11 +4688,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.21.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ - "getrandom 0.4.1", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -4636,9 +4781,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.113" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60722a937f594b7fde9adb894d7c092fc1bb6612897c46368d18e7a20208eff2" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -4649,23 +4794,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.63" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a89f4650b770e4521aa6573724e2aed4704372151bd0de9d16a3bbabb87441a" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.113" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac8c6395094b6b91c4af293f4c79371c163f9a6f56184d2c9a85f5a95f3950" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4673,9 +4814,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.113" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3fabce6159dc20728033842636887e4877688ae94382766e00b180abac9d60" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -4686,9 +4827,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.113" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0e091bdb824da87dc01d967388880d017a0a9bc4f3bdc0d86ee9f9336e3bb5" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -4710,7 +4851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.13.0", + "indexmap 2.14.0", "wasm-encoder", "wasmparser", ] @@ -4747,17 +4888,17 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "semver", ] [[package]] name = "web-sys" -version = "0.3.90" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705eceb4ce901230f8625bd1d665128056ccbe4b7408faa625eec1ba80f59a97" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -4773,6 +4914,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + [[package]] name = "webkit2gtk" version = "2.0.2" @@ -5307,9 +5460,15 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] @@ -5361,7 +5520,7 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "prettyplease", "syn 2.0.117", "wasm-metadata", @@ -5391,8 +5550,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", - "indexmap 2.13.0", + "bitflags 2.11.1", + "indexmap 2.14.0", "log", "serde", "serde_derive", @@ -5411,7 +5570,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "semver", "serde", @@ -5423,30 +5582,29 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wry" -version = "0.54.2" +version = "0.54.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb26159b420aa77684589a744ae9a9461a95395b848764ad12290a14d960a11a" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" dependencies = [ "base64 0.22.1", "block2", "cookie", "crossbeam-channel", "dirs 6.0.0", + "dom_query", "dpi", "dunce", "gdkx11", "gtk", - "html5ever", "http", "javascriptcore-rs", "jni", - "kuchikiki", "libc", "ndk", "objc2", @@ -5505,9 +5663,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5516,9 +5674,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -5528,18 +5686,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -5548,18 +5706,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -5575,9 +5733,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -5586,9 +5744,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -5597,9 +5755,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", @@ -5617,7 +5775,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.13.0", + "indexmap 2.14.0", "memchr", "thiserror 2.0.18", "zopfli", diff --git a/src-tauri/src/commands/hermes.rs b/src-tauri/src/commands/hermes.rs index 46850cf..26f345c 100644 --- a/src-tauri/src/commands/hermes.rs +++ b/src-tauri/src/commands/hermes.rs @@ -39,7 +39,12 @@ static GW_APP_HANDLE: OnceLock = OnceLock::new(); fn hermes_gateway_url() -> String { // 先检查 panel config 中是否配置了自定义 URL if let Some(url) = super::read_panel_config_value() - .and_then(|v| v.get("hermes")?.get("gatewayUrl")?.as_str().map(String::from)) + .and_then(|v| { + v.get("hermes")? + .get("gatewayUrl")? + .as_str() + .map(String::from) + }) .filter(|s| !s.trim().is_empty()) { return url.trim_end_matches('/').to_string(); @@ -67,7 +72,6 @@ fn kill_gateway_pid() -> bool { } #[cfg(not(target_os = "windows"))] { - use std::os::unix::process::ExitStatusExt; let ok = std::process::Command::new("kill") .args(["-9", &pid.to_string()]) .output() @@ -177,7 +181,12 @@ async fn gateway_quick_health_check() -> bool { .no_proxy() .build(); match client { - Ok(c) => c.get(&health_url).send().await.map(|r| r.status().is_success()).unwrap_or(false), + Ok(c) => c + .get(&health_url) + .send() + .await + .map(|r| r.status().is_success()) + .unwrap_or(false), Err(_) => false, } } @@ -203,7 +212,9 @@ async fn do_restart_gateway() -> Result<(), String> { .append(true) .open(&log_path) .map_err(|e| format!("打开日志失败: {e}"))?; - let log_err = log_file.try_clone().map_err(|e| format!("克隆日志句柄失败: {e}"))?; + let log_err = log_file + .try_clone() + .map_err(|e| format!("克隆日志句柄失败: {e}"))?; let mut cmd = std::process::Command::new("hermes"); cmd.args(["gateway", "run"]) @@ -229,7 +240,9 @@ async fn do_restart_gateway() -> Result<(), String> { } } - let child = cmd.spawn().map_err(|e| format!("启动 hermes gateway run 失败: {e}"))?; + let child = cmd + .spawn() + .map_err(|e| format!("启动 hermes gateway run 失败: {e}"))?; GW_PID.store(child.id(), Ordering::SeqCst); // 4. 等待端口可达(最多 15s) @@ -237,7 +250,9 @@ async fn do_restart_gateway() -> Result<(), String> { let addr: std::net::SocketAddr = format!("127.0.0.1:{port}").parse().unwrap(); for _ in 0..30 { tokio::time::sleep(std::time::Duration::from_millis(500)).await; - if std::net::TcpStream::connect_timeout(&addr, std::time::Duration::from_millis(500)).is_ok() { + if std::net::TcpStream::connect_timeout(&addr, std::time::Duration::from_millis(500)) + .is_ok() + { return Ok(()); } } @@ -248,11 +263,14 @@ async fn do_restart_gateway() -> Result<(), String> { fn emit_gateway_status(running: bool) { if let Some(app) = GW_APP_HANDLE.get() { let port = hermes_gateway_port(); - let _ = app.emit("hermes-gateway-status", serde_json::json!({ - "running": running, - "port": port, - "url": hermes_gateway_url(), - })); + let _ = app.emit( + "hermes-gateway-status", + serde_json::json!({ + "running": running, + "port": port, + "url": hermes_gateway_url(), + }), + ); } } @@ -266,7 +284,10 @@ fn emit_guardian_log(msg: &str) { /// 启动 Guardian(如果尚未运行) fn start_guardian(app: &tauri::AppHandle) { let _ = GW_APP_HANDLE.set(app.clone()); - if GW_GUARDIAN_ACTIVE.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst).is_ok() { + if GW_GUARDIAN_ACTIVE + .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) + .is_ok() + { GW_GUARDIAN_STOP.store(false, Ordering::SeqCst); tokio::spawn(gateway_guardian_loop()); } @@ -379,7 +400,11 @@ fn hermes_enhanced_path() -> String { extra.push("/usr/local/bin".into()); } - let sep = if cfg!(target_os = "windows") { ";" } else { ":" }; + let sep = if cfg!(target_os = "windows") { + ";" + } else { + ":" + }; let mut parts: Vec<&str> = extra.iter().map(|s| s.as_str()).collect(); if !current.is_empty() { parts.push(¤t); @@ -413,9 +438,7 @@ fn run_at_path(program: &str, args: &[&str], path: &str) -> Result Result { let path_result = find_executable_path(cmd, &enhanced); result.insert( "path".into(), - path_result - .map(Value::String) - .unwrap_or(Value::Null), + path_result.map(Value::String).unwrap_or(Value::Null), ); found = true; @@ -568,15 +589,25 @@ fn find_executable_path(name: &str, enhanced_path: &str) -> Option { fn current_platform_key() -> &'static str { #[cfg(all(target_os = "windows", target_arch = "x86_64"))] - { "win-x64" } + { + "win-x64" + } #[cfg(all(target_os = "macos", target_arch = "aarch64"))] - { "mac-arm64" } + { + "mac-arm64" + } #[cfg(all(target_os = "macos", target_arch = "x86_64"))] - { "mac-x64" } + { + "mac-x64" + } #[cfg(all(target_os = "linux", target_arch = "x86_64"))] - { "linux-x64" } + { + "linux-x64" + } #[cfg(all(target_os = "linux", target_arch = "aarch64"))] - { "linux-arm64" } + { + "linux-arm64" + } #[cfg(not(any( all(target_os = "windows", target_arch = "x86_64"), all(target_os = "macos", target_arch = "aarch64"), @@ -584,7 +615,9 @@ fn current_platform_key() -> &'static str { all(target_os = "linux", target_arch = "x86_64"), all(target_os = "linux", target_arch = "aarch64"), )))] - { "unknown" } + { + "unknown" + } } // --------------------------------------------------------------------------- @@ -606,7 +639,9 @@ pub fn check_hermes() -> Result { // 提取版本号(格式可能是 "Hermes Agent v0.8.0" 或 "0.8.0") let version = ver_raw .split_whitespace() - .find(|s| s.starts_with('v') || s.chars().next().is_some_and(|c| c.is_ascii_digit())) + .find(|s| { + s.starts_with('v') || s.chars().next().is_some_and(|c| c.is_ascii_digit()) + }) .unwrap_or(&ver_raw) .trim_start_matches('v') .to_string(); @@ -642,7 +677,9 @@ pub fn check_hermes() -> Result { }; result.insert( "managed".into(), - managed.map(|s| Value::String(s.into())).unwrap_or(Value::Null), + managed + .map(|s| Value::String(s.into())) + .unwrap_or(Value::Null), ); // 3. 配置文件检测 @@ -769,7 +806,10 @@ pub async fn install_hermes( let enhanced = hermes_enhanced_path(); match run_at_path("hermes", &["version"], &enhanced) { Ok(ver) => { - let _ = app.emit("hermes-install-log", format!("✅ Hermes Agent 安装成功: {ver}")); + let _ = app.emit( + "hermes-install-log", + format!("✅ Hermes Agent 安装成功: {ver}"), + ); let _ = app.emit("hermes-install-progress", 100u32); let _ = app.emit( "hermes-install-done", @@ -838,7 +878,13 @@ async fn ensure_uv(app: &tauri::AppHandle) -> Result { .await .map_err(|e| format!("uv 下载读取失败: {e}"))?; - let _ = app.emit("hermes-install-log", format!("下载完成 ({:.1}MB),解压中...", bytes.len() as f64 / 1_048_576.0)); + let _ = app.emit( + "hermes-install-log", + format!( + "下载完成 ({:.1}MB),解压中...", + bytes.len() as f64 / 1_048_576.0 + ), + ); let _ = app.emit("hermes-install-progress", 12u32); // 创建目标目录 @@ -902,10 +948,12 @@ fn extract_uv_zip(data: &[u8], dest: &std::path::Path) -> Result<(), String> { /// Unix: 解压 tar.gz 格式的 uv 二进制 #[cfg(not(target_os = "windows"))] fn extract_uv_tar_gz(data: &[u8], dest: &std::path::Path) -> Result<(), String> { - use std::io::Read; let gz = flate2::read::GzDecoder::new(std::io::Cursor::new(data)); let mut archive = tar::Archive::new(gz); - for entry in archive.entries().map_err(|e| format!("tar 解析失败: {e}"))? { + for entry in archive + .entries() + .map_err(|e| format!("tar 解析失败: {e}"))? + { let mut entry = entry.map_err(|e| format!("tar 条目读取失败: {e}"))?; let path = entry .path() @@ -914,10 +962,9 @@ fn extract_uv_tar_gz(data: &[u8], dest: &std::path::Path) -> Result<(), String> if let Some(name) = path.file_name() { if name == "uv" { let out_path = dest.join("uv"); - let mut out_file = std::fs::File::create(&out_path) - .map_err(|e| format!("创建文件失败: {e}"))?; - std::io::copy(&mut entry, &mut out_file) - .map_err(|e| format!("写入失败: {e}"))?; + let mut out_file = + std::fs::File::create(&out_path).map_err(|e| format!("创建文件失败: {e}"))?; + std::io::copy(&mut entry, &mut out_file).map_err(|e| format!("写入失败: {e}"))?; return Ok(()); } } @@ -934,7 +981,10 @@ async fn install_via_uv_tool( uv_path: &str, extras: &[String], ) -> Result<(), String> { - let _ = app.emit("hermes-install-log", "📦 通过 uv tool install 从 GitHub 安装 Hermes Agent..."); + let _ = app.emit( + "hermes-install-log", + "📦 通过 uv tool install 从 GitHub 安装 Hermes Agent...", + ); let _ = app.emit("hermes-install-progress", 25u32); // 构造包名(PEP 508 格式: "pkg[extras] @ git+url") @@ -946,7 +996,9 @@ async fn install_via_uv_tool( }; let mut cmd = tokio::process::Command::new(uv_path); - cmd.args(["tool", "install", "--force", &pkg, "--python", "3.11", "--with", "croniter"]); + cmd.args([ + "tool", "install", "--force", &pkg, "--python", "3.11", "--with", "croniter", + ]); // 配置 PyPI 镜像(extras 的依赖仍从 PyPI 下载) if let Some(mirror) = pypi_mirror_url() { @@ -966,7 +1018,10 @@ async fn install_via_uv_tool( cmd.stdout(std::process::Stdio::piped()); cmd.stderr(std::process::Stdio::piped()); - let _ = app.emit("hermes-install-log", format!("> uv tool install \"{}\" --python 3.11", pkg)); + let _ = app.emit( + "hermes-install-log", + format!("> uv tool install \"{}\" --python 3.11", pkg), + ); let child = cmd.spawn().map_err(|e| format!("启动安装进程失败: {e}"))?; let output = child @@ -1008,7 +1063,10 @@ async fn install_via_uv_pip( uv_path: &str, extras: &[String], ) -> Result<(), String> { - let _ = app.emit("hermes-install-log", "📦 通过 uv venv + pip install 安装..."); + let _ = app.emit( + "hermes-install-log", + "📦 通过 uv venv + pip install 安装...", + ); let _ = app.emit("hermes-install-progress", 25u32); let home = dirs::home_dir().unwrap_or_default(); @@ -1016,7 +1074,10 @@ async fn install_via_uv_pip( let venv_str = venv_dir.to_string_lossy().to_string(); // 创建 venv - let _ = app.emit("hermes-install-log", format!("> uv venv {venv_str} --python 3.11")); + let _ = app.emit( + "hermes-install-log", + format!("> uv venv {venv_str} --python 3.11"), + ); let mut venv_cmd = tokio::process::Command::new(uv_path); venv_cmd.args(["venv", &venv_str, "--python", "3.11"]); super::apply_proxy_env_tokio(&mut venv_cmd); @@ -1124,8 +1185,15 @@ pub async fn configure_hermes( // 创建子目录 for dir in &[ - "cron", "sessions", "logs", "memories", "skills", "pairing", "hooks", - "image_cache", "audio_cache", + "cron", + "sessions", + "logs", + "memories", + "skills", + "pairing", + "hooks", + "image_cache", + "audio_cache", ] { let _ = std::fs::create_dir_all(home.join(dir)); } @@ -1135,7 +1203,7 @@ pub async fn configure_hermes( let env_provider = match provider.as_str() { "anthropic" | "minimax" => "anthropic", "openrouter" => "openrouter", - _ => "openai", // 所有 OpenAI 兼容的 + _ => "openai", // 所有 OpenAI 兼容的 }; // 模型标识:Hermes 直接用模型名,不加 provider/ 前缀 @@ -1149,7 +1217,11 @@ pub async fn configure_hermes( let config_path = home.join("config.yaml"); let base_url_line = if let Some(ref url) = base_url { let u = url.trim(); - if !u.is_empty() { format!(" base_url: {u}\n") } else { String::new() } + if !u.is_empty() { + format!(" base_url: {u}\n") + } else { + String::new() + } } else { String::new() }; @@ -1188,9 +1260,13 @@ platforms: }; // ClawPanel 管理的 key 列表(更新时覆盖,其他 key 保留) let managed_keys: Vec<&str> = vec![ - "OPENAI_API_KEY", "ANTHROPIC_API_KEY", "OPENROUTER_API_KEY", - "OPENAI_BASE_URL", "ANTHROPIC_BASE_URL", - "GATEWAY_ALLOW_ALL_USERS", "API_SERVER_KEY", + "OPENAI_API_KEY", + "ANTHROPIC_API_KEY", + "OPENROUTER_API_KEY", + "OPENAI_BASE_URL", + "ANTHROPIC_BASE_URL", + "GATEWAY_ALLOW_ALL_USERS", + "API_SERVER_KEY", ]; let mut new_pairs: Vec<(String, String)> = vec![ (env_key.into(), api_key.clone()), @@ -1214,7 +1290,12 @@ platforms: let existing = std::fs::read_to_string(&env_path).unwrap_or_default(); merge_env_file(&existing, &managed_keys, &new_pairs) } else { - new_pairs.iter().map(|(k, v)| format!("{k}={v}")).collect::>().join("\n") + "\n" + new_pairs + .iter() + .map(|(k, v)| format!("{k}={v}")) + .collect::>() + .join("\n") + + "\n" }; std::fs::write(&env_path, &env_content).map_err(|e| format!("写入 .env 失败: {e}"))?; @@ -1329,11 +1410,7 @@ fn merge_hermes_config_yaml( } /// 合并 .env 文件:更新 managed_keys 对应的值,保留用户自定义的其他环境变量。 -fn merge_env_file( - existing: &str, - managed_keys: &[&str], - new_pairs: &[(String, String)], -) -> String { +fn merge_env_file(existing: &str, managed_keys: &[&str], new_pairs: &[(String, String)]) -> String { let mut result = Vec::new(); let _new_keys: std::collections::HashSet<&str> = new_pairs.iter().map(|(k, _)| k.as_str()).collect(); @@ -1389,7 +1466,10 @@ pub async fn hermes_read_config() -> Result { if trimmed.starts_with("model:") { in_model = true; // model: "xxx" 单行格式 - if let Some(v) = trimmed.strip_prefix("model:").map(|s| s.trim().trim_matches('"')) { + if let Some(v) = trimmed + .strip_prefix("model:") + .map(|s| s.trim().trim_matches('"')) + { if !v.is_empty() && !v.contains(':') { model_name = v.to_string(); } @@ -1398,12 +1478,28 @@ pub async fn hermes_read_config() -> Result { } if in_model { if trimmed.starts_with("default:") { - model_name = trimmed.strip_prefix("default:").unwrap().trim().trim_matches('"').to_string(); + model_name = trimmed + .strip_prefix("default:") + .unwrap() + .trim() + .trim_matches('"') + .to_string(); } else if trimmed.starts_with("base_url:") { - base_url = trimmed.strip_prefix("base_url:").unwrap().trim().trim_matches('"').to_string(); + base_url = trimmed + .strip_prefix("base_url:") + .unwrap() + .trim() + .trim_matches('"') + .to_string(); } else if trimmed.starts_with("provider:") { - provider = trimmed.strip_prefix("provider:").unwrap().trim().trim_matches('"').to_string(); - } else if !trimmed.is_empty() && !trimmed.starts_with('#') && !trimmed.starts_with('-') { + provider = trimmed + .strip_prefix("provider:") + .unwrap() + .trim() + .trim_matches('"') + .to_string(); + } else if !trimmed.is_empty() && !trimmed.starts_with('#') && !trimmed.starts_with('-') + { in_model = false; } } @@ -1417,15 +1513,27 @@ pub async fn hermes_read_config() -> Result { if trimmed.starts_with("OPENAI_API_KEY=") { api_key = trimmed.strip_prefix("OPENAI_API_KEY=").unwrap().to_string(); } else if trimmed.starts_with("ANTHROPIC_API_KEY=") && api_key.is_empty() { - api_key = trimmed.strip_prefix("ANTHROPIC_API_KEY=").unwrap().to_string(); + api_key = trimmed + .strip_prefix("ANTHROPIC_API_KEY=") + .unwrap() + .to_string(); } else if trimmed.starts_with("OPENROUTER_API_KEY=") && api_key.is_empty() { - api_key = trimmed.strip_prefix("OPENROUTER_API_KEY=").unwrap().to_string(); + api_key = trimmed + .strip_prefix("OPENROUTER_API_KEY=") + .unwrap() + .to_string(); } // base_url from .env if not in config if trimmed.starts_with("OPENAI_BASE_URL=") && base_url.is_empty() { - base_url = trimmed.strip_prefix("OPENAI_BASE_URL=").unwrap().to_string(); + base_url = trimmed + .strip_prefix("OPENAI_BASE_URL=") + .unwrap() + .to_string(); } else if trimmed.starts_with("ANTHROPIC_BASE_URL=") && base_url.is_empty() { - base_url = trimmed.strip_prefix("ANTHROPIC_BASE_URL=").unwrap().to_string(); + base_url = trimmed + .strip_prefix("ANTHROPIC_BASE_URL=") + .unwrap() + .to_string(); } } @@ -1464,7 +1572,13 @@ pub async fn hermes_fetch_models( let api = api_type.unwrap_or_else(|| "openai".into()); let mut base = base_url.trim_end_matches('/').to_string(); // 移除尾部的 chat/completions 等路径 - for suffix in &["/chat/completions", "/completions", "/responses", "/messages", "/models"] { + for suffix in &[ + "/chat/completions", + "/completions", + "/responses", + "/messages", + "/models", + ] { if base.ends_with(suffix) { base = base[..base.len() - suffix.len()].to_string(); } @@ -1472,48 +1586,69 @@ pub async fn hermes_fetch_models( let resp = match api.as_str() { "anthropic-messages" => { - if !base.ends_with("/v1") { base.push_str("/v1"); } + if !base.ends_with("/v1") { + base.push_str("/v1"); + } client .get(format!("{base}/models")) .header("anthropic-version", "2023-06-01") .header("x-api-key", &api_key) - .send().await + .send() + .await } "google-generative-ai" | "google-gemini" => { client .get(format!("{base}/models?key={api_key}")) - .send().await + .send() + .await } _ => { client .get(format!("{base}/models")) .header("Authorization", format!("Bearer {api_key}")) - .send().await + .send() + .await } - }.map_err(|e| format!("请求失败: {e}"))?; + } + .map_err(|e| format!("请求失败: {e}"))?; if !resp.status().is_success() { let status = resp.status().as_u16(); let body = resp.text().await.unwrap_or_default(); - let short = if body.len() > 200 { &body[..200] } else { &body }; + let short = if body.len() > 200 { + &body[..200] + } else { + &body + }; return Err(format!("HTTP {status}: {short}")); } - let data: Value = resp.json().await.map_err(|e| format!("JSON 解析失败: {e}"))?; + let data: Value = resp + .json() + .await + .map_err(|e| format!("JSON 解析失败: {e}"))?; let models: Vec = if api.contains("google") { data.get("models") .and_then(|v| v.as_array()) - .map(|arr| arr.iter().filter_map(|m| { - m.get("name").and_then(|n| n.as_str()).map(|s| s.replace("models/", "")) - }).collect()) + .map(|arr| { + arr.iter() + .filter_map(|m| { + m.get("name") + .and_then(|n| n.as_str()) + .map(|s| s.replace("models/", "")) + }) + .collect() + }) .unwrap_or_default() } else { data.get("data") .and_then(|v| v.as_array()) - .map(|arr| arr.iter().filter_map(|m| { - m.get("id").and_then(|n| n.as_str()).map(String::from) - }).collect()) + .map(|arr| { + arr.iter() + .filter_map(|m| m.get("id").and_then(|n| n.as_str()).map(String::from)) + .collect() + }) .unwrap_or_default() }; @@ -1530,7 +1665,8 @@ pub async fn hermes_fetch_models( pub async fn hermes_update_model(model: String) -> Result { let home = hermes_home(); let config_path = home.join("config.yaml"); - let config_raw = std::fs::read_to_string(&config_path).map_err(|e| format!("读取 config.yaml 失败: {e}"))?; + let config_raw = + std::fs::read_to_string(&config_path).map_err(|e| format!("读取 config.yaml 失败: {e}"))?; // Hermes 直接用模型名,不加 provider/ 前缀 let model_str = model.clone(); @@ -1565,7 +1701,10 @@ pub async fn hermes_update_model(model: String) -> Result { // --------------------------------------------------------------------------- #[tauri::command] -pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Result { +pub async fn hermes_gateway_action( + app: tauri::AppHandle, + action: String, +) -> Result { let enhanced = hermes_enhanced_path(); match action.as_str() { "start" => { @@ -1576,7 +1715,12 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res let addr: std::net::SocketAddr = format!("127.0.0.1:{port}").parse().unwrap(); // 1. 如果端口已经可达,说明 Gateway 已在运行 - if std::net::TcpStream::connect_timeout(&addr, std::time::Duration::from_millis(300)).is_ok() { + if std::net::TcpStream::connect_timeout( + &addr, + std::time::Duration::from_millis(300), + ) + .is_ok() + { // 即使已在运行也启动 Guardian 守护 start_guardian(&app); emit_gateway_status(true); @@ -1587,7 +1731,12 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res kill_gateway_pid(); // 如果仍有残留(非我们启动的),再 taskkill tokio::time::sleep(std::time::Duration::from_millis(300)).await; - if std::net::TcpStream::connect_timeout(&addr, std::time::Duration::from_millis(200)).is_ok() { + if std::net::TcpStream::connect_timeout( + &addr, + std::time::Duration::from_millis(200), + ) + .is_ok() + { // 端口仍被占用,有残留进程 let _ = std::process::Command::new("taskkill") .args(["/F", "/IM", "hermes.exe"]) @@ -1652,7 +1801,9 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res // 前 3 秒每次都检查,之后检查日志是否有错误 if i > 6 { if let Ok(log) = std::fs::read_to_string(&log_path) { - if log.contains("failed to connect") || log.contains("Port") && log.contains("already in use") { + if log.contains("failed to connect") + || log.contains("Port") && log.contains("already in use") + { break; // 进程已报错,不再等待 } } @@ -1665,12 +1816,22 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res Ok("Gateway 已启动".into()) } else { let log_tail = std::fs::read_to_string(&log_path).unwrap_or_default(); - let tail: String = log_tail.lines().rev().take(20) - .collect::>().into_iter().rev() - .collect::>().join("\n"); + let tail: String = log_tail + .lines() + .rev() + .take(20) + .collect::>() + .into_iter() + .rev() + .collect::>() + .join("\n"); Err(format!( "Gateway 启动失败。\n日志:\n{}", - if tail.is_empty() { "(日志为空)".to_string() } else { tail } + if tail.is_empty() { + "(日志为空)".to_string() + } else { + tail + } )) } } @@ -1710,11 +1871,17 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res GW_PID.store(child.id(), Ordering::SeqCst); // 等待端口可达(最多 15s) let port = hermes_gateway_port(); - let addr: std::net::SocketAddr = format!("127.0.0.1:{port}").parse().unwrap(); + let addr: std::net::SocketAddr = + format!("127.0.0.1:{port}").parse().unwrap(); let mut ok = false; for _ in 0..30 { tokio::time::sleep(std::time::Duration::from_millis(500)).await; - if std::net::TcpStream::connect_timeout(&addr, std::time::Duration::from_millis(500)).is_ok() { + if std::net::TcpStream::connect_timeout( + &addr, + std::time::Duration::from_millis(500), + ) + .is_ok() + { ok = true; break; } @@ -1731,7 +1898,10 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res // fallback: hermes gateway start let mut fallback = tokio::process::Command::new("hermes"); fallback.args(["gateway", "start"]).env("PATH", &enhanced); - let out = fallback.output().await.map_err(|e2| format!("启动失败: {e} / fallback: {e2}"))?; + let out = fallback + .output() + .await + .map_err(|e2| format!("启动失败: {e} / fallback: {e2}"))?; if out.status.success() { start_guardian(&app); emit_gateway_status(true); @@ -1739,7 +1909,10 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res } else { let stderr = String::from_utf8_lossy(&out.stderr).trim().to_string(); Err(if stderr.is_empty() { - format!("Gateway 启动失败 (exit {})", out.status.code().unwrap_or(-1)) + format!( + "Gateway 启动失败 (exit {})", + out.status.code().unwrap_or(-1) + ) } else { stderr }) @@ -1768,7 +1941,12 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res let port = hermes_gateway_port(); let addr: std::net::SocketAddr = format!("127.0.0.1:{port}").parse().unwrap(); tokio::time::sleep(std::time::Duration::from_millis(300)).await; - if std::net::TcpStream::connect_timeout(&addr, std::time::Duration::from_millis(300)).is_ok() { + if std::net::TcpStream::connect_timeout( + &addr, + std::time::Duration::from_millis(300), + ) + .is_ok() + { let _ = std::process::Command::new("taskkill") .args(["/F", "/IM", "hermes.exe"]) .creation_flags(CREATE_NO_WINDOW) @@ -1783,7 +1961,11 @@ pub async fn hermes_gateway_action(app: tauri::AppHandle, action: String) -> Res Ok(_) if killed => Ok("Gateway 已停止".into()), Ok(out) => { let stderr = String::from_utf8_lossy(&out.stderr).trim().to_string(); - if stderr.is_empty() { Ok("Gateway 已停止".into()) } else { Err(stderr) } + if stderr.is_empty() { + Ok("Gateway 已停止".into()) + } else { + Err(stderr) + } } Err(_) if killed => Ok("Gateway 已停止".into()), Err(e) => Err(format!("停止失败: {e}")), @@ -1897,7 +2079,12 @@ pub async fn hermes_detect_environments() -> Result { // 3. 检测 WSL 里是否安装了 hermes let hermes_check = std::process::Command::new("wsl") - .args(["-e", "bash", "-lc", "command -v hermes && hermes --version 2>/dev/null || echo NOT_FOUND"]) + .args([ + "-e", + "bash", + "-lc", + "command -v hermes && hermes --version 2>/dev/null || echo NOT_FOUND", + ]) .creation_flags(CREATE_NO_WINDOW) .output(); if let Ok(h_out) = hermes_check { @@ -1921,7 +2108,8 @@ pub async fn hermes_detect_environments() -> Result { .is_ok(); result["wsl2"]["gatewayRunning"] = serde_json::json!(reachable); if reachable { - result["wsl2"]["gatewayUrl"] = serde_json::json!(format!("http://{ip}:{port}")); + result["wsl2"]["gatewayUrl"] = + serde_json::json!(format!("http://{ip}:{port}")); } } } @@ -1949,7 +2137,13 @@ pub async fn hermes_detect_environments() -> Result { // 查找运行中的 hermes 相关容器 let ps_cmd = { let mut cmd = std::process::Command::new("docker"); - cmd.args(["ps", "--format", "{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}", "--filter", "status=running"]); + cmd.args([ + "ps", + "--format", + "{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}", + "--filter", + "status=running", + ]); #[cfg(target_os = "windows")] cmd.creation_flags(CREATE_NO_WINDOW); cmd.output() @@ -1996,8 +2190,8 @@ pub async fn hermes_set_gateway_url(url: Option) -> Result(&content).unwrap_or_else(|_| serde_json::json!({})) } else { serde_json::json!({}) @@ -2020,13 +2214,11 @@ pub async fn hermes_set_gateway_url(url: Option) -> Result Result { #[cfg(target_os = "windows")] cmd.creation_flags(CREATE_NO_WINDOW); - let output = cmd - .output() - .await - .map_err(|e| format!("升级失败: {e}"))?; + let output = cmd.output().await.map_err(|e| format!("升级失败: {e}"))?; let stdout = String::from_utf8_lossy(&output.stdout); let stderr = String::from_utf8_lossy(&output.stderr); @@ -2101,10 +2290,7 @@ pub async fn uninstall_hermes(clean_config: bool) -> Result { #[cfg(target_os = "windows")] cmd.creation_flags(CREATE_NO_WINDOW); - let output = cmd - .output() - .await - .map_err(|e| format!("卸载失败: {e}"))?; + let output = cmd.output().await.map_err(|e| format!("卸载失败: {e}"))?; if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); @@ -2112,9 +2298,7 @@ pub async fn uninstall_hermes(clean_config: bool) -> Result { } // 清理 venv(如果存在) - let venv_dir = dirs::home_dir() - .unwrap_or_default() - .join(".hermes-venv"); + let venv_dir = dirs::home_dir().unwrap_or_default().join(".hermes-venv"); if venv_dir.exists() { let _ = std::fs::remove_dir_all(&venv_dir); } @@ -2214,23 +2398,25 @@ pub async fn hermes_api_proxy( } } - let resp = req.send().await.map_err(|e| format!("Gateway 请求失败: {e}"))?; + let resp = req + .send() + .await + .map_err(|e| format!("Gateway 请求失败: {e}"))?; let status = resp.status().as_u16(); let text = resp.text().await.unwrap_or_default(); // 尝试解析为 JSON,否则包装为字符串 - let json_val: Value = serde_json::from_str(&text).unwrap_or_else(|_| { - serde_json::json!({ "raw": text }) - }); + let json_val: Value = + serde_json::from_str(&text).unwrap_or_else(|_| serde_json::json!({ "raw": text })); if status >= 400 { // 提取错误信息:支持 {"error": "msg"} 和 {"error": {"message": "msg"}} 两种格式 let err_msg = json_val .get("error") .and_then(|v| { - v.as_str().map(String::from).or_else(|| { - v.get("message").and_then(|m| m.as_str()).map(String::from) - }) + v.as_str() + .map(String::from) + .or_else(|| v.get("message").and_then(|m| m.as_str()).map(String::from)) }) .unwrap_or_else(|| text.clone()); return Err(err_msg); @@ -2294,24 +2480,34 @@ pub async fn hermes_agent_run( req = req.header("Authorization", format!("Bearer {api_key}")); } - let resp = req.send().await.map_err(|e| format!("启动 run 失败: {e}"))?; + let resp = req + .send() + .await + .map_err(|e| format!("启动 run 失败: {e}"))?; if !resp.status().is_success() { let status = resp.status().as_u16(); let text = resp.text().await.unwrap_or_default(); return Err(format!("HTTP {status}: {text}")); } - let body: Value = resp.json().await.map_err(|e| format!("解析响应失败: {e}"))?; + let body: Value = resp + .json() + .await + .map_err(|e| format!("解析响应失败: {e}"))?; let run_id = body["run_id"] .as_str() .ok_or("响应中没有 run_id")? .to_string(); - let _ = app.emit("hermes-run-started", serde_json::json!({ "run_id": &run_id })); + let _ = app.emit( + "hermes-run-started", + serde_json::json!({ "run_id": &run_id }), + ); // 2. GET /v1/runs/{run_id}/events — SSE 事件流 let events_url = format!("{gw_url}/v1/runs/{run_id}/events"); - let sse_client = super::build_http_client(std::time::Duration::from_secs(300), Some("ClawPanel")) - .map_err(|e| format!("SSE 客户端创建失败: {e}"))?; + let sse_client = + super::build_http_client(std::time::Duration::from_secs(300), Some("ClawPanel")) + .map_err(|e| format!("SSE 客户端创建失败: {e}"))?; let mut sse_req = sse_client.get(&events_url); if !api_key.is_empty() { @@ -2349,10 +2545,13 @@ pub async fn hermes_agent_run( } let data = trimmed[6..].trim(); if data == "[DONE]" { - let _ = app.emit("hermes-run-done", serde_json::json!({ - "run_id": &run_id, - "output": &final_output, - })); + let _ = app.emit( + "hermes-run-done", + serde_json::json!({ + "run_id": &run_id, + "output": &final_output, + }), + ); return Ok(run_id); } @@ -2362,10 +2561,13 @@ pub async fn hermes_agent_run( "message.delta" => { if let Some(delta) = evt["delta"].as_str() { final_output.push_str(delta); - let _ = app.emit("hermes-run-delta", serde_json::json!({ - "run_id": &run_id, - "delta": delta, - })); + let _ = app.emit( + "hermes-run-delta", + serde_json::json!({ + "run_id": &run_id, + "delta": delta, + }), + ); } } "tool.started" | "tool.completed" | "tool.progress" | "tool.error" => { @@ -2378,18 +2580,24 @@ pub async fn hermes_agent_run( if let Some(output) = evt["output"].as_str() { final_output = output.to_string(); } - let _ = app.emit("hermes-run-done", serde_json::json!({ - "run_id": &run_id, - "output": &final_output, - })); + let _ = app.emit( + "hermes-run-done", + serde_json::json!({ + "run_id": &run_id, + "output": &final_output, + }), + ); return Ok(run_id); } "run.failed" => { let err = evt["error"].as_str().unwrap_or("unknown error"); - let _ = app.emit("hermes-run-error", serde_json::json!({ - "run_id": &run_id, - "error": err, - })); + let _ = app.emit( + "hermes-run-error", + serde_json::json!({ + "run_id": &run_id, + "error": err, + }), + ); return Err(format!("Agent run failed: {err}")); } _ => { @@ -2401,10 +2609,13 @@ pub async fn hermes_agent_run( } } - let _ = app.emit("hermes-run-done", serde_json::json!({ - "run_id": &run_id, - "output": &final_output, - })); + let _ = app.emit( + "hermes-run-done", + serde_json::json!({ + "run_id": &run_id, + "output": &final_output, + }), + ); Ok(run_id) } @@ -2538,13 +2749,11 @@ pub async fn hermes_logs_list() -> Result { .modified() .ok() .and_then(|t| { - t.duration_since(std::time::UNIX_EPOCH) - .ok() - .map(|d| { - let secs = d.as_secs() as i64; - // Simple ISO-ish format - chrono_simple(secs) - }) + t.duration_since(std::time::UNIX_EPOCH).ok().map(|d| { + let secs = d.as_secs() as i64; + // Simple ISO-ish format + chrono_simple(secs) + }) }) .unwrap_or_default(); (sz, mt) @@ -2657,7 +2866,11 @@ fn parse_log_line(line: &str) -> ParsedLogLine { { let ts = format!("{maybe_date} {maybe_time}"); let lvl = parts[2].to_string(); - let msg = if parts.len() > 3 { parts[3].to_string() } else { String::new() }; + let msg = if parts.len() > 3 { + parts[3].to_string() + } else { + String::new() + }; return ParsedLogLine { timestamp: Some(ts), level: Some(lvl), @@ -2783,7 +2996,11 @@ pub async fn hermes_skill_detail(file_path: String) -> Result { #[tauri::command] pub async fn hermes_memory_read(r#type: Option) -> Result { let kind = r#type.as_deref().unwrap_or("memory"); - let file_name = if kind == "user" { "USER.md" } else { "MEMORY.md" }; + let file_name = if kind == "user" { + "USER.md" + } else { + "MEMORY.md" + }; let file_path = hermes_home().join("memories").join(file_name); if !file_path.exists() { return Ok(String::new()); @@ -2792,11 +3009,18 @@ pub async fn hermes_memory_read(r#type: Option) -> Result, content: String) -> Result { +pub async fn hermes_memory_write( + r#type: Option, + content: String, +) -> Result { let kind = r#type.as_deref().unwrap_or("memory"); let mem_dir = hermes_home().join("memories"); std::fs::create_dir_all(&mem_dir).map_err(|e| format!("Failed to create dir: {e}"))?; - let file_name = if kind == "user" { "USER.md" } else { "MEMORY.md" }; + let file_name = if kind == "user" { + "USER.md" + } else { + "MEMORY.md" + }; let file_path = mem_dir.join(file_name); std::fs::write(&file_path, &content).map_err(|e| format!("Failed to write memory: {e}"))?; Ok("ok".into()) diff --git a/src-tauri/src/commands/messaging.rs b/src-tauri/src/commands/messaging.rs index c937559..fc0e815 100644 --- a/src-tauri/src/commands/messaging.rs +++ b/src-tauri/src/commands/messaging.rs @@ -693,7 +693,8 @@ pub async fn save_messaging_platform( merge_channel_entry(channels_map, "discord", entry); // 仅在首次创建时设置默认值,不覆盖用户已有的设置 if let Some(Value::Object(d)) = channels_map.get_mut("discord") { - d.entry("groupPolicy").or_insert(Value::String("allowlist".into())); + d.entry("groupPolicy") + .or_insert(Value::String("allowlist".into())); d.entry("dm").or_insert(json!({ "enabled": false })); d.entry("retry").or_insert(json!({ "attempts": 3, diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index bb55c79..26e7920 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -45,7 +45,10 @@ fn default_openclaw_dir() -> PathBuf { } // dirs::home_dir() 作为补充(Windows API SHGetKnownFolderPath) if let Some(dh) = dirs::home_dir() { - if !candidates.iter().any(|c| panel_path_key(c) == panel_path_key(&dh)) { + if !candidates + .iter() + .any(|c| panel_path_key(c) == panel_path_key(&dh)) + { candidates.push(dh); } } @@ -54,7 +57,9 @@ fn default_openclaw_dir() -> PathBuf { let combined = format!("{}{}", hd.trim(), hp.trim()); let p = PathBuf::from(&combined); if !combined.is_empty() - && !candidates.iter().any(|c| panel_path_key(c) == panel_path_key(&p)) + && !candidates + .iter() + .any(|c| panel_path_key(c) == panel_path_key(&p)) { candidates.push(p); } diff --git a/src-tauri/src/commands/update.rs b/src-tauri/src/commands/update.rs index 6f8ecdb..0835a84 100644 --- a/src-tauri/src/commands/update.rs +++ b/src-tauri/src/commands/update.rs @@ -69,7 +69,11 @@ pub async fn check_frontend_update() -> Result { /// 下载并解压前端更新包 #[tauri::command] -pub async fn download_frontend_update(url: String, expected_hash: String, version: String) -> Result { +pub async fn download_frontend_update( + url: String, + expected_hash: String, + version: String, +) -> Result { let client = super::build_http_client(std::time::Duration::from_secs(120), Some("ClawPanel")) .map_err(|e| format!("HTTP 客户端错误: {e}"))?;