From 90c2c1e3e0da48d74ee2ca25030bdffd26a75b47 Mon Sep 17 00:00:00 2001 From: MDietermann Date: Fri, 14 Aug 2026 18:26:28 +0200 Subject: [PATCH] feat(realtime): replace polling with a Rust-owned WebSocket connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MessageList polled every three seconds and ChatPage bumped a refreshKey after each send. Both are gone; messages now arrive over a socket. The connection lives in the Tauri Rust layer rather than in the WebView. Two reasons: the handshake can carry a real Authorization header, which is the only channel that nginx, Apache and Caddy do not write to their access logs by default, and tungstenite surfaces the full HTTP response on a rejected handshake. The browser API is required by spec to collapse every failure into close code 1006, so "token expired" and "server down" would be indistinguishable — which matters once the client holds connections to several servers and has to show a meaningful state for each. The socket only carries {conversation, seq}. Rust does the backfill over REST and hands resolved entities to the frontend, so the UI keeps no cursor logic: it replaces by id and sorts by seq. The client now supplies the message id. Without it an optimistically rendered message cannot be matched against the copy that arrives over the realtime channel and shows up twice; it also makes a retry after an unclear network error a no-op instead of a duplicate. icons/icon.ico is generated from the existing icon.png — tauri-build requires it on Windows, and without it the crate does not build there at all. Not yet done, marked as TODO in the code: token refresh (the connection ends at expiry with 4001), the server list replacing BASE_URL, optimistic rendering, and the DM-versus-channel rule for background fetching. --- Cargo.lock | 5088 +++++++++++++++++++++ src-tauri/Cargo.toml | 4 + src-tauri/gen/schemas/windows-schema.json | 2292 ++++++++++ src-tauri/icons/icon.ico | Bin 0 -> 102227 bytes src-tauri/src/commands/message.rs | 25 +- src-tauri/src/commands/user.rs | 8 +- src-tauri/src/lib.rs | 1 + src-tauri/src/models.rs | 6 +- src-tauri/src/realtime.rs | 219 + src-tauri/src/state.rs | 4 + src/components/MessageInput.tsx | 8 +- src/components/MessageList.tsx | 58 +- src/pages/ChatPage.tsx | 10 +- 13 files changed, 7692 insertions(+), 31 deletions(-) create mode 100644 Cargo.lock create mode 100644 src-tauri/gen/schemas/windows-schema.json create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/src/realtime.rs diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a28a701 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5088 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.20", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core", +] + +[[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 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.1", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "data-encoding" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.4+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.14.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[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 = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustification-client" +version = "0.1.0" +dependencies = [ + "futures-util", + "rand", + "reqwest 0.12.28", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tokio", + "tokio-tungstenite", + "uuid", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0527518605e68109d875e248ea259b6758801cf165e4b2c2733ae3b51f12535a" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.1", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[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 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +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", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.1", + "block2", + "core-foundation 0.10.1", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest 0.13.4", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.20", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.20", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.20", + "toml 1.1.4+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.4+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17a073bfed563fa236697a068031408a93cd9522e08abf9933ead3e73411bd71" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48ac77174b19c110a50ab2128b24215ac9cb40e0e12e093fb602d175c569d22" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.20", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.9", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.20", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "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]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47402523226a02bfe5230160dc3ccc089aa6f6f19e7fcbb4e6f824bbb1b4aa62" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 038a25c..ef20f82 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -16,3 +16,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" reqwest = { version = "0.12", features = ["json"] } tokio = { version = "1", features = ["full"] } +uuid = { version = "1.24.0", features = ["v4"] } +futures-util = "0.3.34" +tokio-tungstenite = { version = "0.30.0", features = ["rustls-tls-webpki-roots"] } +rand = "0.10.2" diff --git a/src-tauri/gen/schemas/windows-schema.json b/src-tauri/gen/schemas/windows-schema.json new file mode 100644 index 0000000..3286645 --- /dev/null +++ b/src-tauri/gen/schemas/windows-schema.json @@ -0,0 +1,2292 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-supports-multiple-windows", + "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-supports-multiple-windows", + "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-with-as-template", + "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-with-as-template", + "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-activity-name", + "markdownDescription": "Enables the activity_name command without any pre-configured scope." + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scene-identifier", + "markdownDescription": "Enables the scene_identifier command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-activity-name", + "markdownDescription": "Denies the activity_name command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scene-identifier", + "markdownDescription": "Denies the scene_identifier command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e338ce7a01ead59d225cf82abf245627d1b4150b GIT binary patch literal 102227 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

w!I^lDl_Bls>0m%; zegXOuf`Ox$&WKjZ^{jCEyLS%877^CYoevLkNJm=2I^rs*wN(rXCOlAo0ap{?|6w%V zmoNFT5|ghfS9#824HtDpuJ|7YuiH_HX>v8FER7Bm1$yc243Y)I;(RUdWUY^dw!}wg z2_BEWsc+41_h?pm@zAbUFE^HXTbX5b%hHFd;P^mH zlB|E&<3Dl(Ba|HE7bg~0e8%SXr^K$n*vL6Ks|%Py)c$GKwWy9stMQBHe;KOY$#EsI zzg)N88`&p*L40>{WZ!;#boA&e>NzTwjh14TWz+?mfg;R;`NqVyc!)3RF8>!$T|i_eC5_?Ea&$}QceOE&?>DBI~drp2Vp;E|6Vv9wQibBUF8Mpdx z1MFYzeowx(w|PA!9(H%5L7xjV+ka8wHcY~-F6VbN^WEfM+n*U-)JWRRpNxc?=Rt(1 z;Z_0tIFM-KX=>C{7L8($_ck_DR#YE3S-S&>ulaHr;_IIF7YQWKy$eRvt@t*JXqh~E zlAU+@VoB6eNo6ZTFZGclp6I#QTTUDaKOm-UmuiFTFl7KhLo z?z6J}@w;EN=v@2xyqU>KFv4hAO;j#iLWWi~i*Gw{=IisO-!W;88QCgHs=Jsq%JqDT z!MF{VzIC`RDe5cQIk&0E;nNWpVA_+?9KQeSd3Va?XhwJ@%Hyrd>H~2`W|FGEx0o4B z#D&@$p-Ci`o+|B, +} + #[tauri::command] pub async fn list_messages( state: tauri::State<'_, AppState>, conversation_id: String, ) -> Result, String> { - state - .authed_get(&format!("{}/conversations/{}/messages", BASE_URL, conversation_id)) + let history: History = state + .authed_get(&format!( + "{}/conversations/{}/messages", + BASE_URL, conversation_id + )) .send() .await .map_err(|e| e.to_string())? .json() .await - .map_err(|e| e.to_string()) + .map_err(|e| e.to_string())?; + + // Loading the history *is* a resync: adopt the cursor it came with, so the + // next realtime signal asks for a delta from the right place. + state.cursors.set(&conversation_id, history.cursor); + Ok(history.messages) } #[tauri::command] @@ -29,7 +43,12 @@ pub async fn send_message( .clone() .ok_or_else(|| "Not logged in".to_string())?; + // The id comes from here, not from the server. Without it the optimistically + // rendered message cannot be matched against the copy that arrives over the + // realtime channel, and the same message shows up twice. It also makes a + // retry after an unclear network error a no-op instead of a duplicate. let body = serde_json::json!({ + "id": uuid::Uuid::new_v4().to_string(), "conversation_id": conversation_id, "user_id": user_id, "content": content, diff --git a/src-tauri/src/commands/user.rs b/src-tauri/src/commands/user.rs index 4640c61..2b3b9d2 100644 --- a/src-tauri/src/commands/user.rs +++ b/src-tauri/src/commands/user.rs @@ -2,7 +2,11 @@ use crate::models::{AuthTokenResponse, User}; use crate::state::{AppState, BASE_URL}; #[tauri::command] -pub async fn login(state: tauri::State<'_, AppState>, email: String) -> Result { +pub async fn login( + app: tauri::AppHandle, + state: tauri::State<'_, AppState>, + email: String, +) -> Result { let users: Vec = state .client .get(format!("{}/users", BASE_URL)) @@ -38,5 +42,7 @@ pub async fn login(state: tauri::State<'_, AppState>, email: String) -> Result, +} + +#[derive(Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case")] +enum Changes { + Delta { + cursor: i64, + messages: Vec, + }, + Resync { + cursor: i64, + }, +} + +/// Cursor per conversation. Lives next to the connection and the token, so the +/// frontend never has to know it exists. +#[derive(Default)] +pub struct Cursors(Mutex>); + +impl Cursors { + fn get(&self, conversation: &str) -> i64 { + *self.0.lock().unwrap().get(conversation).unwrap_or(&0) + } + pub fn set(&self, conversation: &str, seq: i64) { + self.0.lock().unwrap().insert(conversation.to_string(), seq); + } + fn clear(&self) { + self.0.lock().unwrap().clear(); + } +} + +/// Close codes the server may send. 4002 and 4003 are terminal: reconnecting +/// after being displaced would just displace somebody else, and two devices +/// would push each other around in circles. +const CLOSE_TOKEN_EXPIRED: u16 = 4001; +const CLOSE_DISPLACED: u16 = 4002; +const CLOSE_UNAUTHORIZED: u16 = 4003; + +pub fn spawn(app: AppHandle) { + tauri::async_runtime::spawn(async move { + // TODO: one connection per configured server once the server list + // replaces BASE_URL. The structure below is per-connection already; what + // is missing is the list and the per-server auth UI. + let mut attempt: u32 = 0; + loop { + match connect_once(&app).await { + Ok(terminal) => { + if terminal { + return; + } + attempt = 0; + } + Err(e) => eprintln!("realtime: {e}"), + } + + // Full jitter. The random part is not optional: without it every + // client comes back at the same instant after a server restart. + let ceiling = (500u64 << attempt.min(6)).min(30_000); + let wait = rand::random_range(0..=ceiling); + tokio::time::sleep(Duration::from_millis(wait)).await; + attempt = attempt.saturating_add(1); + } + }); +} + +/// Returns Ok(true) when the server told us to stay down. +async fn connect_once(app: &AppHandle) -> Result { + let state = app.state::(); + let token = state + .token + .lock() + .unwrap() + .clone() + .ok_or_else(|| "not signed in".to_string())?; + + let url = BASE_URL.replacen("http", "ws", 1) + "/ws"; + let mut request = url.into_client_request().map_err(|e| e.to_string())?; + request.headers_mut().insert( + "Authorization", + format!("Bearer {token}") + .parse() + .map_err(|_| "bad token".to_string())?, + ); + + let (socket, _) = tokio_tungstenite::connect_async(request) + .await + .map_err(|e| e.to_string())?; + let (mut sink, mut stream) = socket.split(); + + // The client drives the heartbeat: it sits behind the NAT whose path needs + // keeping open, and it can slow down on battery without the server caring. + let mut ping = tokio::time::interval(Duration::from_secs(15)); + + loop { + tokio::select! { + _ = ping.tick() => { + if sink.send(Message::Ping(Vec::new().into())).await.is_err() { + return Ok(false); + } + } + received = stream.next() => { + let Some(received) = received else { return Ok(false) }; + let message = received.map_err(|e| e.to_string())?; + match message { + Message::Text(text) => match serde_json::from_str::(&text) { + Ok(Inbound::Changed { conversation, seq }) => { + // The server already collapses bursts per connection, + // so there is nothing left to debounce here. + if seq > state.cursors.get(&conversation) { + if let Err(e) = backfill(app, &conversation).await { + eprintln!("realtime: backfill failed: {e}"); + } + } + } + Ok(Inbound::Resync) => { + state.cursors.clear(); + let _ = app.emit(EVENT_RESYNC, ()); + } + Err(e) => eprintln!("realtime: undecodable frame: {e}"), + }, + Message::Close(frame) => { + let code = frame.map(|f| u16::from(f.code)).unwrap_or(0); + // TOKEN_EXPIRED counts as terminal only because there is + // no refresh flow yet — reconnecting with the same dead + // token would just spin against 401. + // TODO: refresh over REST and push the new token back + // through the socket as a `reauth` frame (the server + // already accepts one), then treat 4001 as recoverable. + return Ok(matches!( + code, + CLOSE_DISPLACED | CLOSE_UNAUTHORIZED | CLOSE_TOKEN_EXPIRED + )); + } + _ => {} + } + } + } + } +} + +async fn backfill(app: &AppHandle, conversation: &str) -> Result<(), String> { + let state = app.state::(); + let since = state.cursors.get(conversation); + + let response: Changes = state + .authed_get(&format!( + "{BASE_URL}/conversations/{conversation}/changes?since={since}" + )) + .send() + .await + .map_err(|e| e.to_string())? + .json() + .await + .map_err(|e| e.to_string())?; + + match response { + Changes::Delta { cursor, messages } => { + state.cursors.set(conversation, cursor); + app.emit( + EVENT_CHANGED, + Changed { + conversation_id: conversation.to_string(), + messages, + }, + ) + .map_err(|e| e.to_string())?; + } + Changes::Resync { cursor } => { + // Not an error — this is the normal answer on a first connection or + // after a long absence. The frontend drops its cache and reloads. + state.cursors.set(conversation, cursor); + app.emit(EVENT_RESYNC, ()).map_err(|e| e.to_string())?; + } + } + Ok(()) +} diff --git a/src-tauri/src/state.rs b/src-tauri/src/state.rs index b5f419e..9fdbeb7 100644 --- a/src-tauri/src/state.rs +++ b/src-tauri/src/state.rs @@ -6,6 +6,9 @@ pub struct AppState { pub client: reqwest::Client, pub token: Mutex>, pub user_id: Mutex>, + /// Cursor per conversation, kept here rather than in the frontend so the UI + /// has no realtime bookkeeping at all. + pub cursors: crate::realtime::Cursors, } impl AppState { @@ -14,6 +17,7 @@ impl AppState { client: reqwest::Client::new(), token: Mutex::new(None), user_id: Mutex::new(None), + cursors: Default::default(), } } diff --git a/src/components/MessageInput.tsx b/src/components/MessageInput.tsx index 837494c..cb6a1a7 100644 --- a/src/components/MessageInput.tsx +++ b/src/components/MessageInput.tsx @@ -3,10 +3,9 @@ import { invoke } from "@tauri-apps/api/core"; interface Props { conversationId: string; - onSent: () => void; } -export default function MessageInput({ conversationId, onSent }: Props) { +export default function MessageInput({ conversationId }: Props) { const [content, setContent] = useState(""); const [error, setError] = useState(null); @@ -16,7 +15,10 @@ export default function MessageInput({ conversationId, onSent }: Props) { await invoke("send_message", { conversationId, content }); setContent(""); setError(null); - onSent(); + // Nothing to trigger: the message comes back over the realtime channel. + // TODO: render it optimistically instead of waiting for the round trip — + // the client already supplies the id, which is what makes reconciling it + // possible without duplicates. } catch (e) { setError(String(e)); } diff --git a/src/components/MessageList.tsx b/src/components/MessageList.tsx index d75e443..3b28f05 100644 --- a/src/components/MessageList.tsx +++ b/src/components/MessageList.tsx @@ -1,42 +1,66 @@ import { useState, useEffect, useRef } from "react"; import { invoke } from "@tauri-apps/api/core"; +import { listen } from "@tauri-apps/api/event"; interface Message { id: string; user_id: string; content: string; + /** Sort key. Never sort by created_at — see the Rust model for why. */ + seq: number; created_at: string; } +interface Changed { + conversation_id: string; + messages: Message[]; +} + interface Props { conversationId: string; - refreshKey: number; } -export default function MessageList({ conversationId, refreshKey }: Props) { +export default function MessageList({ conversationId }: Props) { const [messages, setMessages] = useState([]); const [error, setError] = useState(null); const bottomRef = useRef(null); const prevLengthRef = useRef(0); - // Fix 3: cancellation flag prevents stale responses from overwriting new conversation + // Full load. Also the resync path: the Rust side adopts the cursor that comes + // with the history, so the next realtime signal asks for a delta from the + // right place. + const load = () => + invoke("list_messages", { conversationId }) + .then(setMessages) + .catch((e) => setError(String(e))); + useEffect(() => { - let cancelled = false; - const load = () => - invoke("list_messages", { conversationId }) - .then((msgs) => { - if (!cancelled) setMessages(msgs); - }) - .catch((e) => { if (!cancelled) setError(String(e)); }); - + setMessages([]); load(); - // ponytail: polling every 3s — replace with WebSocket when server supports it - const id = setInterval(load, 3000); - return () => { cancelled = true; clearInterval(id); prevLengthRef.current = 0; }; - // Fix 2: refreshKey in deps triggers immediate reload after send - }, [conversationId, refreshKey]); + return () => { prevLengthRef.current = 0; }; + }, [conversationId]); + + // Realtime. Rust owns the connection and the cursor and hands over resolved + // entities, so there is nothing to compute here — replace by id, sort by seq. + useEffect(() => { + const changed = listen("realtime://changed", (event) => { + if (event.payload.conversation_id !== conversationId) return; + setMessages((current) => { + const byId = new Map(current.map((m) => [m.id, m])); + for (const message of event.payload.messages) byId.set(message.id, message); + return [...byId.values()].sort((a, b) => a.seq - b.seq); + }); + }); + + // The server could not build a delta — throw the cache away and reload. + const resync = listen("realtime://resync", load); + + return () => { + changed.then((un) => un()); + resync.then((un) => un()); + }; + }, [conversationId]); - // Fix 4: scroll only when message count increases, not on every poll useEffect(() => { if (messages.length > prevLengthRef.current) { bottomRef.current?.scrollIntoView({ behavior: "smooth" }); diff --git a/src/pages/ChatPage.tsx b/src/pages/ChatPage.tsx index c40f422..863e459 100644 --- a/src/pages/ChatPage.tsx +++ b/src/pages/ChatPage.tsx @@ -7,7 +7,6 @@ import MessageInput from "../components/MessageInput"; export default function ChatPage() { const { workspaceId } = useParams<{ workspaceId: string }>(); const [conversationId, setConversationId] = useState(null); - const [refreshKey, setRefreshKey] = useState(0); return (

@@ -19,11 +18,10 @@ export default function ChatPage() {
{conversationId ? ( <> - - setRefreshKey((k) => k + 1)} - /> + + {/* No onSent callback: the sent message arrives back through the + realtime channel like any other. */} + ) : (