diff --git a/Cargo.lock b/Cargo.lock index 4d3c3a4e..6bf3a360 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -76,7 +76,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.13.0", + "bitflags 2.13.1", "cc", "jni", "libc", @@ -85,7 +85,7 @@ dependencies = [ "ndk-context", "ndk-sys", "num_enum", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -96,18 +96,18 @@ checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "approx" @@ -156,7 +156,7 @@ dependencies = [ "proc-macro2", "pulldown-cmark", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -165,7 +165,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5790583a9ebcc63c55f142a85d85fe63ec0e033c941fcf00a3605f81dada2e32" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -206,7 +206,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.4", + "rand 0.9.5", "raw-window-handle", "serde", "serde_repr", @@ -223,7 +223,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -329,7 +329,7 @@ version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "event-listener-strategy", "pin-project-lite", ] @@ -358,7 +358,7 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", + "event-listener 5.4.2", "futures-lite", "rustix 1.1.4", ] @@ -371,7 +371,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -440,13 +440,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -472,9 +472,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" dependencies = [ "aws-lc-sys", "zeroize", @@ -482,9 +482,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.42.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" dependencies = [ "cc", "cmake", @@ -493,6 +493,58 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "axum" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http 1.5.0", + "http-body 1.1.0", + "http-body-util", + "hyper 1.11.0", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http 1.5.0", + "http-body 1.1.0", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "base64" version = "0.21.7" @@ -505,6 +557,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "base64ct" version = "1.8.3" @@ -549,9 +607,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] @@ -616,9 +674,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cee35f73844aa3014bb606320a6c1f010249dbdf43342fe54b5a4f6a8ed4b79" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" dependencies = [ "memchr", "serde_core", @@ -638,22 +696,22 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -680,7 +738,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "log", "polling", "rustix 0.38.44", @@ -694,7 +752,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "polling", "rustix 1.1.4", "slab", @@ -736,9 +794,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.66" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -754,9 +812,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "cgl" @@ -778,6 +836,18 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + [[package]] name = "clipboard-win" version = "5.4.1" @@ -883,9 +953,9 @@ dependencies = [ [[package]] name = "cookie" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" dependencies = [ "percent-encoding", "time", @@ -966,7 +1036,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation 0.10.1", "libc", ] @@ -1056,7 +1126,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "crossterm_winapi", "derive_more", "document-features", @@ -1121,7 +1191,7 @@ version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e23dadbc8945746c361e3967336075be7281a5455c06f5c5a17fddca4e7d2175" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -1130,8 +1200,18 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88490bf1b990d87eaaa7ac8aa887f629a08e7359765b4911faf63c3763347d23" +dependencies = [ + "darling_core 0.24.0", + "darling_macro 0.24.0", ] [[package]] @@ -1144,7 +1224,20 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.118", + "syn 2.0.119", +] + +[[package]] +name = "darling_core" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084e274f91c482280130e1e34e0b8d6e66776a060d7b6de7b84289ca778868c4" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.3", ] [[package]] @@ -1153,9 +1246,20 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core", + "darling_core 0.23.0", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f5792fa0d41cd2325ce0ffa64f0a340eaebd4971a3a0c5e1ffd2cc488a355e" +dependencies = [ + "darling_core 0.24.0", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -1199,7 +1303,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1266,7 +1370,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -1274,13 +1378,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -1331,6 +1435,12 @@ dependencies = [ "wio", ] +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "ecolor" version = "0.33.3" @@ -1390,7 +1500,7 @@ checksum = "6a9b567d356674e9a5121ed3fedfb0a7c31e059fe71f6972b691bcd0bfc284e3" dependencies = [ "accesskit", "ahash", - "bitflags 2.13.0", + "bitflags 2.13.1", "emath", "epaint", "log", @@ -1424,7 +1534,7 @@ dependencies = [ "epaint", "log", "profiling", - "thiserror 2.0.18", + "thiserror 2.0.20", "type-map", "web-time", "wgpu", @@ -1486,9 +1596,9 @@ dependencies = [ [[package]] name = "either" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "emath" @@ -1509,7 +1619,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml 1.1.2+spec-1.1.0", + "toml 1.1.4+spec-1.1.0", "vswhom", "winreg 0.55.0", ] @@ -1561,7 +1671,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1582,7 +1692,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1593,7 +1703,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1660,9 +1770,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.3.2" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" [[package]] name = "euclid" @@ -1681,11 +1791,10 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "concurrent-queue", "parking", "pin-project-lite", ] @@ -1696,7 +1805,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "pin-project-lite", ] @@ -1720,17 +1829,11 @@ dependencies = [ "regex", ] -[[package]] -name = "fast-srgb8" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" - [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "fax" @@ -1779,9 +1882,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "finl_unicode" @@ -1847,7 +1950,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c7e611d49285d4c4b2e1727b72cf05353558885cc5252f93707b845dfcaf3d3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "byteorder", "core-foundation 0.9.4", "core-graphics", @@ -1887,13 +1990,13 @@ dependencies = [ [[package]] name = "foreign-types-macros" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -1951,12 +2054,13 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -1965,9 +2069,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -1975,15 +2079,26 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-lite" @@ -2000,32 +2115,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -2125,9 +2240,9 @@ dependencies = [ [[package]] name = "globset" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" dependencies = [ "aho-corasick", "bstr", @@ -2167,7 +2282,7 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg_aliases", "cgl", "dispatch2", @@ -2239,7 +2354,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "gpu-alloc-types", ] @@ -2249,7 +2364,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -2270,7 +2385,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2281,7 +2396,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -2314,7 +2429,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.4.2", + "http 1.5.0", "indexmap", "slab", "tokio", @@ -2411,9 +2526,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -2432,24 +2547,24 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.2", + "http 1.5.0", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", - "http 1.4.2", - "http-body 1.0.1", + "http 1.5.0", + "http-body 1.1.0", "pin-project-lite", ] @@ -2491,18 +2606,19 @@ dependencies = [ [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", "h2 0.4.15", - "http 1.4.2", - "http-body 1.0.1", + "http 1.5.0", + "http-body 1.1.0", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -2530,10 +2646,10 @@ version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.2", - "hyper 1.10.1", + "http 1.5.0", + "hyper 1.11.0", "hyper-util", - "rustls 0.23.41", + "rustls 0.23.43", "tokio", "tokio-rustls 0.26.4", "tower-service", @@ -2547,7 +2663,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.10.1", + "hyper 1.11.0", "hyper-util", "native-tls", "tokio", @@ -2565,19 +2681,43 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.2", - "http-body 1.0.1", - "hyper 1.10.1", + "http 1.5.0", + "http-body 1.1.0", + "hyper 1.11.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.4", + "socket2 0.6.5", "tokio", "tower-service", "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "iced-x86" version = "1.21.0" @@ -2589,9 +2729,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", @@ -2603,9 +2743,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -2616,9 +2756,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -2630,16 +2770,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -2650,15 +2791,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428" dependencies = [ "displaydoc", "icu_locale_core", @@ -2739,11 +2880,11 @@ dependencies = [ [[package]] name = "inotify" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8" +checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "inotify-sys", "libc", ] @@ -2771,22 +2912,22 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb2d60ef19920a3a9193c3e371f726ec1dafc045dac788d0fb3704272458971" +checksum = "2bf84e73fa6f27f299dec58e13223cf70db80da872eb921d4f6138342a0eabc8" dependencies = [ - "darling", + "darling 0.24.0", "indoc", "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "ipnet" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" [[package]] name = "is-docker" @@ -2849,7 +2990,7 @@ dependencies = [ "jni-sys 0.4.1", "log", "simd_cesu8", - "thiserror 2.0.18", + "thiserror 2.0.20", "walkdir", "windows-link", ] @@ -2864,7 +3005,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2892,7 +3033,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2907,9 +3048,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", @@ -2924,7 +3065,7 @@ checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ "hashbrown 0.16.1", "portable-atomic", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -2961,9 +3102,9 @@ checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" [[package]] name = "kqueue" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" +checksum = "8d763e5b24120b4ddf50de6c92308156765aabfbbccebf401da7cff2d70a41ea" dependencies = [ "kqueue-sys", "libc", @@ -2975,7 +3116,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "libc", ] @@ -3011,9 +3152,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libloading" @@ -3042,23 +3183,23 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "libc", "plain", - "redox_syscall 0.9.0", + "redox_syscall 0.9.2", ] [[package]] name = "line-clipping" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" +checksum = "e752191d037c44ad111a8caa762921926658402f01cc1253f7bef2020ece4f5e" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -3075,9 +3216,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "litrs" @@ -3105,9 +3246,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6" +checksum = "5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a" dependencies = [ "hashbrown 0.17.1", ] @@ -3146,6 +3287,12 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.8.3" @@ -3182,7 +3329,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block", "core-graphics-types 0.2.0", "foreign-types 0.5.0", @@ -3246,9 +3393,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -3272,7 +3419,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbeff6bd154a309b2ada5639b2661ca6ae4599b34e8487dc276d2cd637da2d76" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "itoa", ] @@ -3290,7 +3437,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set 0.8.0", - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -3304,7 +3451,7 @@ dependencies = [ "once_cell", "rustc-hash 1.1.0", "spirv", - "thiserror 2.0.18", + "thiserror 2.0.20", "unicode-ident", ] @@ -3331,7 +3478,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "jni-sys 0.3.1", "log", "ndk-sys", @@ -3361,7 +3508,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "libc", @@ -3390,7 +3537,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "fsevent-sys", "inotify", "kqueue", @@ -3421,7 +3568,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -3447,7 +3594,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3479,7 +3626,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3531,7 +3678,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -3547,7 +3694,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -3561,7 +3708,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -3585,7 +3732,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3597,7 +3744,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "dispatch2", "objc2 0.6.4", ] @@ -3608,7 +3755,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "dispatch2", "objc2 0.6.4", "objc2-core-foundation", @@ -3651,7 +3798,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "dispatch", "libc", @@ -3664,7 +3811,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "objc2 0.6.4", "objc2-core-foundation", ] @@ -3675,7 +3822,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "objc2 0.6.4", "objc2-core-foundation", ] @@ -3698,7 +3845,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3710,7 +3857,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3733,7 +3880,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-cloud-kit", @@ -3765,7 +3912,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -3778,18 +3925,23 @@ version = "3.8.0" dependencies = [ "anyhow", "argp", + "axum", "crossterm", "enable-ansi-support", + "futures-util", "memmap2", "mimalloc", "objdiff-core", "prost", "ratatui", "rayon", + "rmcp", + "schemars", "serde", "serde_json", "supports-color", "time", + "tokio", "tracing", "tracing-subscriber", "typed-path", @@ -3839,8 +3991,8 @@ dependencies = [ "serde", "serde_json", "shell-escape", - "similar 3.1.1", - "syn 2.0.118", + "similar 3.1.2", + "syn 2.0.119", "tempfile", "time", "typed-arena", @@ -3919,9 +4071,9 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "open" -version = "5.3.6" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d3b65c44123a56e0133d2cd06ce4361bd3ca99d41198b2f25e3c3db9b8b4a" +checksum = "f9cfef937e9c486488c7e3d949ae31c0f1d06bdacd75b99c086cb35356e30408" dependencies = [ "is-wsl", "libc", @@ -3933,7 +4085,7 @@ version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3949,7 +4101,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4025,26 +4177,35 @@ dependencies = [ [[package]] name = "palette" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" +checksum = "ddeed8580d347d2abf3dcf06a5f0b3dc020258338526b277847cd4248a70fc64" dependencies = [ "approx", - "fast-srgb8", "libm", "palette_derive", + "palette_math", ] [[package]] name = "palette_derive" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" +checksum = "88537020289b719d81be994ccf1bbf4990f477e2f69ee52fe3e45f43a02e56be" dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", +] + +[[package]] +name = "palette_math" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e6eb142958d64335fb0e345c5b9ead2ecd6fc438c307e9d7d3c4fd428dbaf12" +dependencies = [ + "libm", ] [[package]] @@ -4082,6 +4243,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + [[package]] name = "pathfinder_geometry" version = "0.5.1" @@ -4140,9 +4307,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.7" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47627dd7305c6a2d6c8c6bcd24c5a4c17dbbf425f4f9c5313e724b38fc9782e9" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" dependencies = [ "memchr", "ucd-trie", @@ -4150,9 +4317,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.7" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4254325ecad416ab689e27ba51da03ba01a9632bc6e108f5fe7c3c4ad29d58" +checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" dependencies = [ "pest", "pest_generator", @@ -4160,22 +4327,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.7" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4c0e91ead7a8f7acecbca6f003fc2e8282b1dbe2dd9c9d2f16aba42995e0a7" +checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "pest_meta" -version = "2.8.7" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9744bc48116fee06334924bb5f2bad41eed5e89bd26e29b0b799f9a3f82c210" +checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" dependencies = [ "pest", ] @@ -4218,7 +4385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand 0.8.6", + "rand 0.8.7", ] [[package]] @@ -4231,7 +4398,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "unicase", ] @@ -4262,7 +4429,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4290,9 +4457,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "plain" @@ -4306,7 +4473,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "crc32fast", "fdeflate", "flate2", @@ -4335,9 +4502,9 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" @@ -4350,9 +4517,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -4391,7 +4558,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4400,14 +4567,14 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.12+spec-1.1.0", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -4443,7 +4610,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.118", + "syn 2.0.119", "tempfile", ] @@ -4457,7 +4624,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4475,7 +4642,7 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "getopts", "memchr", "unicase", @@ -4495,9 +4662,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.39.4" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", ] @@ -4514,9 +4681,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.3", - "rustls 0.23.41", - "socket2 0.6.4", - "thiserror 2.0.18", + "rustls 0.23.43", + "socket2 0.6.5", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -4536,10 +4703,10 @@ dependencies = [ "rand_pcg", "ring", "rustc-hash 2.1.3", - "rustls 0.23.41", + "rustls 0.23.43", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -4554,16 +4721,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.4", + "socket2 0.6.5", "tracing", "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -4587,7 +4754,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f79a2bb675522959249aa5074d7ac6a2aa502d6b1b3c8570f36567eaf36bd6a" dependencies = [ "address_space", - "bitflags 2.13.0", + "bitflags 2.13.1", "ordered-float 5.3.0", ] @@ -4599,18 +4766,18 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -4695,7 +4862,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "compact_str", "critical-section", "hashbrown 0.17.1", @@ -4705,7 +4872,7 @@ dependencies = [ "palette", "serde", "strum", - "thiserror 2.0.18", + "thiserror 2.0.20", "unicode-segmentation", "unicode-truncate", "unicode-width", @@ -4760,7 +4927,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "hashbrown 0.17.1", "indoc", "instability", @@ -4824,16 +4991,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] name = "redox_syscall" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" +checksum = "f1c93da5bb2c5d4e6c0ef7abeead62c89169a0a4882bfb83ac892f2423aea2fe" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -4855,14 +5022,34 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.20", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", ] [[package]] name = "regex" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -4872,9 +5059,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.15" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -4948,10 +5135,10 @@ dependencies = [ "futures-core", "futures-util", "h2 0.4.15", - "http 1.4.2", - "http-body 1.0.1", + "http 1.5.0", + "http-body 1.1.0", "http-body-util", - "hyper 1.10.1", + "hyper 1.11.0", "hyper-rustls 0.27.9", "hyper-tls", "hyper-util", @@ -4962,7 +5149,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.41", + "rustls 0.23.43", "rustls-pki-types", "rustls-platform-verifier", "serde", @@ -5027,6 +5214,50 @@ dependencies = [ "anyhow", ] +[[package]] +name = "rmcp" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14db48ee17a9ba61810ab1a9c1beb7d06d8136ae39ac25a1137f10d357af01af" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "futures", + "http 1.5.0", + "http-body 1.1.0", + "http-body-util", + "pastey", + "pin-project-lite", + "rand 0.10.2", + "rmcp-macros", + "schemars", + "serde", + "serde_json", + "sse-stream", + "thiserror 2.0.20", + "tokio", + "tokio-stream", + "tokio-util", + "tower-service", + "tracing", + "uuid", +] + +[[package]] +name = "rmcp-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "783d787bf21813b285f13019adc49e11af501c658890c1e519f31f937c68b7e3" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.119", +] + [[package]] name = "ron" version = "0.11.0" @@ -5034,7 +5265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ "base64 0.22.1", - "bitflags 2.13.0", + "bitflags 2.13.1", "serde", "serde_derive", "unicode-ident", @@ -5046,7 +5277,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "once_cell", "serde", "serde_derive", @@ -5081,7 +5312,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "errno 0.3.14", "libc", "linux-raw-sys 0.4.15", @@ -5094,7 +5325,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "errno 0.3.14", "libc", "linux-raw-sys 0.12.1", @@ -5115,16 +5346,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.41" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.13", + "rustls-webpki 0.103.14", "subtle", "zeroize", ] @@ -5152,9 +5383,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -5171,10 +5402,10 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.41", + "rustls 0.23.43", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.103.13", + "rustls-webpki 0.103.14", "security-framework", "security-framework-sys", "webpki-root-certs", @@ -5199,9 +5430,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "0527518605e68109d875e248ea259b6758801cf165e4b2c2733ae3b51f12535a" dependencies = [ "aws-lc-rs", "ring", @@ -5239,6 +5470,32 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "chrono", + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.3", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -5280,7 +5537,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -5310,11 +5567,11 @@ dependencies = [ [[package]] name = "self_update" -version = "1.0.0-rc.3" +version = "1.0.0-rc.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e408432f7c77ea6481c44379268b8beada0139c88c5024dc6d97b756cc96e65" +checksum = "5b7cc0b87814417b0e0697ae582dfc5f614f469fbac9b138e40457d88913187d" dependencies = [ - "http 1.4.2", + "http 1.5.0", "log", "regex", "reqwest 0.13.4", @@ -5335,9 +5592,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -5345,29 +5602,40 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -5377,14 +5645,25 @@ dependencies = [ ] [[package]] -name = "serde_repr" +name = "serde_path_to_error" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -5482,15 +5761,15 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "simd_cesu8" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" dependencies = [ "rustc_version", "simdutf8", @@ -5510,9 +5789,9 @@ checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "similar" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16" +checksum = "85ee016af5d736b69fc89e19254540fa4b5f5492853fb5503920f084011c78b6" dependencies = [ "bstr", "hashbrown 0.15.5", @@ -5551,7 +5830,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "calloop 0.13.0", "calloop-wayland-source 0.3.0", "cursor-icon", @@ -5576,7 +5855,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "calloop 0.14.4", "calloop-wayland-source 0.4.1", "cursor-icon", @@ -5584,7 +5863,7 @@ dependencies = [ "log", "memmap2", "rustix 1.1.4", - "thiserror 2.0.18", + "thiserror 2.0.20", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -5629,9 +5908,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -5650,9 +5929,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "spirv" @@ -5660,7 +5939,20 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", +] + +[[package]] +name = "sse-stream" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c123f296ade4ec4b8b0f6162116e6629f5146922ca5ab40ca9d3c2e73ab4761e" +dependencies = [ + "bytes", + "futures-util", + "http-body 1.1.0", + "http-body-util", + "pin-project-lite", ] [[package]] @@ -5705,7 +5997,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5736,9 +6028,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -5768,7 +6071,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5815,7 +6118,7 @@ checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" dependencies = [ "dunce", "embed-resource", - "toml 1.1.2+spec-1.1.0", + "toml 1.1.4+spec-1.1.0", ] [[package]] @@ -5846,7 +6149,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9048a889effe34a5cddee0af7f53285198b16dca3be510858d38dfdb3e62a04e" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "parking_lot", "rustix 1.1.4", "signal-hook", @@ -5882,7 +6185,7 @@ checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" dependencies = [ "anyhow", "base64 0.22.1", - "bitflags 2.13.0", + "bitflags 2.13.1", "fancy-regex", "filedescriptor", "finl_unicode", @@ -5927,11 +6230,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -5942,25 +6245,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -5981,9 +6284,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.53" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", "libc", @@ -6003,9 +6306,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -6038,9 +6341,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -6048,9 +6351,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -6063,18 +6366,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", "mio", "pin-project-lite", - "socket2 0.6.4", + "signal-hook-registry", + "socket2 0.6.5", + "tokio-macros", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + [[package]] name = "tokio-native-tls" version = "0.3.1" @@ -6101,15 +6417,15 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.41", + "rustls 0.23.43", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -6118,14 +6434,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -6145,9 +6462,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ "indexmap", "serde_core", @@ -6155,7 +6472,7 @@ dependencies = [ "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] @@ -6191,30 +6508,30 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.12+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tower" @@ -6229,6 +6546,7 @@ dependencies = [ "tokio", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -6237,11 +6555,11 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "bytes", "futures-util", - "http 1.4.2", - "http-body 1.0.1", + "http 1.5.0", + "http-body 1.1.0", "pin-project-lite", "tower", "tower-layer", @@ -6281,7 +6599,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6440,11 +6758,11 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d" dependencies = [ - "base64 0.22.1", + "base64 0.23.1", "cookie_store", "der", "encoding_rs", @@ -6452,7 +6770,7 @@ dependencies = [ "log", "native-tls", "percent-encoding", - "rustls 0.23.41", + "rustls 0.23.43", "rustls-pki-types", "serde", "serde_json", @@ -6460,17 +6778,17 @@ dependencies = [ "ureq-proto", "utf8-zero", "webpki-root-certs", - "webpki-roots 1.0.8", + "webpki-roots 1.0.9", ] [[package]] name = "ureq-proto" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613" dependencies = [ - "base64 0.22.1", - "http 1.4.2", + "base64 0.23.1", + "http 1.5.0", "httparse", "log", ] @@ -6514,9 +6832,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.4" +version = "1.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" dependencies = [ "atomic", "getrandom 0.4.3", @@ -6533,9 +6851,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" +checksum = "068e763e8279de7ab94b6afebded2cb701678af094feb1c12ccb061b4783c1be" [[package]] name = "vcpkg" @@ -6614,9 +6932,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -6627,9 +6945,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.76" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ "js-sys", "wasm-bindgen", @@ -6637,9 +6955,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6647,22 +6965,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] @@ -6708,7 +7026,7 @@ version = "0.241.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -6716,9 +7034,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" +checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" dependencies = [ "cc", "downcast-rs", @@ -6730,11 +7048,11 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.14" +version = "0.31.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" +checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -6746,7 +7064,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cursor-icon", "wayland-backend", ] @@ -6768,7 +7086,7 @@ version = "0.32.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6780,7 +7098,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6793,7 +7111,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6806,7 +7124,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6819,7 +7137,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6828,9 +7146,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" dependencies = [ "proc-macro2", "quick-xml", @@ -6851,9 +7169,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.103" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ "js-sys", "wasm-bindgen", @@ -6871,15 +7189,15 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.2.1" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" +checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" dependencies = [ - "core-foundation 0.10.1", "jni", "log", "ndk-context", "objc2 0.6.4", + "objc2-app-kit 0.3.2", "objc2-foundation 0.3.2", "url", "web-sys", @@ -6887,9 +7205,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" dependencies = [ "rustls-pki-types", ] @@ -6902,9 +7220,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -6994,7 +7312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "document-features", @@ -7024,7 +7342,7 @@ dependencies = [ "arrayvec", "bit-set 0.8.0", "bit-vec 0.8.0", - "bitflags 2.13.0", + "bitflags 2.13.1", "bytemuck", "cfg_aliases", "document-features", @@ -7039,7 +7357,7 @@ dependencies = [ "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "wgpu-core-deps-apple", "wgpu-core-deps-emscripten", "wgpu-core-deps-windows-linux-android", @@ -7084,7 +7402,7 @@ dependencies = [ "arrayvec", "ash", "bit-set 0.8.0", - "bitflags 2.13.0", + "bitflags 2.13.1", "block", "bytemuck", "cfg-if", @@ -7115,12 +7433,12 @@ dependencies = [ "raw-window-handle", "renderdoc-sys", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "web-sys", "wgpu-types", "windows", - "windows-core", + "windows-core 0.58.0", ] [[package]] @@ -7129,11 +7447,11 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "bytemuck", "js-sys", "log", - "thiserror 2.0.18", + "thiserror 2.0.20", "web-sys", ] @@ -7174,7 +7492,7 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -7184,13 +7502,26 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -7199,7 +7530,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -7210,7 +7552,18 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -7228,16 +7581,34 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -7478,7 +7849,7 @@ dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.13.0", + "bitflags 2.13.1", "block2 0.5.1", "bytemuck", "calloop 0.13.0", @@ -7532,9 +7903,9 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] @@ -7604,7 +7975,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn 2.0.118", + "syn 2.0.119", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -7620,7 +7991,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -7632,7 +8003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0c57df25e7ee612d946d3b7646c1ddb2310f8280aa2c17e543b66e0812241" dependencies = [ "anyhow", - "bitflags 2.13.0", + "bitflags 2.13.1", "indexmap", "log", "serde", @@ -7689,9 +8060,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "wyz" @@ -7736,9 +8107,9 @@ checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] name = "xcursor" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" [[package]] name = "xkbcommon-dl" @@ -7746,7 +8117,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "dlib", "log", "once_cell", @@ -7761,15 +8132,15 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.28" +version = "0.8.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" [[package]] name = "xxhash-rust" -version = "0.8.16" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d93c89cdc2d3a63c3ec48ffe926931bdc069eafa8e4402fe6d8f790c9d1e576" +checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6" [[package]] name = "yaxpeax-arch" @@ -7820,15 +8191,15 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] [[package]] name = "zbus" -version = "5.17.0" +version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28b97f866896a4be7aefd2b5a8e01bb6773d19a775d54ab28b4d094b9a4480e" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" dependencies = [ "async-broadcast", "async-executor", @@ -7840,7 +8211,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.1", + "event-listener 5.4.2", "futures-core", "futures-lite", "hex", @@ -7853,7 +8224,7 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 1.0.3", + "winnow 1.0.4", "zbus_macros", "zbus_names", "zvariant", @@ -7861,14 +8232,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.17.0" +version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e05ad887425eecf5e8384dc2406a4a9313eb73468712fc1cdea362eb4fe0469" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", "zbus_names", "zvariant", "zvariant_utils", @@ -7876,33 +8247,42 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.3" +version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039ca249fee9559680f3a9f05b55e0761fee51af4f6c1e7d8c1f31e549721d2" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" dependencies = [ "serde", - "winnow 1.0.3", + "winnow 1.0.4", "zvariant", ] +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -7922,7 +8302,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] @@ -7934,9 +8314,9 @@ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -7945,9 +8325,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8" dependencies = [ "yoke", "zerofrom", @@ -7956,26 +8336,26 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "47402523226a02bfe5230160dc3ccc089aa6f6f19e7fcbb4e6f824bbb1b4aa62" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zune-core" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" [[package]] name = "zune-jpeg" @@ -7988,41 +8368,42 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.13.0" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf057bb00bf5c9ad77abb6147b0ca4818236a1858416e9d988e40d6322fefa7" +checksum = "b5e28c25bd8bb8da5a1f3e7065d0c156b9ee9a7973adf78b0e35eaefdf3b1b5c" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 1.0.3", + "winnow 1.0.4", + "zcheapstr", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.13.0" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8118ca6bda77bfc0ab51d660db0c955f2505eef854c9a449435bccb616933b31" +checksum = "d496a145685283b67e232bd9e47377f6b60ad9d51e3601b23867f77c42477f96" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.5.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7" +checksum = "629d80ece222cad20fe0e8741be493c4ab166acf3b85341bdc2cdbcfd8f3c2d6" dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.118", - "winnow 1.0.3", + "syn 3.0.3", + "winnow 1.0.4", ] diff --git a/objdiff-cli/Cargo.toml b/objdiff-cli/Cargo.toml index 863a6b11..a85c5079 100644 --- a/objdiff-cli/Cargo.toml +++ b/objdiff-cli/Cargo.toml @@ -15,17 +15,22 @@ publish = false [dependencies] anyhow = "1.0" argp = "0.4" +axum = "0.8.9" crossterm = "0.29" enable-ansi-support = "0.3" +futures-util = "0.3" memmap2 = "0.9" objdiff-core = { path = "../objdiff-core", features = ["all"] } prost = "0.14" ratatui = "0.30" rayon = "1.11" +rmcp = { version = "2.1.0", features = ["server", "transport-io", "transport-streamable-http-server"] } +schemars = "1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" supports-color = "3.0" time = { version = "0.3", features = ["formatting", "local-offset"] } +tokio = { version = "1.52.3", features = ["rt-multi-thread", "macros", "io-std", "signal", "sync"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } typed-path = "0.12" diff --git a/objdiff-cli/src/cmd/mcp/README.md b/objdiff-cli/src/cmd/mcp/README.md new file mode 100644 index 00000000..274d5da8 --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/README.md @@ -0,0 +1,100 @@ +# objdiff-cli mcp + +A [Model Context Protocol](https://modelcontextprotocol.io) server that exposes +[objdiff](https://github.com/encounter/objdiff)'s diffing engine so a model can +drive decompilation matching without any UI. + +It's designed to close the loop with an IDA bridge: read the reference in IDA → +write/adjust C/C++ → compile to an object → **`diff_function`** against the +baseline → read the per-instruction diff → repeat until 100%. + +``` + IDA (reference) decomp project objdiff-cli mcp (this) + ida-bridge MCP → edit C++ → build → diff_function → match% + instr diff + ▲ │ + └────────────── agent iterates ◀────────────┘ +``` + +## Build + +```bash +cargo build --release -p objdiff-cli +# binary: target/release/objdiff-cli +``` + +Built on `objdiff-core` (all architectures: ARM, ARM64, MIPS, PPC, SuperH, +x86/x86_64) with COFF + ELF support. + +## Run + +The server is persistent — it runs until closed and holds project/config state +across calls. + +**Persistent HTTP instance** (recommended; e.g. on the Windows build VM next to +the compiled objects, reached from the agent over the network): + +```bash +objdiff-cli mcp --transport http --bind 0.0.0.0:3001 [--project C:\path\to\project] +# MCP endpoint: http://:3001/mcp +``` + +**stdio** (spawned by the client via `.mcp.json`): + +```bash +objdiff-cli mcp # --transport stdio is the default +``` + +Logs go to stderr; stdout is reserved for the protocol on stdio. + +## Tools + +| Tool | Purpose | +|---|---| +| `open_project` | Load an `objdiff.json` so later calls refer to **units** by name instead of file paths. | +| `list_units` | List the project's units with their resolved target/base object paths (optional name filter). | +| `build` | Run the project's build command for a unit's base (or target) object; returns command line, exit status, and compiler output. | +| `diff_function` | Diff one function between the target (expected/baseline) and base (current/your build). Returns the match percent and a **side-by-side, per-instruction diff** with mismatch markers. The primary matching tool. | +| `diff_overview` | List every function in the object pair with its match percent, worst first. Use to pick what to work on. | +| `set_config` | Set a persistent objdiff config option (e.g. `x86.formatter`, `spaceBetweenArgs`, `demangler`) applied to subsequent diffs. | +| `version` | Report the server version. | + +`diff_function` / `diff_overview` take **either** a project `unit` **or** explicit +`target`+`base` object-file paths, plus an optional per-call `config` map of +objdiff config overrides. Mismatch marker legend: +`~` replace · `o` opcode-mismatch · `a` arg-mismatch · `+` insert · `-` delete. + +## The matching loop + +1. `open_project` once (or `--project` at startup). +2. Understand the target function in IDA (via the IDA bridge). +3. Edit the C/C++ for the unit. +4. `build` the unit. +5. `diff_function(unit, symbol)` — read the match % and the side-by-side diff. +6. Adjust based on the mismatching instructions; cross-check offsets/targets in + IDA. Go to 3. Repeat until 100%. + +Use `diff_overview(unit, only_mismatches=true)` to triage which functions to +attack first. + +## Connecting the agent + +**HTTP (shared instance):** point your MCP client at `http://:3001/mcp`. + +**stdio (`.mcp.json`):** + +```json +{ + "mcpServers": { + "objdiff": { "command": "/path/to/objdiff-cli", "args": ["mcp"] } + } +} +``` + +## Note on the baseline + +objdiff compares two objects: the **target** (the original/expected function's +machine code, the "baseline") and the **base** (your current build). Producing +the baseline object — extracting the original function's bytes into a COFF/ELF +object with name/xref-derived relocations — is a build/extraction step outside +objdiff (best done IDA-side, where the names and xrefs live). Point `target_path` +in `objdiff.json` at that file. diff --git a/objdiff-cli/src/cmd/mcp/diff.rs b/objdiff-cli/src/cmd/mcp/diff.rs new file mode 100644 index 00000000..c9fa62b3 --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/diff.rs @@ -0,0 +1,160 @@ +//! Core diffing helpers built directly on `objdiff-core`. +//! +//! These are UI-free and synchronous; the MCP server layer wraps them in +//! `spawn_blocking` and turns the results into tool responses. + +use std::{collections::BTreeMap, fmt::Write as _, path::Path}; + +use anyhow::{Context, Result}; +use objdiff_core::{ + bindings::diff::{DiffKind, DiffObject, DiffResult, DiffSymbol, DiffSymbolKind}, + diff::{DiffObjConfig, DiffSide, MappingConfig, diff_objs}, + obj::read, +}; + +/// Load target + base objects from disk and produce a full serializable diff. +/// +/// `target` is the expected/baseline object (left); `base` is your current +/// build (right). +pub fn run_diff( + target: &Path, + base: &Path, + config: &DiffObjConfig, + mappings: &BTreeMap, +) -> Result { + let target_obj = read::read(target, config, DiffSide::Target) + .with_context(|| format!("Failed to read target object {}", target.display()))?; + let base_obj = read::read(base, config, DiffSide::Base) + .with_context(|| format!("Failed to read base object {}", base.display()))?; + let mapping_config = + MappingConfig { mappings: mappings.clone(), selecting_left: None, selecting_right: None }; + let result = diff_objs(Some(&target_obj), Some(&base_obj), None, config, &mapping_config) + .context("Failed to diff objects")?; + DiffResult::new( + result.left.as_ref().map(|d| (&target_obj, d)), + result.right.as_ref().map(|d| (&base_obj, d)), + config, + ) + .context("Failed to build diff result") +} + +fn kind_marker(kind: DiffKind) -> &'static str { + match kind { + DiffKind::DiffNone => " ", + DiffKind::DiffReplace => "~", + DiffKind::DiffDelete => "-", + DiffKind::DiffInsert => "+", + DiffKind::DiffOpMismatch => "o", + DiffKind::DiffArgMismatch => "a", + } +} + +fn is_function(sym: &DiffSymbol) -> bool { + DiffSymbolKind::try_from(sym.kind).unwrap_or(DiffSymbolKind::SymbolUnknown) + == DiffSymbolKind::SymbolFunction +} + +/// A compact, token-efficient overview of every code symbol and its match %. +pub fn overview(diff: &DiffResult, min_only_mismatches: bool, limit: usize) -> String { + let Some(right) = diff.right.as_ref() else { + return "No base object in diff result.".to_string(); + }; + let mut rows: Vec<(&str, f32, u64)> = right + .symbols + .iter() + .filter(|s| is_function(s)) + .map(|s| (s.name.as_str(), s.match_percent.unwrap_or(0.0), s.size)) + .collect(); + // Worst matches first — that's what you want to work on. + rows.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(std::cmp::Ordering::Equal)); + if min_only_mismatches { + rows.retain(|r| r.1 < 100.0); + } + + let mut out = String::new(); + let total = rows.len(); + let _ = writeln!(out, "{total} function(s) (worst match first):"); + for (name, pct, size) in rows.into_iter().take(limit) { + let _ = writeln!(out, " {pct:6.2}% {size:>6} {name}"); + } + out +} + +fn instr_text(sym: Option<&DiffSymbol>, i: usize) -> (&str, Option) { + match sym.and_then(|s| s.instructions.get(i)) { + Some(row) => match row.instruction.as_ref() { + Some(ins) => (ins.formatted.as_str(), Some(ins.address)), + None => ("", None), + }, + None => ("", None), + } +} + +/// Render a single function's diff as a side-by-side (target vs current) table +/// with per-row mismatch markers — the primary signal for iterative matching. +pub fn function_diff(diff: &DiffResult, symbol: &str) -> Result { + let right = diff.right.as_ref().context("No base object in diff result")?; + let left = diff.left.as_ref(); + + // Look the symbol up by its base (current) name first; fall back to the + // target-side name and follow its pairing back to the base symbol, so + // mapped symbols (e.g. statics renamed between objects) resolve either way. + let base_sym = right + .symbols + .iter() + .find(|s| s.name == symbol) + .or_else(|| { + left.and_then(|l| l.symbols.iter().find(|s| s.name == symbol)) + .and_then(|ls| ls.target_symbol) + .and_then(|bi| right.symbols.get(bi as usize)) + }) + .with_context(|| { + format!("Symbol `{symbol}` not found in base (current) or target object") + })?; + + let target_sym: Option<&DiffSymbol> = base_sym + .target_symbol + .and_then(|ti| left.and_then(|l: &DiffObject| l.symbols.get(ti as usize))); + + let pct = base_sym.match_percent.unwrap_or(0.0); + let mut out = String::new(); + let _ = writeln!(out, "symbol : {symbol}"); + if let Some(dm) = &base_sym.demangled_name { + let _ = writeln!(out, "demangled: {dm}"); + } + let _ = writeln!(out, "match : {pct:.2}%"); + match target_sym { + Some(_) => {} + None => { + let _ = writeln!( + out, + "note : no matched symbol in target object (unmatched — nothing to compare against)" + ); + } + } + let _ = writeln!( + out, + "legend : ' '=equal ~=replace o=opcode-mismatch a=arg-mismatch +=insert -=delete" + ); + let _ = writeln!(out); + let _ = writeln!( + out, + " {:<8} {:1} {:<38} {:<38}", + "addr", "", "target (expected)", "current (yours)" + ); + + let n = base_sym.instructions.len().max(target_sym.map(|s| s.instructions.len()).unwrap_or(0)); + for i in 0..n { + let (rtext, raddr) = instr_text(Some(base_sym), i); + let (ltext, laddr) = instr_text(target_sym, i); + let kind = base_sym + .instructions + .get(i) + .map(|r| DiffKind::try_from(r.diff_kind).unwrap_or(DiffKind::DiffNone)) + .unwrap_or(DiffKind::DiffInsert); + let addr = raddr.or(laddr).unwrap_or(0); + let _ = + writeln!(out, " {:08x} {:1} {:<38} {:<38}", addr, kind_marker(kind), ltext, rtext); + } + Ok(out) +} diff --git a/objdiff-cli/src/cmd/mcp/mod.rs b/objdiff-cli/src/cmd/mcp/mod.rs new file mode 100644 index 00000000..e8fe1244 --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/mod.rs @@ -0,0 +1,141 @@ +//! `objdiff-cli mcp`: a Model Context Protocol server exposing objdiff's +//! diffing for AI-driven decompilation matching. +//! +//! Runs persistently ("prompt as you go") over either transport: +//! * `--transport stdio` (default) for a client that spawns it (e.g. `.mcp.json`) +//! * `--transport http` for a long-lived shared instance reachable over the network + +mod diff; +mod project; +mod server; +mod state; +mod wire; + +use std::{path::PathBuf, sync::Arc}; + +use anyhow::{Result, bail}; +use argp::FromArgs; +use axum::{ + body::{Body, to_bytes}, + extract::Request, + http::StatusCode, + middleware::Next, + response::{IntoResponse, Response}, +}; +use futures_util::StreamExt; +use rmcp::{ + ServiceExt, + transport::{ + stdio, + streamable_http_server::{ + StreamableHttpService, session::local::LocalSessionManager, + tower::StreamableHttpServerConfig, + }, + }, +}; + +use self::{ + server::ObjdiffServer, + state::AppState, + wire::{LoggingRead, LoggingWrite}, +}; + +#[derive(FromArgs, PartialEq, Debug)] +/// Starts an MCP server exposing objdiff's diffing for decompilation matching. +#[argp(subcommand, name = "mcp")] +pub struct Args { + #[argp(option, default = "String::from(\"stdio\")")] + /// Transport: "stdio" or "http". (Default: stdio) + transport: String, + #[argp(option, default = "String::from(\"127.0.0.1:3001\")")] + /// Bind address for the http transport. (Default: 127.0.0.1:3001) + bind: String, + #[argp(option)] + /// Optionally remember a project directory on startup. + project: Option, +} + +/// Largest request body buffered for logging on the http transport. +const HTTP_BODY_LIMIT: usize = 8 * 1024 * 1024; + +/// Log both sides of an http request. Responses are usually SSE streams, so +/// their body is logged chunk by chunk as it is produced rather than buffered. +async fn log_http(request: Request, next: Next) -> Response { + let (parts, body) = request.into_parts(); + let bytes = match to_bytes(body, HTTP_BODY_LIMIT).await { + Ok(bytes) => bytes, + Err(e) => { + tracing::warn!( + "{} {} {}: failed to read body: {e}", + wire::RECV, + parts.method, + parts.uri + ); + return StatusCode::PAYLOAD_TOO_LARGE.into_response(); + } + }; + tracing::info!("{} {} {}", wire::RECV, parts.method, parts.uri); + wire::log_payload(wire::RECV, &bytes); + + let response = next.run(Request::from_parts(parts, Body::from(bytes))).await; + + let (parts, body) = response.into_parts(); + tracing::info!("{} {}", wire::SEND, parts.status); + let body = Body::from_stream(body.into_data_stream().map(|chunk| { + match &chunk { + Ok(bytes) => wire::log_payload(wire::SEND, bytes), + Err(e) => tracing::warn!("{} response body error: {e}", wire::SEND), + } + chunk + })); + Response::from_parts(parts, body) +} + +pub fn run(args: Args) -> Result<()> { + let runtime = tokio::runtime::Builder::new_multi_thread().enable_all().build()?; + runtime.block_on(run_async(args)) +} + +async fn run_async(args: Args) -> Result<()> { + let app_state = Arc::new(AppState::new()); + if let Some(dir) = args.project.as_deref() { + match app_state.open_project(&dir.to_string_lossy()) { + Ok(summary) => tracing::info!("{summary}"), + Err(e) => tracing::warn!("Failed to open project: {e:#}"), + } + } + + match args.transport.as_str() { + "stdio" => { + // Logs go to stderr (configured in main); stdout is the MCP protocol channel. + tracing::info!("objdiff mcp server starting on stdio"); + let (stdin, stdout) = stdio(); + let transport = (LoggingRead::new(stdin), LoggingWrite::new(stdout)); + let service = ObjdiffServer::new(app_state).serve(transport).await?; + service.waiting().await?; + } + "http" => { + let factory_state = app_state.clone(); + let service = StreamableHttpService::new( + move || Ok(ObjdiffServer::new(factory_state.clone())), + Arc::new(LocalSessionManager::default()), + StreamableHttpServerConfig::default(), + ); + let router = axum::Router::new() + .nest_service("/mcp", service) + .layer(axum::middleware::from_fn(log_http)); + let listener = tokio::net::TcpListener::bind(&args.bind).await?; + tracing::info!("objdiff mcp server listening on http://{}/mcp", args.bind); + axum::serve(listener, router) + .with_graceful_shutdown(async { + let _ = tokio::signal::ctrl_c().await; + tracing::info!("shutting down"); + }) + .await?; + } + other => { + bail!("Unknown transport `{other}` (expected `stdio` or `http`)"); + } + } + Ok(()) +} diff --git a/objdiff-cli/src/cmd/mcp/project.rs b/objdiff-cli/src/cmd/mcp/project.rs new file mode 100644 index 00000000..49e4f42c --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/project.rs @@ -0,0 +1,255 @@ +//! Project (`objdiff.json`) awareness: load a config, resolve a unit's +//! target/base object paths exactly like objdiff does, merge diff options, +//! and run the project's build command. + +use std::{collections::BTreeMap, path::PathBuf}; + +use anyhow::{Context, Result, anyhow, bail}; +use objdiff_core::{ + build::{BuildConfig, BuildStatus}, + config::{ + ProjectConfig, ProjectConfigInfo, ProjectObject, apply_project_options, save_project_config, + }, + diff::DiffObjConfig, +}; +use typed_path::Utf8PlatformPathBuf; + +/// A loaded project plus its directory (native encoding). +pub struct LoadedProject { + pub dir: Utf8PlatformPathBuf, + pub config: ProjectConfig, + pub info: ProjectConfigInfo, +} + +impl LoadedProject { + pub fn load(dir: &str) -> Result { + let native = PathBuf::from(dir); + let (result, info) = objdiff_core::config::try_project_config(&native) + .with_context(|| format!("No objdiff.json/yml found in {dir}"))?; + let config = result.context("Failed to parse project config")?; + Ok(Self { dir: Utf8PlatformPathBuf::from(dir), config, info }) + } + + fn object(&self, unit: &str) -> Result<&ProjectObject> { + self.config + .units() + .iter() + .find(|o| o.name() == unit) + .with_context(|| format!("Unit `{unit}` not found in project")) + } + + fn object_mut(&mut self, unit: &str) -> Result<&mut ProjectObject> { + self.config + .units + .as_mut() + .and_then(|units| units.iter_mut().find(|o| o.name() == unit)) + .with_context(|| format!("Unit `{unit}` not found in project")) + } + + /// Resolve a unit's (target, base) object paths, mirroring objdiff's + /// `ObjectConfig::new` path logic. + pub fn resolve_paths(&self, unit: &str) -> Result<(Option, Option)> { + let obj = self.object(unit)?; + let target_dir = + self.config.target_dir.as_ref().map(|d| self.dir.join(d.with_platform_encoding())); + let base_dir = + self.config.base_dir.as_ref().map(|d| self.dir.join(d.with_platform_encoding())); + + let target = match (&target_dir, &obj.path, &obj.target_path) { + (Some(td), Some(path), None) => Some(td.join(path.with_platform_encoding())), + _ => obj.target_path.as_ref().map(|p| self.dir.join(p.with_platform_encoding())), + }; + let base = match (&base_dir, &obj.path, &obj.base_path) { + (Some(bd), Some(path), None) => Some(bd.join(path.with_platform_encoding())), + _ => obj.base_path.as_ref().map(|p| self.dir.join(p.with_platform_encoding())), + }; + Ok((target.map(to_std), base.map(to_std))) + } + + /// A unit's manual symbol mappings (target name -> base name), if any. + pub fn symbol_mappings(&self, unit: &str) -> Result> { + Ok(self.object(unit)?.symbol_mappings.clone().unwrap_or_default()) + } + + /// Add, remove, or clear a unit's manual symbol mappings, persisting the + /// change to the project config file. + /// + /// * `target` + `base`: map the target symbol to the base symbol. + /// * `target` only: remove the mapping for that target symbol. + /// * neither: clear all mappings for the unit. + pub fn set_symbol_mapping( + &mut self, + unit: &str, + target: Option<&str>, + base: Option<&str>, + ) -> Result { + let summary = { + let object = self.object_mut(unit)?; + let mappings = object.symbol_mappings.get_or_insert_with(BTreeMap::new); + let summary = match (target, base) { + (Some(target), Some(base)) => { + // Mirrors the GUI: a symbol may only participate in one + // mapping on each side, and identity mappings are implicit. + mappings.retain(|l, r| l != target && r != base); + if target == base { + format!("`{target}` maps to itself; no mapping stored for unit `{unit}`") + } else { + mappings.insert(target.to_string(), base.to_string()); + format!("Mapped target `{target}` -> base `{base}` in unit `{unit}`") + } + } + (Some(target), None) => match mappings.remove(target) { + Some(base) => { + format!("Removed mapping `{target}` -> `{base}` from unit `{unit}`") + } + None => format!("No mapping for target `{target}` in unit `{unit}`"), + }, + (None, Some(base)) => { + // Removing by base name, since either side identifies a mapping. + let before = mappings.len(); + mappings.retain(|_, r| r != base); + match before - mappings.len() { + 0 => format!("No mapping to base `{base}` in unit `{unit}`"), + _ => format!("Removed mapping to base `{base}` from unit `{unit}`"), + } + } + (None, None) => { + let count = mappings.len(); + mappings.clear(); + format!("Cleared {count} mapping(s) from unit `{unit}`") + } + }; + if mappings.is_empty() { + object.symbol_mappings = None; + } + summary + }; + self.save()?; + Ok(summary) + } + + /// Write the (possibly modified) project config back to disk. + fn save(&mut self) -> Result<()> { + self.info = save_project_config(&self.config, &self.info) + .context("Failed to save project config")?; + Ok(()) + } + + /// One-line-per-mapping listing for a unit. + pub fn list_symbol_mappings(&self, unit: &str) -> Result { + use std::fmt::Write as _; + let mappings = self.symbol_mappings(unit)?; + let mut out = format!("{} mapping(s) in unit `{unit}` (target -> base):\n", mappings.len()); + for (target, base) in &mappings { + let _ = writeln!(out, " {target} -> {base}"); + } + Ok(out) + } + + /// Build the diff config for a unit: project options then unit options. + pub fn apply_options(&self, unit: Option<&str>, config: &mut DiffObjConfig) -> Result<()> { + if let Some(options) = &self.config.options { + apply_project_options(config, options)?; + } + if let Some(unit) = unit + && let Some(options) = &self.object(unit)?.options + { + apply_project_options(config, options)?; + } + Ok(()) + } + + /// Prepare a build invocation (config + relative unix object path) for a + /// unit's base (or target) object. The caller runs `run_make` off-lock. + pub fn build_invocation( + &self, + unit: &str, + target: bool, + ) -> Result<(BuildConfig, typed_path::Utf8UnixPathBuf)> { + let (target_path, base_path) = self.resolve_paths(unit)?; + let path = if target { target_path } else { base_path }; + let path = path.ok_or_else(|| { + anyhow!("Unit `{unit}` has no {} path", if target { "target" } else { "base" }) + })?; + let path_str = path.to_string_lossy().into_owned(); + let path_pp = Utf8PlatformPathBuf::from(path_str); + let rel = path_pp.strip_prefix(&self.dir).map_err(|_| { + anyhow!("Object path `{path_pp}` is not inside project dir `{}`", self.dir) + })?; + let rel_unix = rel.with_unix_encoding(); + let build_config = BuildConfig { + project_dir: Some(self.dir.clone()), + custom_make: self.config.custom_make.clone(), + custom_args: self.config.custom_args.clone(), + selected_wsl_distro: None, + }; + Ok((build_config, rel_unix)) + } + + /// One-line-per-unit listing with resolved path presence. + pub fn list_units(&self, filter: Option<&str>) -> String { + use std::fmt::Write as _; + let mut out = String::new(); + let units = self.config.units(); + let _ = writeln!(out, "{} unit(s):", units.len()); + for obj in units { + let name = obj.name(); + if let Some(f) = filter + && !name.contains(f) + { + continue; + } + let (t, b) = self.resolve_paths(name).unwrap_or((None, None)); + let _ = writeln!( + out, + " {name} [target: {}] [base: {}]", + t.map(|p| p.display().to_string()).unwrap_or_else(|| "-".into()), + b.map(|p| p.display().to_string()).unwrap_or_else(|| "-".into()), + ); + } + out + } +} + +fn to_std(p: Utf8PlatformPathBuf) -> PathBuf { PathBuf::from(p.as_str()) } + +/// Ensure a build succeeded, otherwise surface stdout/stderr. +pub fn build_status_text(status: &BuildStatus) -> String { + let mut out = format!( + "$ {}\nexit: {}\n", + status.cmdline, + if status.success { "success" } else { "FAILED" } + ); + if !status.stdout.is_empty() { + out.push_str("--- stdout ---\n"); + out.push_str(&status.stdout); + out.push('\n'); + } + if !status.stderr.is_empty() { + out.push_str("--- stderr ---\n"); + out.push_str(&status.stderr); + out.push('\n'); + } + out +} + +/// Resolve final (target, base) std paths from either explicit paths or a unit. +pub fn resolve_inputs( + project: Option<&LoadedProject>, + unit: Option<&str>, + target: Option<&str>, + base: Option<&str>, +) -> Result<(PathBuf, PathBuf)> { + if let Some(unit) = unit { + let project = project.context("No project loaded; call open_project first")?; + let (t, b) = project.resolve_paths(unit)?; + let t = t.with_context(|| format!("Unit `{unit}` has no target path"))?; + let b = b.with_context(|| format!("Unit `{unit}` has no base path"))?; + Ok((t, b)) + } else { + match (target, base) { + (Some(t), Some(b)) => Ok((PathBuf::from(t), PathBuf::from(b))), + _ => bail!("Provide either `unit` (with a loaded project) or both `target` and `base`"), + } + } +} diff --git a/objdiff-cli/src/cmd/mcp/server.rs b/objdiff-cli/src/cmd/mcp/server.rs new file mode 100644 index 00000000..cafd6a67 --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/server.rs @@ -0,0 +1,273 @@ +//! rmcp server exposing objdiff's diffing as MCP tools. + +use std::{collections::BTreeMap, sync::Arc}; + +use objdiff_core::build::run_make; +use rmcp::{ + ErrorData, ServerHandler, + handler::server::{router::tool::ToolRouter, wrapper::Parameters}, + model::{CallToolResult, ContentBlock, ServerCapabilities, ServerInfo}, + tool, tool_handler, tool_router, +}; +use schemars::JsonSchema; +use serde::Deserialize; + +use super::{diff, project, state::AppState}; + +#[derive(Clone)] +pub struct ObjdiffServer { + state: Arc, + // Read by the `#[tool_handler]`-generated dispatch code. + #[allow(dead_code)] + tool_router: ToolRouter, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct OpenProjectArgs { + /// Directory containing an `objdiff.json` (or `.yml`/`.yaml`). + pub dir: String, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct ListUnitsArgs { + /// Optional substring filter on unit names. + #[serde(default)] + pub filter: Option, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct BuildArgs { + /// Unit (translation-unit) name to build, from the loaded project. + pub unit: String, + /// Build the target/expected object instead of your base build (default false). + #[serde(default)] + pub target: bool, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct DiffFunctionArgs { + /// Unit name from the loaded project (alternative to target/base paths). + #[serde(default)] + pub unit: Option, + /// Path to the target/expected object file (the baseline). Use with `base`. + #[serde(default)] + pub target: Option, + /// Path to the base/current object file produced by your build. Use with `target`. + #[serde(default)] + pub base: Option, + /// Name of the function symbol to diff. + pub symbol: String, + /// Optional objdiff config overrides, e.g. `{"x86.formatter": "intel"}`. + #[serde(default)] + pub config: BTreeMap, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct DiffOverviewArgs { + /// Unit name from the loaded project (alternative to target/base paths). + #[serde(default)] + pub unit: Option, + /// Path to the target/expected object file (the baseline). Use with `base`. + #[serde(default)] + pub target: Option, + /// Path to the base/current object file produced by your build. Use with `target`. + #[serde(default)] + pub base: Option, + /// Only list functions that are not already 100% matched. + #[serde(default)] + pub only_mismatches: bool, + /// Maximum number of functions to list (default 200). + #[serde(default)] + pub limit: Option, + /// Optional objdiff config overrides. + #[serde(default)] + pub config: BTreeMap, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct SetSymbolMappingArgs { + /// Unit name from the loaded project. + pub unit: String, + /// Symbol name in the target (expected/baseline) object. + #[serde(default)] + pub target_symbol: Option, + /// Symbol name in the base (current/your build) object. + #[serde(default)] + pub base_symbol: Option, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct ListSymbolMappingsArgs { + /// Unit name from the loaded project. + pub unit: String, +} + +#[derive(Debug, Deserialize, JsonSchema)] +pub struct SetConfigArgs { + /// Config property id, e.g. `x86.formatter` or `spaceBetweenArgs`. + pub key: String, + /// New value for the property. + pub value: String, +} + +fn err(e: anyhow::Error) -> ErrorData { ErrorData::internal_error(format!("{e:#}"), None) } + +fn join_err(e: tokio::task::JoinError) -> ErrorData { + ErrorData::internal_error(format!("task join error: {e}"), None) +} + +fn text(s: String) -> CallToolResult { CallToolResult::success(vec![ContentBlock::text(s)]) } + +#[tool_router] +impl ObjdiffServer { + pub fn new(state: Arc) -> Self { Self { state, tool_router: Self::tool_router() } } + + #[tool(description = "Report the objdiff-cli / objdiff-core version.")] + async fn version(&self) -> Result { + Ok(text(format!("objdiff-cli mcp {} (objdiff-core embedded)", env!("CARGO_PKG_VERSION")))) + } + + #[tool( + description = "Load an objdiff project (objdiff.json) so later tools can refer to units \ + by name instead of file paths." + )] + async fn open_project( + &self, + Parameters(args): Parameters, + ) -> Result { + Ok(text(self.state.open_project(&args.dir).map_err(err)?)) + } + + #[tool(description = "List units in the loaded project with their resolved target/base paths.")] + async fn list_units( + &self, + Parameters(args): Parameters, + ) -> Result { + Ok(text(self.state.list_units(args.filter.as_deref()).map_err(err)?)) + } + + #[tool(description = "Diff a single function between the target (expected/baseline) and base \ + (current/your build) objects. Specify either a project `unit` or explicit `target`+`base` \ + paths. Returns the overall match percent and a side-by-side, per-instruction diff with \ + mismatch markers. The primary tool for iterating C/C++ toward a 100% match.")] + async fn diff_function( + &self, + Parameters(args): Parameters, + ) -> Result { + let inputs = self + .state + .prepare_diff( + args.unit.as_deref(), + args.target.as_deref(), + args.base.as_deref(), + &args.config, + ) + .map_err(err)?; + let symbol = args.symbol; + let out = tokio::task::spawn_blocking(move || -> anyhow::Result { + let result = + diff::run_diff(&inputs.target, &inputs.base, &inputs.config, &inputs.mappings)?; + diff::function_diff(&result, &symbol) + }) + .await + .map_err(join_err)? + .map_err(err)?; + Ok(text(out)) + } + + #[tool(description = "List every function in the object pair with its match percent, worst \ + matches first. Specify either a project `unit` or explicit `target`+`base` paths.")] + async fn diff_overview( + &self, + Parameters(args): Parameters, + ) -> Result { + let inputs = self + .state + .prepare_diff( + args.unit.as_deref(), + args.target.as_deref(), + args.base.as_deref(), + &args.config, + ) + .map_err(err)?; + let only = args.only_mismatches; + let limit = args.limit.unwrap_or(200); + let out = tokio::task::spawn_blocking(move || -> anyhow::Result { + let result = + diff::run_diff(&inputs.target, &inputs.base, &inputs.config, &inputs.mappings)?; + Ok(diff::overview(&result, only, limit)) + }) + .await + .map_err(join_err)? + .map_err(err)?; + Ok(text(out)) + } + + #[tool(description = "Run the loaded project's build command for a unit's base (or target) \ + object. Returns the command line, exit status, and compiler output.")] + async fn build( + &self, + Parameters(args): Parameters, + ) -> Result { + let (build_config, rel) = + self.state.build_invocation(&args.unit, args.target).map_err(err)?; + let status = tokio::task::spawn_blocking(move || run_make(&build_config, &rel)) + .await + .map_err(join_err)?; + Ok(text(project::build_status_text(&status))) + } + + #[tool(description = "Create, remove, or clear a unit's manual symbol mapping, pairing a \ + target (expected) symbol with a base (your build) symbol when automatic matching fails \ + (e.g. renamed statics or unmatched functions). Pass both `target_symbol` and \ + `base_symbol` to create the mapping, only one of them to remove that symbol's mapping, \ + or neither to clear every mapping for the unit. The change is saved to the project's \ + objdiff.json and applies to subsequent diffs of that unit.")] + async fn set_symbol_mapping( + &self, + Parameters(args): Parameters, + ) -> Result { + Ok(text( + self.state + .set_symbol_mapping( + &args.unit, + args.target_symbol.as_deref(), + args.base_symbol.as_deref(), + ) + .map_err(err)?, + )) + } + + #[tool(description = "List a unit's manual symbol mappings (target -> base).")] + async fn list_symbol_mappings( + &self, + Parameters(args): Parameters, + ) -> Result { + Ok(text(self.state.list_symbol_mappings(&args.unit).map_err(err)?)) + } + + #[tool(description = "Set a persistent objdiff diff/disassembly config option (applies to \ + subsequent diffs). Example keys: `x86.formatter`, `spaceBetweenArgs`, `demangler`.")] + async fn set_config( + &self, + Parameters(args): Parameters, + ) -> Result { + self.state.set_config(&args.key, &args.value).map_err(err)?; + Ok(text(format!("Set `{}` = `{}`", args.key, args.value))) + } +} + +#[tool_handler] +impl ServerHandler for ObjdiffServer { + fn get_info(&self) -> ServerInfo { + let mut info = ServerInfo::default(); + info.capabilities = ServerCapabilities::builder().enable_tools().build(); + info.instructions = Some( + "objdiff MCP server for decompilation matching. Load a project with open_project, \ + build a unit, then use diff_function to compare your build against the baseline and \ + iterate toward 100%." + .to_string(), + ); + info + } +} diff --git a/objdiff-cli/src/cmd/mcp/state.rs b/objdiff-cli/src/cmd/mcp/state.rs new file mode 100644 index 00000000..d437ddd0 --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/state.rs @@ -0,0 +1,130 @@ +//! Shared, long-lived server state. +//! +//! The server is meant to run persistently ("prompt as you go"), so state is +//! shared across every stdio session and HTTP connection via an `Arc`. + +use std::{collections::BTreeMap, path::PathBuf, sync::Mutex}; + +use anyhow::{Result, anyhow}; +use objdiff_core::{ + build::BuildConfig, + diff::{ConfigPropertyId, DiffObjConfig}, +}; +use typed_path::Utf8UnixPathBuf; + +use super::project::{LoadedProject, resolve_inputs}; + +#[derive(Default)] +pub struct AppState { + inner: Mutex, +} + +#[derive(Default)] +struct Inner { + /// Baseline diff config; project/unit options and per-call overrides layer on top. + config: DiffObjConfig, + /// Currently loaded project, if any. + project: Option, +} + +/// Everything needed to run one diff, resolved off-lock. +pub struct DiffInputs { + pub target: PathBuf, + pub base: PathBuf, + pub config: DiffObjConfig, + /// Manual symbol mappings (target name -> base name) from the unit config. + pub mappings: BTreeMap, +} + +impl AppState { + pub fn new() -> Self { Self::default() } + + /// Apply a single config override onto the persistent baseline config. + pub fn set_config(&self, key: &str, value: &str) -> Result<()> { + let id = parse_property(key)?; + let mut inner = self.inner.lock().unwrap(); + inner + .config + .set_property_value_str(id, value) + .map_err(|_| anyhow!("Invalid value `{value}` for config property `{key}`")) + } + + pub fn open_project(&self, dir: &str) -> Result { + let project = LoadedProject::load(dir)?; + let summary = format!( + "Loaded {} ({} units)", + project.info.path.display(), + project.config.units().len() + ); + self.inner.lock().unwrap().project = Some(project); + Ok(summary) + } + + pub fn list_units(&self, filter: Option<&str>) -> Result { + let inner = self.inner.lock().unwrap(); + let project = inner.project.as_ref().ok_or_else(no_project)?; + Ok(project.list_units(filter)) + } + + /// Resolve target/base paths and the final diff config for one diff. + pub fn prepare_diff( + &self, + unit: Option<&str>, + target: Option<&str>, + base: Option<&str>, + overrides: &BTreeMap, + ) -> Result { + let inner = self.inner.lock().unwrap(); + let (target, base) = resolve_inputs(inner.project.as_ref(), unit, target, base)?; + let mut config = inner.config.clone(); + if let Some(project) = inner.project.as_ref() { + project.apply_options(unit, &mut config)?; + } + let mappings = match (inner.project.as_ref(), unit) { + (Some(project), Some(unit)) => project.symbol_mappings(unit)?, + _ => BTreeMap::new(), + }; + for (key, value) in overrides { + let id = parse_property(key)?; + config + .set_property_value_str(id, value) + .map_err(|_| anyhow!("Invalid value `{value}` for config property `{key}`"))?; + } + Ok(DiffInputs { target, base, config, mappings }) + } + + /// Add/remove/clear a unit's manual symbol mappings and persist them. + pub fn set_symbol_mapping( + &self, + unit: &str, + target: Option<&str>, + base: Option<&str>, + ) -> Result { + let mut inner = self.inner.lock().unwrap(); + let project = inner.project.as_mut().ok_or_else(no_project)?; + project.set_symbol_mapping(unit, target, base) + } + + pub fn list_symbol_mappings(&self, unit: &str) -> Result { + let inner = self.inner.lock().unwrap(); + let project = inner.project.as_ref().ok_or_else(no_project)?; + project.list_symbol_mappings(unit) + } + + /// Prepare a build invocation for a unit (off-lock execution by the caller). + pub fn build_invocation( + &self, + unit: &str, + target: bool, + ) -> Result<(BuildConfig, Utf8UnixPathBuf)> { + let inner = self.inner.lock().unwrap(); + let project = inner.project.as_ref().ok_or_else(no_project)?; + project.build_invocation(unit, target) + } +} + +fn parse_property(key: &str) -> Result { + key.parse::().map_err(|_| anyhow!("Unknown config property `{key}`")) +} + +fn no_project() -> anyhow::Error { anyhow!("No project loaded; call open_project first") } diff --git a/objdiff-cli/src/cmd/mcp/wire.rs b/objdiff-cli/src/cmd/mcp/wire.rs new file mode 100644 index 00000000..b810c0d1 --- /dev/null +++ b/objdiff-cli/src/cmd/mcp/wire.rs @@ -0,0 +1,134 @@ +//! Wire-level logging of MCP traffic. +//! +//! Everything here sits *below* the rmcp handler: each JSON-RPC message is +//! logged exactly as it appears on the transport, in both directions, so a +//! session log shows the raw client/server conversation (including +//! notifications and messages rmcp answers by itself). + +use std::{ + io, + pin::Pin, + task::{Context, Poll}, +}; + +use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + +/// Prefix for messages received from the client. +pub const RECV: &str = "mcp <-"; +/// Prefix for messages sent to the client. +pub const SEND: &str = "mcp ->"; + +/// Characters of a message logged at info level. A single `diff_function` +/// response runs to tens of kilobytes, so info gets a preview and debug gets +/// the whole thing. +const PREVIEW_CHARS: usize = 800; + +/// An SSE frame made only of comment lines (`:`), i.e. a keep-alive ping. The +/// http transport sends one every 15 seconds; they carry no protocol data. +fn is_sse_keep_alive(text: &str) -> bool { + text.lines().all(|line| line.trim_end().is_empty() || line.starts_with(':')) +} + +/// Log one raw message (a JSON-RPC line, or an HTTP/SSE body chunk). +pub fn log_payload(direction: &str, bytes: &[u8]) { + let text = String::from_utf8_lossy(bytes); + let text = text.trim(); + if text.is_empty() { + return; + } + if is_sse_keep_alive(text) { + tracing::trace!("{direction} keep-alive"); + return; + } + match text.char_indices().nth(PREVIEW_CHARS) { + Some((idx, _)) => { + tracing::info!("{direction} {}… [{} bytes]", &text[..idx], text.len()); + tracing::debug!("{direction} (full) {text}"); + } + None => tracing::info!("{direction} {text}"), + } +} + +/// Accumulates transport bytes and logs each complete newline-delimited message. +struct LineLogger { + direction: &'static str, + buf: Vec, +} + +impl LineLogger { + fn new(direction: &'static str) -> Self { Self { direction, buf: Vec::new() } } + + fn push(&mut self, bytes: &[u8]) { + self.buf.extend_from_slice(bytes); + while let Some(pos) = self.buf.iter().position(|&b| b == b'\n') { + let line: Vec = self.buf.drain(..=pos).collect(); + log_payload(self.direction, &line); + } + } +} + +/// Reader wrapper that logs every message received from the client. +pub struct LoggingRead { + inner: R, + logger: LineLogger, +} + +impl LoggingRead { + pub fn new(inner: R) -> Self { Self { inner, logger: LineLogger::new(RECV) } } +} + +impl AsyncRead for LoggingRead { + fn poll_read( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut ReadBuf<'_>, + ) -> Poll> { + let this = self.get_mut(); + let start = buf.filled().len(); + let poll = Pin::new(&mut this.inner).poll_read(cx, buf); + if matches!(poll, Poll::Ready(Ok(()))) { + let new = &buf.filled()[start..]; + if !new.is_empty() { + let new = new.to_vec(); + this.logger.push(&new); + } + } + poll + } +} + +/// Writer wrapper that logs every message sent to the client. +pub struct LoggingWrite { + inner: W, + logger: LineLogger, +} + +impl LoggingWrite { + pub fn new(inner: W) -> Self { Self { inner, logger: LineLogger::new(SEND) } } +} + +impl AsyncWrite for LoggingWrite { + fn poll_write( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + let this = self.get_mut(); + let poll = Pin::new(&mut this.inner).poll_write(cx, buf); + // Only log what the inner writer actually accepted. + if let Poll::Ready(Ok(n)) = &poll { + this.logger.push(&buf[..*n]); + } + poll + } + + fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let this = self.get_mut(); + Pin::new(&mut this.inner).poll_flush(cx) + } + + fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let this = self.get_mut(); + Pin::new(&mut this.inner).poll_shutdown(cx) + } +} diff --git a/objdiff-cli/src/cmd/mod.rs b/objdiff-cli/src/cmd/mod.rs index 95417cb2..09a34b82 100644 --- a/objdiff-cli/src/cmd/mod.rs +++ b/objdiff-cli/src/cmd/mod.rs @@ -1,4 +1,5 @@ pub mod diff; +pub mod mcp; pub mod report; use std::str::FromStr; diff --git a/objdiff-cli/src/main.rs b/objdiff-cli/src/main.rs index 065f80d4..b1dbf47b 100644 --- a/objdiff-cli/src/main.rs +++ b/objdiff-cli/src/main.rs @@ -86,6 +86,7 @@ struct TopLevel { #[argp(subcommand)] enum SubCommand { Diff(cmd::diff::Args), + Mcp(cmd::mcp::Args), Report(cmd::report::Args), } @@ -141,6 +142,7 @@ fn main() { } result = result.and_then(|_| match args.command { SubCommand::Diff(c_args) => cmd::diff::run(c_args), + SubCommand::Mcp(c_args) => cmd::mcp::run(c_args), SubCommand::Report(c_args) => cmd::report::run(c_args), }); if let Err(e) = result {