diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 4e7df16a3..ba97b4654 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -8,7 +8,7 @@
"pnpmVersion": "12.8.1"
},
"ghcr.io/devcontainers/features/rust:1": {
- "version": "1.98.1",
+ "version": "1.99.0",
"profile": "default"
},
"ghcr.io/devcontainers/features/git:1": {},
diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml
index eb366e654..49dd85ae2 100644
--- a/.github/workflows/autobuild.yml
+++ b/.github/workflows/autobuild.yml
@@ -154,7 +154,7 @@ jobs:
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@master
with:
- toolchain: '1.98.1'
+ toolchain: '1.99.0'
targets: ${{ matrix.target }}
- name: Add Rust Target
@@ -206,7 +206,7 @@ jobs:
- name: Add Rust Target
run: |
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
@@ -257,7 +257,7 @@ jobs:
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@master
with:
- toolchain: '1.98.1'
+ toolchain: '1.99.0'
targets: ${{ matrix.target }}
- name: Add Rust Target
@@ -347,7 +347,7 @@ jobs:
- name: Add Rust Target
run: |
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
@@ -454,7 +454,7 @@ jobs:
- name: Add Rust Target
run: |
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
index ef061de95..36ef5baab 100644
--- a/.github/workflows/dev.yml
+++ b/.github/workflows/dev.yml
@@ -74,7 +74,7 @@ jobs:
- name: Install Rust Stable
if: github.event.inputs[matrix.input] == 'true'
- uses: dtolnay/rust-toolchain@1.98.1
+ uses: dtolnay/rust-toolchain@1.99.0
- name: Rust Cache
uses: Swatinem/rust-cache@v2
@@ -129,7 +129,7 @@ jobs:
if: github.event.inputs[matrix.input] == 'true'
run: |
# Ensure cross target is installed for the pinned toolchain; fallback without explicit toolchain if needed
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 97d748a53..d2191eeb2 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -204,7 +204,7 @@ jobs:
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@master
with:
- toolchain: '1.98.1'
+ toolchain: '1.99.0'
targets: ${{ matrix.target }}
- name: Add Rust Target
@@ -244,7 +244,7 @@ jobs:
- name: Add Rust Target
run: |
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
@@ -311,7 +311,7 @@ jobs:
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@master
with:
- toolchain: '1.98.1'
+ toolchain: '1.99.0'
targets: ${{ matrix.target }}
- name: Add Rust Target
@@ -389,7 +389,7 @@ jobs:
- name: Add Rust Target
run: |
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
@@ -446,7 +446,7 @@ jobs:
- name: Install Rust Stable
uses: dtolnay/rust-toolchain@master
with:
- toolchain: '1.98.1'
+ toolchain: '1.99.0'
targets: ${{ matrix.target }}
- name: Add Rust Target
@@ -487,7 +487,7 @@ jobs:
- name: Add Rust Target
run: |
- rustup target add ${{ matrix.target }} --toolchain 1.98.1 || rustup target add ${{ matrix.target }}
+ rustup target add ${{ matrix.target }} --toolchain 1.99.0 || rustup target add ${{ matrix.target }}
rustup target list --installed
echo "Rust target ${{ matrix.target }} installed."
diff --git a/.tool-versions b/.tool-versions
index 62f095f23..7010529ea 100644
--- a/.tool-versions
+++ b/.tool-versions
@@ -1,3 +1,3 @@
nodejs 24.21.0
pnpm 12.8.1
-rust 1.98.1
+rust 1.99.0
diff --git a/Cargo.lock b/Cargo.lock
index 084a1954e..d6e551278 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -63,15 +63,15 @@ dependencies = [
[[package]]
name = "alloc-no-stdlib"
-version = "2.0.4"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a"
[[package]]
name = "alloc-stdlib"
-version = "0.2.4"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195"
+checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1"
dependencies = [
"alloc-no-stdlib",
]
@@ -376,13 +376,16 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "auto-launch"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471"
+checksum = "17918dba7ecf78b9a14507ec9f984e7977d13fad87dc86d61038980a45d128cf"
dependencies = [
- "dirs 4.0.0",
- "thiserror 1.0.69",
- "winreg 0.10.1",
+ "dirs 6.0.0",
+ "os_info",
+ "smappservice-rs",
+ "thiserror 2.0.20",
+ "windows-registry 0.6.1",
+ "windows-result 0.4.1",
]
[[package]]
@@ -742,9 +745,9 @@ dependencies = [
[[package]]
name = "brotli"
-version = "8.0.4"
+version = "9.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3"
+checksum = "f8b851b75c23ca7873623d612fe49bd1989aeb03d08fb9432187eb253d3d4c6b"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -753,9 +756,9 @@ dependencies = [
[[package]]
name = "brotli-decompressor"
-version = "5.0.3"
+version = "6.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583"
+checksum = "941cd9bd4ddab83cb46fa5a2d428f1c857b24ac78cb876cf7beb710840934bd7"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -905,12 +908,13 @@ dependencies = [
[[package]]
name = "cargo_toml"
-version = "0.22.3"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
+checksum = "82f4b26e751e711a5302649417f2da046dce6391b2ea30a4820f37462314f0b9"
dependencies = [
+ "semver 1.0.28",
"serde",
- "toml 0.9.12+spec-1.1.0",
+ "toml 1.1.6+spec-1.1.0",
]
[[package]]
@@ -948,13 +952,13 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
[[package]]
name = "cfb"
-version = "0.7.3"
+version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f"
+checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3"
dependencies = [
- "byteorder",
"fnv",
"uuid",
+ "web-time",
]
[[package]]
@@ -1691,9 +1695,9 @@ dependencies = [
[[package]]
name = "cssparser"
-version = "0.36.0"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2"
+checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98"
dependencies = [
"cssparser-macros",
"dtoa-short",
@@ -1704,29 +1708,19 @@ dependencies = [
[[package]]
name = "cssparser-macros"
-version = "0.6.1"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
+checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a"
dependencies = [
"quote",
- "syn 2.0.119",
+ "syn 3.0.5",
]
[[package]]
name = "ctor"
-version = "0.8.0"
+version = "1.0.13"
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"
+checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d"
[[package]]
name = "ctr"
@@ -1897,9 +1891,9 @@ dependencies = [
[[package]]
name = "devtools-core"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dedc37ac570aaedbe8b854392af558cafdb71c315aa13840c2ecd80ec11762de"
+checksum = "c53d416e473377276435d49d731a75d253b96ee4339831cd85653702b94d8298"
dependencies = [
"bytes",
"devtools-wire-format",
@@ -2096,9 +2090,9 @@ dependencies = [
[[package]]
name = "dom_query"
-version = "0.27.0"
+version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89"
+checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc"
dependencies = [
"bit-set",
"cssparser",
@@ -2139,21 +2133,6 @@ 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"
@@ -2924,7 +2903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c386b0a4a70cb2d39fffd74480f985b6f0bfbcb934b6a6b6b7e630e448f242e"
dependencies = [
"crossbeam-channel",
- "keyboard-types",
+ "keyboard-types 0.7.0",
"objc2",
"objc2-app-kit",
"once_cell",
@@ -3209,9 +3188,9 @@ dependencies = [
[[package]]
name = "html5ever"
-version = "0.38.0"
+version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2"
+checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8"
dependencies = [
"log",
"markup5ever",
@@ -3356,7 +3335,7 @@ dependencies = [
"tokio",
"tower-service",
"tracing",
- "windows-registry",
+ "windows-registry 0.5.3",
]
[[package]]
@@ -3605,9 +3584,9 @@ dependencies = [
[[package]]
name = "infer"
-version = "0.19.0"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7"
+checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4"
dependencies = [
"cfb",
]
@@ -3833,21 +3812,21 @@ dependencies = [
[[package]]
name = "json-patch"
-version = "3.0.1"
+version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08"
+checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72"
dependencies = [
"jsonptr",
"serde",
"serde_json",
- "thiserror 1.0.69",
+ "thiserror 2.0.20",
]
[[package]]
name = "jsonptr"
-version = "0.6.3"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70"
+checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe"
dependencies = [
"serde",
"serde_json",
@@ -3864,6 +3843,16 @@ dependencies = [
"unicode-segmentation",
]
+[[package]]
+name = "keyboard-types"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d"
+dependencies = [
+ "bitflags 2.13.2",
+ "serde",
+]
+
[[package]]
name = "kode-bridge"
version = "0.5.2"
@@ -3952,9 +3941,9 @@ checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c"
[[package]]
name = "libc"
-version = "0.2.189"
+version = "0.2.190"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
+checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78"
[[package]]
name = "libdbus-sys"
@@ -4097,9 +4086,9 @@ dependencies = [
[[package]]
name = "markup5ever"
-version = "0.38.0"
+version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862"
+checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de"
dependencies = [
"log",
"tendril",
@@ -4217,14 +4206,14 @@ dependencies = [
[[package]]
name = "muda"
-version = "0.19.3"
+version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878"
+checksum = "cca139e57da4383727f189e43e66e84fa372347027fc996f9f1a007ec0a37996"
dependencies = [
"crossbeam-channel",
"dpi",
"gtk",
- "keyboard-types",
+ "keyboard-types 0.8.3",
"objc2",
"objc2-app-kit",
"objc2-core-foundation",
@@ -4260,6 +4249,12 @@ dependencies = [
"thiserror 1.0.69",
]
+[[package]]
+name = "ndk-context"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+
[[package]]
name = "ndk-sys"
version = "0.6.0+11769913"
@@ -4319,6 +4314,18 @@ version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+[[package]]
+name = "nix"
+version = "0.31.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"
+dependencies = [
+ "bitflags 2.13.2",
+ "cfg-if",
+ "cfg_aliases",
+ "libc",
+]
+
[[package]]
name = "nohash-hasher"
version = "0.2.0"
@@ -4698,6 +4705,19 @@ dependencies = [
"objc2-core-foundation",
]
+[[package]]
+name = "objc2-service-management"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b213642d6959cc6023ceb1217aa595eaaf09b8094ce95127c103cab611fe65e8"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-security",
+]
+
[[package]]
name = "objc2-ui-kit"
version = "0.3.2"
@@ -4824,6 +4844,21 @@ dependencies = [
"pin-project-lite",
]
+[[package]]
+name = "os_info"
+version = "3.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf20a545b305cf1da722b236b5155c9bb35f1d5ceb28c048bd96ca842f41b5b"
+dependencies = [
+ "android_system_properties",
+ "log",
+ "nix",
+ "objc2",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "windows-sys 0.61.2",
+]
+
[[package]]
name = "os_pipe"
version = "1.2.3"
@@ -5875,9 +5910,9 @@ dependencies = [
[[package]]
name = "ringbuf"
-version = "0.4.8"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe47b720588c8702e34b5979cb3271a8b1842c7cb6f57408efa70c779363488c"
+checksum = "0b123165531e325df9079f56c036f2da4103a5d5abfef9e2fda4b9c34d1ef7aa"
dependencies = [
"crossbeam-utils",
"portable-atomic",
@@ -5898,9 +5933,9 @@ dependencies = [
[[package]]
name = "rust-i18n"
-version = "4.2.2"
+version = "4.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c43fd69c20da13756643a5bf51ae799965465c78e05c57a1242a736aaa56527"
+checksum = "8502e73e6461c738659455c5d2cf95bc132760a6f203c717e66ee72b78906d7f"
dependencies = [
"globwalk",
"regex",
@@ -5911,9 +5946,9 @@ dependencies = [
[[package]]
name = "rust-i18n-macro"
-version = "4.2.2"
+version = "4.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "086ec8a9eaa6afda33919b9bc1661c1f4e017c40e99bbd33ca98f6e1cb6ca91f"
+checksum = "d54a28dd9d46108d56b9f0c85b220908844233e561c03087890325104f90f2c6"
dependencies = [
"glob",
"proc-macro2",
@@ -5926,12 +5961,13 @@ dependencies = [
[[package]]
name = "rust-i18n-support"
-version = "4.2.2"
+version = "4.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac02dcb9a01ec145d0a5534ea9554a966050ca250b346bb2a9ab0fcdafab5979"
+checksum = "e806c2a9701cbd6043992cd935c30cb1fdb128fa15e7b506f3b46f97045737c0"
dependencies = [
"arc-swap",
"base62",
+ "foldhash 0.2.0",
"globwalk",
"itertools 0.11.0",
"normpath",
@@ -6215,9 +6251,9 @@ dependencies = [
[[package]]
name = "selectors"
-version = "0.36.1"
+version = "0.38.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c"
+checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d"
dependencies = [
"bitflags 2.13.2",
"cssparser",
@@ -6681,6 +6717,18 @@ version = "1.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
+[[package]]
+name = "smappservice-rs"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52703b97a53101cf5d4580e0737aaa634ce1fdcfc123c16b2a9658e358013488"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+ "objc2-service-management",
+ "thiserror 2.0.20",
+]
+
[[package]]
name = "smartstring"
version = "1.0.1"
@@ -6822,9 +6870,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "swift-rs"
-version = "1.0.7"
+version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
+checksum = "e45c444e496845d3f2a351146bff59aae4975b2280238df1dfaa0c7d1846f38e"
dependencies = [
"base64 0.21.7",
"serde",
@@ -6991,9 +7039,9 @@ checksum = "c0e973b34477b7823833469eb0f5a3a60370fef7a453e02d751b59180d0a5a05"
[[package]]
name = "tao"
-version = "0.35.3"
+version = "0.37.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9"
+checksum = "f37f381f4e048e6cdf038b5705f8cf14ad108279d46eb968140a7b291aba9400"
dependencies = [
"bitflags 2.13.2",
"block2",
@@ -7011,20 +7059,20 @@ dependencies = [
"libc",
"log",
"ndk",
+ "ndk-context",
"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 0.61.3",
- "windows-core 0.61.2",
+ "windows 0.62.2",
+ "windows-core 0.62.2",
"windows-version",
"x11-dl",
]
@@ -7071,14 +7119,14 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
[[package]]
name = "tauri"
-version = "2.11.6"
+version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fa5bacdb9bbad5954af3d1bd6cf6ae9192cab1b2e270f4a07f904610b9e85f4"
+checksum = "ed99ee9694a2deb776d91cae48ac7411ddfc89ecae2f9b5041111d8c88f2ace9"
dependencies = [
"anyhow",
"bytes",
"cookie",
- "dirs 6.0.0",
+ "dirs 7.0.0",
"dunce",
"embed_plist",
"getrandom 0.3.4",
@@ -7118,20 +7166,20 @@ dependencies = [
"tray-icon",
"url",
"webkit2gtk",
- "webview2-com",
+ "webview2-com 0.39.1",
"window-vibrancy",
- "windows 0.61.3",
+ "windows 0.62.2",
]
[[package]]
name = "tauri-build"
-version = "2.6.3"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632"
+checksum = "59563ca5b331fd97f27ee9672ec8d36d33bb3c9e2c9f6710a1a5687256052e45"
dependencies = [
"anyhow",
"cargo_toml",
- "dirs 6.0.0",
+ "dirs 7.0.0",
"glob",
"heck 0.5.0",
"json-patch",
@@ -7146,16 +7194,16 @@ dependencies = [
[[package]]
name = "tauri-codegen"
-version = "2.6.3"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5"
+checksum = "e50213e463086ecc283d7e9f51c30cc0fd304ad457425158018be26dbf0d0a80"
dependencies = [
"base64 0.22.1",
"brotli",
"ico",
"json-patch",
"plist",
- "png 0.17.16",
+ "png 0.18.1",
"proc-macro2",
"quote",
"semver 1.0.28",
@@ -7173,9 +7221,9 @@ dependencies = [
[[package]]
name = "tauri-macros"
-version = "2.6.3"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45"
+checksum = "8129fb43bb6e0d6b73ad3315cd172beaab17cd28899c594b1b32c80edbbfd99c"
dependencies = [
"heck 0.5.0",
"proc-macro2",
@@ -7187,9 +7235,9 @@ dependencies = [
[[package]]
name = "tauri-plugin"
-version = "2.6.3"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020"
+checksum = "1140cf34a3b3b836a13103dcab17f18831d5cc3534cbd435dc01a5c6daa65aa2"
dependencies = [
"anyhow",
"glob",
@@ -7203,9 +7251,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-autostart"
-version = "2.5.1"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "459383cebc193cdd03d1ba4acc40f2c408a7abce419d64bdcd2d745bc2886f70"
+checksum = "bce56ceb0a99b8ab5eebc977ba9ffc62391b862648cb9ab76fc8bc7231b8f7e2"
dependencies = [
"auto-launch",
"serde",
@@ -7230,9 +7278,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-clipboard-manager"
-version = "2.3.3"
+version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4136fb69d967753d000423d7e5f863f89bf949efbdfbecb43a580426a01a0194"
+checksum = "333d3b6beeb1c2c7fc040233d4ea7b6c03a9f8f039592b7400833c43fb5b568a"
dependencies = [
"arboard",
"log",
@@ -7245,9 +7293,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-deep-link"
-version = "2.4.10"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d489b8ecceae1cd09f6e1f7606f2095ac721cc8d54cf2f0e6bb377cc52cff6"
+checksum = "4ac7a92a46ab5c88f44532ca50906d6e448a948d4ddf8c5376ab125e3260f736"
dependencies = [
"dunce",
"plist",
@@ -7260,15 +7308,15 @@ dependencies = [
"thiserror 2.0.20",
"tracing",
"url",
- "windows-registry",
- "windows-result 0.3.4",
+ "windows-registry 0.6.1",
+ "windows-result 0.4.1",
]
[[package]]
name = "tauri-plugin-devtools"
-version = "2.2.1"
+version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ce9c0bcf4d9d8b2f77389563d95d577690d1453db00c7b67900110c927adef"
+checksum = "1acb4d1b8490ee79166b72c3f8c989e066650a11aa94dfd0d71fb05c61cdbed0"
dependencies = [
"async-stream",
"bytes",
@@ -7293,9 +7341,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-dialog"
-version = "2.7.3"
+version = "2.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61854a36651aa48381e5e209f69a01273b77f3f9f91f0c430b1b98d33bd47229"
+checksum = "daf9a5c92e39bdd84f22f6be9230e39d0c4e140345f71ffe6058dca4f71127cf"
dependencies = [
"log",
"raw-window-handle",
@@ -7311,9 +7359,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
-version = "2.5.2"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de22eef34fd78c0da050e748710edd50bf127e651d02ea1b2bfada1523cc5c51"
+checksum = "466eb32466fe5021b6728b06862f9ff14a9f7e1af890047654e03a96d7c0e1bb"
dependencies = [
"anyhow",
"dunce",
@@ -7335,9 +7383,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-global-shortcut"
-version = "2.3.2"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4dd9f4c5136c09cd962da0c86dc4accd4666db2ea591cf16e6597435843bd2b"
+checksum = "0bd2e1f725891a1613af8f25bf918ba3357654b0fd3f2d794c0ce76cbdd92ed2"
dependencies = [
"global-hotkey",
"log",
@@ -7350,9 +7398,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-http"
-version = "2.6.1"
+version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4c07d3be2c68e22e64012eb6c4ec969247e3800da26ef3f3856afbcd07a1ce6"
+checksum = "93e9d6b3319e101bc1be27cfa0fb4054d7784a12509c67ead0033b82180e5ed1"
dependencies = [
"bytes",
"cookie_store",
@@ -7369,7 +7417,7 @@ dependencies = [
"thiserror 2.0.20",
"tokio",
"url",
- "urlpattern",
+ "urlpattern 0.3.0",
]
[[package]]
@@ -7399,9 +7447,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-notification"
-version = "2.4.0"
+version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad2fd40946aef810c4be9fd33a2d1b9b397cb79042b2d21c81a0a8f204354fd1"
+checksum = "533770889abb60a0407d5a32096182f0e6463f5a3dfaa675be94580aa14070e1"
dependencies = [
"log",
"notify-rust",
@@ -7418,9 +7466,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-opener"
-version = "2.5.5"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60d60366174b745b4ef5824b8bbc1c457fd08f0ce101ff643c0a49181a9f4e91"
+checksum = "d39404b2572927e0d3ed30a7ca226037f7508d22e79c96ee6ef0d42b6a4b3345"
dependencies = [
"dunce",
"glob",
@@ -7434,15 +7482,15 @@ dependencies = [
"tauri-plugin",
"thiserror 2.0.20",
"url",
- "windows 0.61.3",
+ "windows 0.62.2",
"zbus",
]
[[package]]
name = "tauri-plugin-process"
-version = "2.3.1"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d55511a7bf6cd70c8767b02c97bf8134fa434daf3926cfc1be0a0f94132d165a"
+checksum = "74ae3d8549ae564c0397377373e262f340908eb23a5b9fbe03f2a00007dc0038"
dependencies = [
"tauri",
"tauri-plugin",
@@ -7450,9 +7498,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-shell"
-version = "2.3.6"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8548af174c5516e4f71f142acea4d02e00316296ea9aafa58798851481003e3c"
+checksum = "094bdbc47e5efe36544ba21b3a53ab5c724150236cf55e6c9be46191deb6eab6"
dependencies = [
"encoding_rs",
"log",
@@ -7471,12 +7519,12 @@ dependencies = [
[[package]]
name = "tauri-plugin-updater"
-version = "2.12.0"
+version = "2.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5cad8ed5948d988e1018ecd31e27cacedbf72ce3fb972940c3e4bf51639e4b"
+checksum = "3cb0b2ea3e85ca287990d3859a29cc5cb18024240fd78f62e027fb7963670f18"
dependencies = [
"base64 0.22.1",
- "dirs 6.0.0",
+ "dirs 7.0.0",
"flate2",
"futures-util",
"http",
@@ -7498,7 +7546,7 @@ dependencies = [
"time",
"tokio",
"url",
- "windows-sys 0.60.2",
+ "windows-sys 0.61.2",
"zip 4.6.1",
]
@@ -7530,16 +7578,16 @@ dependencies = [
"tracing",
"uuid",
"webkit2gtk",
- "webview2-com",
+ "webview2-com 0.38.2",
"windows 0.61.3",
"windows-core 0.61.2",
]
[[package]]
name = "tauri-plugin-window-state"
-version = "2.4.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73736611e14142408d15353e21e3cca2f12a3cfb523ad0ce85999b6d2ef1a704"
+checksum = "5d6815cab7b212f9cfe16a9d79d8d22f9e14159e4a9460f7dec1467167a008e3"
dependencies = [
"bitflags 2.13.2",
"log",
@@ -7552,9 +7600,9 @@ dependencies = [
[[package]]
name = "tauri-runtime"
-version = "2.11.3"
+version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8"
+checksum = "c2a57a2a9b8c8b7fc00d35b510fe808ded7f9f1b44fc1cdda6aee38632ea5413"
dependencies = [
"cookie",
"dpi",
@@ -7571,15 +7619,15 @@ dependencies = [
"thiserror 2.0.20",
"url",
"webkit2gtk",
- "webview2-com",
- "windows 0.61.3",
+ "webview2-com 0.39.1",
+ "windows 0.62.2",
]
[[package]]
name = "tauri-runtime-wry"
-version = "2.11.4"
+version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f"
+checksum = "7f9e7e0c9f80a5130773cfabb6df4dc924518fb1b2c923726966804634b57d22"
dependencies = [
"gtk",
"http",
@@ -7597,16 +7645,16 @@ dependencies = [
"tracing",
"url",
"webkit2gtk",
- "webview2-com",
- "windows 0.61.3",
+ "webview2-com 0.39.1",
+ "windows 0.62.2",
"wry",
]
[[package]]
name = "tauri-utils"
-version = "2.9.3"
+version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887"
+checksum = "2ff55a614843b9a3f010f211df637c94df2607175b8d0f6e0f4a7c19e18621ee"
dependencies = [
"anyhow",
"brotli",
@@ -7635,7 +7683,7 @@ dependencies = [
"thiserror 2.0.20",
"toml 1.1.6+spec-1.1.0",
"url",
- "urlpattern",
+ "urlpattern 0.6.0",
"uuid",
"walkdir",
]
@@ -7925,9 +7973,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.53.1"
+version = "1.53.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"
+checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044"
dependencies = [
"bytes",
"libc",
@@ -7953,9 +8001,9 @@ dependencies = [
[[package]]
name = "tokio-rustls"
-version = "0.26.5"
+version = "0.26.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67"
+checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db"
dependencies = [
"rustls",
"tokio",
@@ -8012,21 +8060,6 @@ dependencies = [
"toml_edit 0.22.27",
]
-[[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.6+spec-1.1.0"
@@ -8051,15 +8084,6 @@ 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"
@@ -8345,11 +8369,12 @@ dependencies = [
[[package]]
name = "tray-icon"
-version = "0.24.1"
-source = "git+https://github.com/Tunglies/tray-icon.git?branch=fix%2Fmacos-27-click-reentrancy#5750c67d02d32f2af100e120ad665959d4268cef"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b9c52859a94554803ccd4a24b98f74148ebc73b90676d783f3490b1bff9d72"
dependencies = [
"crossbeam-channel",
- "dirs 6.0.0",
+ "dirs 7.0.0",
"libappindicator",
"muda",
"objc2",
@@ -8579,6 +8604,18 @@ dependencies = [
"url",
]
+[[package]]
+name = "urlpattern"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df16f50ef4cc145211879a3867ba757076b25dfee812040dcb0658bd9ae7904b"
+dependencies = [
+ "icu_properties",
+ "regex",
+ "serde",
+ "url",
+]
+
[[package]]
name = "utf-8"
version = "0.7.6"
@@ -8965,13 +9002,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a"
dependencies = [
"webview2-com-macros",
- "webview2-com-sys",
+ "webview2-com-sys 0.38.2",
"windows 0.61.3",
"windows-core 0.61.2",
"windows-implement",
"windows-interface",
]
+[[package]]
+name = "webview2-com"
+version = "0.39.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f89fca7a704cee10dcb3654c1dbb8941d1783132f1917358af75bec37a7d7e6"
+dependencies = [
+ "webview2-com-macros",
+ "webview2-com-sys 0.39.1",
+ "windows 0.62.2",
+ "windows-core 0.62.2",
+]
+
[[package]]
name = "webview2-com-macros"
version = "0.8.1"
@@ -8994,6 +9043,17 @@ dependencies = [
"windows-core 0.61.2",
]
+[[package]]
+name = "webview2-com-sys"
+version = "0.39.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3a07132775117d6065853d9d1178157b8c90e228de47129d6bce2c7edebedfb"
+dependencies = [
+ "thiserror 2.0.20",
+ "windows 0.62.2",
+ "windows-core 0.62.2",
+]
+
[[package]]
name = "weezl"
version = "0.1.12"
@@ -9060,16 +9120,17 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "window-vibrancy"
-version = "0.6.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
+checksum = "111e51caca442cafd9bab396628ac4d814880eaea4e63dfd76a12e9f342b5580"
dependencies = [
"objc2",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation",
+ "objc2-quartz-core",
"raw-window-handle",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.2",
"windows-version",
]
@@ -9229,6 +9290,17 @@ dependencies = [
"windows-strings 0.4.2",
]
+[[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"
@@ -9627,15 +9699,6 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "winreg"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
-dependencies = [
- "winapi",
-]
-
[[package]]
name = "winreg"
version = "0.55.0"
@@ -9694,15 +9757,15 @@ checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
[[package]]
name = "wry"
-version = "0.55.1"
+version = "0.57.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514"
+checksum = "a819957a01b3119af85e638a38d242af76dbc87d130dca67bfd0441072e21ff0"
dependencies = [
"base64 0.22.1",
"block2",
"cookie",
"crossbeam-channel",
- "dirs 6.0.0",
+ "dirs 7.0.0",
"dom_query",
"dpi",
"dunce",
@@ -9730,9 +9793,9 @@ dependencies = [
"url",
"webkit2gtk",
"webkit2gtk-sys",
- "webview2-com",
- "windows 0.61.3",
- "windows-core 0.61.2",
+ "webview2-com 0.39.1",
+ "windows 0.62.2",
+ "windows-core 0.62.2",
"windows-version",
"x11-dl",
]
@@ -10130,3 +10193,8 @@ dependencies = [
"syn 3.0.5",
"winnow 1.0.4",
]
+
+[[patch.unused]]
+name = "tray-icon"
+version = "0.24.1"
+source = "git+https://github.com/Tunglies/tray-icon.git?branch=fix%2Fmacos-27-click-reentrancy#5750c67d02d32f2af100e120ad665959d4268cef"
diff --git a/Cargo.toml b/Cargo.toml
index dc787bf97..faa6e77b9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -63,13 +63,13 @@ tracing-estuary = { git = "https://github.com/Tunglies/tracing-estuary.git", bra
tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" }
tracing = "0.1.44"
-tauri = { version = "2.11.6" }
-tauri-plugin-clipboard-manager = "2.3.3"
+tauri = { version = "2.12.1" }
+tauri-plugin-clipboard-manager = "2.4.1"
parking_lot = { version = "0.12.5", features = ["hardware-lock-elision"] }
anyhow = "1.0.104"
chrono = "0.4.45"
criterion = { version = "0.8.2", features = ["async_tokio"] }
-tokio = { version = "1.53.1", features = [
+tokio = { version = "1.53.2", features = [
"rt-multi-thread",
"macros",
"time",
diff --git a/Changelog.md b/Changelog.md
index 7b3e8cd95..563cbc13d 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -4,10 +4,12 @@
🐞 修复问题
- 修复从开始菜单再次打开应用后,窗口反复弹出并提示启动失败的问题
+- 修复多个代理集合包含同名节点时,代理组中的节点变灰并显示 ambiguous、无法选择的问题
**🖥️ Windows**
- 修复 Windows 升级后因文件权限异常无法启动、需要手动清理配置的问题
+- 修复 Windows 服务启动类型被改为手动后,软件启动卡住约两分钟的问题,并提供一键修复
diff --git a/crates/clash-verge-i18n/Cargo.toml b/crates/clash-verge-i18n/Cargo.toml
index 3ba34eaf0..03bea2357 100644
--- a/crates/clash-verge-i18n/Cargo.toml
+++ b/crates/clash-verge-i18n/Cargo.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2024"
[dependencies]
-rust-i18n = "4.2.2"
+rust-i18n = "4.2.4"
sys-locale = "0.3.2"
[lints]
diff --git a/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml b/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml
index c4e90b818..1536d7096 100644
--- a/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml
+++ b/crates/tauri-plugin-clash-verge-sysinfo/Cargo.toml
@@ -14,7 +14,7 @@ serde = { workspace = true, features = ["derive"] }
sysinfo = { version = "0.39.6", features = ["network", "system"] }
[target.'cfg(not(windows))'.dependencies]
-libc = "0.2.189"
+libc = "0.2.190"
[target.'cfg(windows)'.dependencies]
deelevate = { workspace = true }
diff --git a/package.json b/package.json
index 47217b9be..61cc246f0 100644
--- a/package.json
+++ b/package.json
@@ -52,13 +52,13 @@
"@mui/icons-material": "^9.4.0",
"@mui/material": "^9.4.0",
"@tanstack/react-virtual": "^3.14.13",
- "@tauri-apps/api": "2.11.1",
- "@tauri-apps/plugin-clipboard-manager": "^2.3.3",
- "@tauri-apps/plugin-dialog": "^2.7.3",
- "@tauri-apps/plugin-fs": "^2.5.2",
- "@tauri-apps/plugin-http": "~2.6.1",
- "@tauri-apps/plugin-opener": "2.5.5",
- "@tauri-apps/plugin-updater": "2.12.0",
+ "@tauri-apps/api": "2.12.1",
+ "@tauri-apps/plugin-clipboard-manager": "2.4.0",
+ "@tauri-apps/plugin-dialog": "2.8.0",
+ "@tauri-apps/plugin-fs": "2.6.0",
+ "@tauri-apps/plugin-http": "2.8.0",
+ "@tauri-apps/plugin-opener": "2.7.0",
+ "@tauri-apps/plugin-updater": "2.13.1",
"ahooks": "^3.10.0",
"cidr-block": "^2.3.0",
"compare-versions": "^6.1.1",
@@ -69,15 +69,15 @@
"js-yaml": "^5.4.2",
"lodash-es": "^4.18.1",
"meta-json-schema": "^1.19.31",
- "monaco-editor": "^0.56.0",
+ "monaco-editor": "^0.57.0",
"monaco-yaml": "^5.5.1",
"nanoid": "^6.0.1",
"qrcode.react": "^4.2.0",
"react": "19.3.0",
"react-dom": "19.3.0",
- "react-error-boundary": "6.1.5",
+ "react-error-boundary": "6.1.6",
"react-hook-form": "^7.88.0",
- "react-i18next": "17.0.14",
+ "react-i18next": "17.0.15",
"react-markdown": "10.1.0",
"react-router": "^8.4.0",
"rehype-raw": "^7.0.0",
@@ -93,7 +93,7 @@
"@biomejs/biome": "^2.5.14",
"@eslint-react/eslint-plugin": "^5.20.5",
"@eslint/js": "^10.0.1",
- "@tauri-apps/cli": "2.11.4",
+ "@tauri-apps/cli": "2.12.1",
"@types/lodash-es": "^4.17.12",
"@types/node": "^24.13.6",
"@types/react": "19.3.0",
@@ -121,7 +121,7 @@
"https-proxy-agent": "^9.1.0",
"husky": "^9.1.7",
"jiti": "^2.7.0",
- "knip": "6.35.1",
+ "knip": "6.39.0",
"lint-staged": "^17.5.1",
"sass": "^1.104.1",
"tar": "^7.5.22",
@@ -131,8 +131,8 @@
"vite": "^8.3.0",
"vite-plugin-svgr": "^5.2.0",
"vitest": "^5.0.1",
- "webdriverio": "9.31.9",
- "ws": "8.21.3"
+ "webdriverio": "9.32.0",
+ "ws": "8.22.0"
},
"lint-staged": {
"*.{ts,tsx,js,mjs}": [
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 34b8eadc7..b70021bf5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -189,7 +189,7 @@ importers:
version: 3.4.0
'@monaco-editor/react':
specifier: ^4.7.0
- version: 4.7.0(monaco-editor@0.56.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ version: 4.7.0(monaco-editor@0.57.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
'@mui/icons-material':
specifier: ^9.4.0
version: 9.4.0(@mui/material@9.4.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.0)(supports-color@7.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.0)(supports-color@7.2.0))(@types/react@19.3.0)(react@19.3.0)(supports-color@7.2.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/react@19.3.0)(react@19.3.0)
@@ -200,26 +200,26 @@ importers:
specifier: ^3.14.13
version: 3.14.13(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
'@tauri-apps/api':
- specifier: 2.11.1
- version: 2.11.1
+ specifier: 2.12.1
+ version: 2.12.1
'@tauri-apps/plugin-clipboard-manager':
- specifier: ^2.3.3
- version: 2.3.3
+ specifier: 2.4.0
+ version: 2.4.0
'@tauri-apps/plugin-dialog':
- specifier: ^2.7.3
- version: 2.7.3
+ specifier: 2.8.0
+ version: 2.8.0
'@tauri-apps/plugin-fs':
- specifier: ^2.5.2
- version: 2.5.2
+ specifier: 2.6.0
+ version: 2.6.0
'@tauri-apps/plugin-http':
- specifier: ~2.6.1
- version: 2.6.1
+ specifier: 2.8.0
+ version: 2.8.0
'@tauri-apps/plugin-opener':
- specifier: 2.5.5
- version: 2.5.5
+ specifier: 2.7.0
+ version: 2.7.0
'@tauri-apps/plugin-updater':
- specifier: 2.12.0
- version: 2.12.0
+ specifier: 2.13.1
+ version: 2.13.1
ahooks:
specifier: ^3.10.0
version: 3.10.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
@@ -251,11 +251,11 @@ importers:
specifier: ^1.19.31
version: 1.19.31
monaco-editor:
- specifier: ^0.56.0
- version: 0.56.0
+ specifier: ^0.57.0
+ version: 0.57.0
monaco-yaml:
specifier: ^5.5.1
- version: 5.5.1(monaco-editor@0.56.0)
+ version: 5.5.1(monaco-editor@0.57.0)
nanoid:
specifier: ^6.0.1
version: 6.0.1
@@ -269,14 +269,14 @@ importers:
specifier: 19.3.0
version: 19.3.0(react@19.3.0)
react-error-boundary:
- specifier: 6.1.5
- version: 6.1.5(@types/react@19.3.0)(react@19.3.0)
+ specifier: 6.1.6
+ version: 6.1.6(@types/react@19.3.0)(react@19.3.0)
react-hook-form:
specifier: ^7.88.0
version: 7.88.0(react@19.3.0)
react-i18next:
- specifier: 17.0.14
- version: 17.0.14(i18next@26.4.2(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3)
+ specifier: 17.0.15
+ version: 17.0.15(i18next@26.4.2(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3)
react-markdown:
specifier: 10.1.0
version: 10.1.0(@types/react@19.3.0)(react@19.3.0)(supports-color@7.2.0)
@@ -318,8 +318,8 @@ importers:
specifier: ^10.0.1
version: 10.0.1(eslint@10.11.0(jiti@2.7.0)(supports-color@7.2.0))
'@tauri-apps/cli':
- specifier: 2.11.4
- version: 2.11.4
+ specifier: 2.12.1
+ version: 2.12.1
'@types/lodash-es':
specifier: ^4.17.12
version: 4.17.12
@@ -343,7 +343,7 @@ importers:
version: 6.1.1(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.104.1)(terser@5.51.2)(yaml@2.9.1))
'@wdio/tauri-service':
specifier: 1.4.0
- version: 1.4.0(expect-webdriverio@5.7.0)(supports-color@7.2.0)(webdriverio@9.31.9(supports-color@7.2.0))
+ version: 1.4.0(expect-webdriverio@5.7.0)(supports-color@7.2.0)(webdriverio@9.32.0(supports-color@7.2.0))
adm-zip:
specifier: ^0.6.1
version: 0.6.1
@@ -402,8 +402,8 @@ importers:
specifier: ^2.7.0
version: 2.7.0
knip:
- specifier: 6.35.1
- version: 6.35.1
+ specifier: 6.39.0
+ version: 6.39.0
lint-staged:
specifier: ^17.5.1
version: 17.5.1
@@ -432,11 +432,11 @@ importers:
specifier: ^5.0.1
version: 5.0.1(@types/node@24.13.6)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.104.1)(terser@5.51.2)(yaml@2.9.1))
webdriverio:
- specifier: 9.31.9
- version: 9.31.9(supports-color@7.2.0)
+ specifier: 9.32.0
+ version: 9.32.0(supports-color@7.2.0)
ws:
- specifier: 8.21.3
- version: 8.21.3
+ specifier: 8.22.0
+ version: 8.22.0
packages:
@@ -1599,131 +1599,128 @@ packages:
'@octokit/types@18.0.0':
resolution: {integrity: sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==}
- '@oxc-parser/binding-android-arm-eabi@0.148.0':
- resolution: {integrity: sha512-pHASv9g5pASxb7akHERZNSkrEqPhFaUix98o7d9hbTpolnnFWl7UiRrcMhCsV1+iVO4/cJwKsbKRJTFNs2tdBQ==}
+ '@oxc-parser/binding-android-arm-eabi@0.150.0':
+ resolution: {integrity: sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@oxc-parser/binding-android-arm64@0.148.0':
- resolution: {integrity: sha512-sg/6Ez0KdAygsu0POELux9wN1Po2CP93WY8eNl4DBKIGprsd4QSHBXOb471Pu9i2OCD5sLkISSb2agZEhVn2Zw==}
+ '@oxc-parser/binding-android-arm64@0.150.0':
+ resolution: {integrity: sha512-B6ofpoFiAUwIZ0MJ2IgHPvZK8FAtL4qzSZRwOkAKIfxEobE1mQC8nDdiFZj7pUaJiVUVCsfkMsBJKedzO8rZvA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@oxc-parser/binding-darwin-arm64@0.148.0':
- resolution: {integrity: sha512-yiSJmzGUvCUaJT8X3j40gVcX+ckuHQMuiOtF8DvzTs5+JtB/7XuHFPp4M+vv5u+HlBtDUd4Ks5pyHpWz8mfnkg==}
+ '@oxc-parser/binding-darwin-arm64@0.150.0':
+ resolution: {integrity: sha512-J+9IHKzx/bSz1JetOfD4zKXSK9sOm4/a7+0qomJODcTL6JsRXGeV/ZdkAPSIDydfFmWzYCraMlQEosSZEyBYkQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@oxc-parser/binding-darwin-x64@0.148.0':
- resolution: {integrity: sha512-6ZeklaamrMy4H2JmhvcJg6iip59tYILtuLaILxyAHT3l5FDxnI5ihVievAft5ZmAbqtlWHErOi1OpJK8gy1wcA==}
+ '@oxc-parser/binding-darwin-x64@0.150.0':
+ resolution: {integrity: sha512-v6IPfcAcSYrBWXV5Tce1DmxDMXLhEYpIIWiRFPJopgCVscZdLaV4MRQOUxvL3usQlw+yrwYOjBFB9IwBx+jUiQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@oxc-parser/binding-freebsd-x64@0.148.0':
- resolution: {integrity: sha512-vFsPx+a/qFECPnz/H8nC6x6MDvnWscLTCo/5muojEF54ERUq1kdgbvnWo95YnkhjF9sTIcG/uDxQBh1gffaufQ==}
+ '@oxc-parser/binding-freebsd-x64@0.150.0':
+ resolution: {integrity: sha512-AoR/4jD02HET0KO0yNT4nbTE+XJUxiO9jB1X/ycEjUE3WrIJ3IjV/Vf+gskhWLcqqeXfvNnkDtBR7epllAm88A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@oxc-parser/binding-linux-arm-gnueabihf@0.148.0':
- resolution: {integrity: sha512-eOr3M+6iGbbxNL4PSS0VtsyQ2eOUxSBh00BqO22SbolDimPSYsBuLr/LCrZBkiqW2BoabhR6V4R8jrRAay7hjg==}
+ '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0':
+ resolution: {integrity: sha512-A/hycCFjLUrCmLoL5O/vBp40ohlaXO1Ta3v5hqYZxicYFs129wZmgZJggcW4mYGYbZebQLhup+N8JjeQl8qwyw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@oxc-parser/binding-linux-arm-musleabihf@0.148.0':
- resolution: {integrity: sha512-58ZKDw0mQRbCNfrd2IDyV4o8T7enzGERJn41BH2tjrZVGyiKiFzcfDicuB7Zcpb/1xIOrObovr8Dja6lZi8dLw==}
+ '@oxc-parser/binding-linux-arm-musleabihf@0.150.0':
+ resolution: {integrity: sha512-pbqahg1Pkz7J4RKmXm30s/iQu99hv64ayXCu8P4p75HcEH5azOdR4eGqiB6lFGkFR3mMpzaYsSKLkS8oJbjmeQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@oxc-parser/binding-linux-arm64-gnu@0.148.0':
- resolution: {integrity: sha512-Fnu95O4eZ5i++GPvIzBEZ8y4ddTLR+D9paYa8JRaRk6ZK7nHQiWP5xtrhcPQsXqgat1d7sU/d5rbbI0p1FTHSQ==}
+ '@oxc-parser/binding-linux-arm64-gnu@0.150.0':
+ resolution: {integrity: sha512-HV11aRbBQGwqv8bEo+K/6qr88uB4fEe1mhXncMhlVCrj+WpBSraxrUzHaPVmeQRU6x6x8v/3DuCbbo93rpp+fw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@oxc-parser/binding-linux-arm64-musl@0.148.0':
- resolution: {integrity: sha512-3CQy/BMdx7N7H3qrcPxUL+a2CwUZodUcf6oq8iJuNZ9C6Ol1aq3mcWzsgySJ7CHFLvpX21ZDPp1r1X0QLbu/AQ==}
+ '@oxc-parser/binding-linux-arm64-musl@0.150.0':
+ resolution: {integrity: sha512-k6pVkJqALwtEuP4zukVhGRhdIy4+ofChUIUUsAHHyqDZlNsknmel3JjbggrJiWGaes6h/dIcWmEXsKW4SmK9oQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@oxc-parser/binding-linux-ppc64-gnu@0.148.0':
- resolution: {integrity: sha512-9LkaYvfiF8hMOw900csAvkf1oxE8XlmMeGowu5BcastSSwV8mKvKRMNU7HsV+ycyj1dQD8pX5qgOw8ja6SJacg==}
+ '@oxc-parser/binding-linux-ppc64-gnu@0.150.0':
+ resolution: {integrity: sha512-tEFg39mw/rHO5n8GK2DR4ZMFfsPQZtnQIPbsIpjoQRomJc/2tRfsCSmCT6gNit+NZGoeJG5aH9ATDH5bf0WnoQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@oxc-parser/binding-linux-riscv64-gnu@0.148.0':
- resolution: {integrity: sha512-2GBiM9h26dR4WJfhoMvnFMnFLf7m/kYs4UMqjvrOfQG4BV1nuTJDH22Zc2MQr3INZF7nSKYQ6xlhD3hQ7A6gug==}
+ '@oxc-parser/binding-linux-riscv64-gnu@0.150.0':
+ resolution: {integrity: sha512-0JO7IFkoek6HqV589Menx3hJySNXi6quRhO4tq2P7kpEHKEXoDATnoPVUpn5B7gDH2KLkdo751N0uIrGJFCTCw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@oxc-parser/binding-linux-riscv64-musl@0.148.0':
- resolution: {integrity: sha512-uPqZexvKJmEgq4mAu36qe2xTfXZE7oyik1R7KtZ5tl8qKlq1U1fIqTFRUEBZqRGvforoTrGIpatRzcoPKO66RA==}
+ '@oxc-parser/binding-linux-riscv64-musl@0.150.0':
+ resolution: {integrity: sha512-7XPzREnyAS5wHU9aB+49Uaqgoo1gVCklHc3DRlc3fJy2tXD/eAJFN1QFz/crj+Ulup5P1+axNREF+/RGaB/IRA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [musl]
- '@oxc-parser/binding-linux-s390x-gnu@0.148.0':
- resolution: {integrity: sha512-9oUHvnTbp7ZraFsTC8PN6XhdhPSSxZumYvixWl7Smi353gEULvK6yV0sXNVrdFMHQeaDKFCi8TgDhNK7/A+Y+Q==}
+ '@oxc-parser/binding-linux-s390x-gnu@0.150.0':
+ resolution: {integrity: sha512-7n7ZxcbRWDFaTdyj8M8p0O9OfzoMKm8O6syBAIgcSutbOALq0Bb9G52Me+XH0anMLZV+NgXc726gqgG2q39vcQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@oxc-parser/binding-linux-x64-gnu@0.148.0':
- resolution: {integrity: sha512-2qhDSJwKzbSZzF7lDqqk8sr/yXsmwr3PeUa4/nazIF+zFAYz1gVPEfC34GQtGxzJUUmklaYAL63368LEfrMeyw==}
+ '@oxc-parser/binding-linux-x64-gnu@0.150.0':
+ resolution: {integrity: sha512-Vx0GSA9ZCRTUiczoEQnIIyXkMvtEY8uc6IiwLQtMe5ci2sXPqjrry0Ek5fsPP1k2kCzkML3ow9UOOEgnEDi7Bw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@oxc-parser/binding-linux-x64-musl@0.148.0':
- resolution: {integrity: sha512-qQoPDZUFV0bh9xA09XydmkjMBpgc1ukJuhMvzQ9QeVmFaHTS9W5TE5CoLmSl3QQyUP9OuHO3x/WPZTIIZPWR3Q==}
+ '@oxc-parser/binding-linux-x64-musl@0.150.0':
+ resolution: {integrity: sha512-ii4/9m3viDLssMnfXU7/Pni/3nYplApuGayceX4qsVGaqqQJCx3tHIH9M/HWIeSty5i8LjS21zPYT6lVIkwLxw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@oxc-parser/binding-openharmony-arm64@0.148.0':
- resolution: {integrity: sha512-1UGbaQWEXUCLqAmaR5kwRDjx/R4S5LQKZkM9CHmaHkuKhriOF32aRLfS0jCRNE2yGQJLMEA1z9UucbBVqjXnDw==}
+ '@oxc-parser/binding-openharmony-arm64@0.150.0':
+ resolution: {integrity: sha512-ZtoxX5rez36ZWkwtiEhjkCPnlTPoQ2I7lIL0IYZ1yjxMYohbvoOjBmUIZzrf9W/HouONq0omIfTeCWEY+R380w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@oxc-parser/binding-win32-arm64-msvc@0.148.0':
- resolution: {integrity: sha512-pWKdzRDNG2+NK4h/V6U/CYERcfYD6u28h5IB/VJVsrZaD3muvE58tUj22lieL5vLZ+XFi1GPv9YXckZbJZ9BLA==}
+ '@oxc-parser/binding-win32-arm64-msvc@0.150.0':
+ resolution: {integrity: sha512-VqeRb5JX/bKYBrff7TUDvJyKY0914UzuCkuXIGxJS4FUmvMNfqkCbc7Sq90iMz9DlmAtlggwaBYQ9eg3h3ltiw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@oxc-parser/binding-win32-ia32-msvc@0.148.0':
- resolution: {integrity: sha512-i3p4x+mvwtjcE1J5HM6V7ggsbXiznExN/4MkNyOy3dfXrVV3bnkSfmZxvo6/84qCVX4ShkpNE1SKt9biIF31GQ==}
+ '@oxc-parser/binding-win32-ia32-msvc@0.150.0':
+ resolution: {integrity: sha512-EPqJfeZ4Pgg2BJSsCV8GozxV0FDltRzpVtGVa1r2noJu1iu+opOw3gtBWXwIo9odCT/MdFfyHxdy0/CRqs3OqA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
- '@oxc-parser/binding-win32-x64-msvc@0.148.0':
- resolution: {integrity: sha512-Ye6vB7VQulghWYkYkECOBYFRVEizz4XyRTUAv+t8BuyurhKU7uD0P9eowL+mKG5Mf8MSYx+DI3Cm8SKZvYG7bQ==}
+ '@oxc-parser/binding-win32-x64-msvc@0.150.0':
+ resolution: {integrity: sha512-n5YMzbqwPQqozbkrexi0lNZrUz5cnPHalYpFWe6Dau7AmKIWNo+y24IwzDuZEQtEdUHuKhXmMMih/MPjOI+CMw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- '@oxc-project/types@0.148.0':
- resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==}
-
'@oxc-project/types@0.150.0':
resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==}
@@ -2121,102 +2118,102 @@ packages:
'@tanstack/virtual-core@3.17.11':
resolution: {integrity: sha512-+ILjvtHup6Y2hzQ6YzwMgX1Q+oQpxEGOXCEsCNaPoIP0VxMbizIBTmYTDtkerkIQS8/CbP1BRuyt8V/8BCsy1g==}
- '@tauri-apps/api@2.11.1':
- resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==}
+ '@tauri-apps/api@2.12.1':
+ resolution: {integrity: sha512-DeyFHa3wynpyoqTDikDEDGTJIq4LQ5USfolQGRmGIWT6JMADyxZBTDa5cAdT3tDg73rUXufPaCwN7aXBos4OnQ==}
- '@tauri-apps/cli-darwin-arm64@2.11.4':
- resolution: {integrity: sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==}
+ '@tauri-apps/cli-darwin-arm64@2.12.1':
+ resolution: {integrity: sha512-8bMnbpJ2jKO/ufrOPL65EMHC3ptw7fzeraoQkwibyfGLqIl+UCWsC0152kmNbW6r9NvVQduXqAZF5mH1QgTWhw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@tauri-apps/cli-darwin-x64@2.11.4':
- resolution: {integrity: sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==}
+ '@tauri-apps/cli-darwin-x64@2.12.1':
+ resolution: {integrity: sha512-G+2qte8GNqNlEZ9ftd21rbu/APVkl3r/nzNDI7LVxEoqJWVNe9GbEgQUMH1r4PHT20Z2UxR3KjCkltIb0e/Wjg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4':
- resolution: {integrity: sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==}
+ '@tauri-apps/cli-linux-arm-gnueabihf@2.12.1':
+ resolution: {integrity: sha512-5b3n4DaTW+A1Zntnh4Yn44VyLrlPEpB8kMOBRfWkzNnzolBk+AYhKIfKjCLmoC8Mob3ETodxAEOMkE2YPKEWzQ==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@tauri-apps/cli-linux-arm64-gnu@2.11.4':
- resolution: {integrity: sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==}
+ '@tauri-apps/cli-linux-arm64-gnu@2.12.1':
+ resolution: {integrity: sha512-APArHhDu+8pXSCkCQmvaz1nD3d8WTmlCoSS/oG475TJ6AATBvyQOAmf5qELgsQ4s2+8MOsop0Zd699RKELF1Cw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@tauri-apps/cli-linux-arm64-musl@2.11.4':
- resolution: {integrity: sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==}
+ '@tauri-apps/cli-linux-arm64-musl@2.12.1':
+ resolution: {integrity: sha512-JaCxcLoV0oGtllVkLr4UAHWG/wTfkEunnUqnsEsGYOp0VRxnUwHg63wFBD0jU2ul5eFfSLIDS4RF2gfzsSo5Jg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@tauri-apps/cli-linux-riscv64-gnu@2.11.4':
- resolution: {integrity: sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==}
+ '@tauri-apps/cli-linux-riscv64-gnu@2.12.1':
+ resolution: {integrity: sha512-K5+VXM7+SGVDwZleA2+lMgvbTVuA5e1tkiVEawu1Yxj26ZyEfO8h8xTC1rBdRX2xgJDSwCk6vPUBCS6i+Z5slQ==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@tauri-apps/cli-linux-x64-gnu@2.11.4':
- resolution: {integrity: sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==}
+ '@tauri-apps/cli-linux-x64-gnu@2.12.1':
+ resolution: {integrity: sha512-Z1QGPr49HJZMktu+Spu6Q1b/f9ANadXvqZZZt2645ua1x1ev6prOgp85eiGv2jRzohFEMLo6aJyaLjLUX5KIvA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@tauri-apps/cli-linux-x64-musl@2.11.4':
- resolution: {integrity: sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==}
+ '@tauri-apps/cli-linux-x64-musl@2.12.1':
+ resolution: {integrity: sha512-nHuEhRPOMSJ/8RRhtMRxB9B9lVr7xxpe4DapBz8x1GIau3vdzjHHJ1hAfmw+PyayPLZ6XoaVIHPgI17rX6ii8w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@tauri-apps/cli-win32-arm64-msvc@2.11.4':
- resolution: {integrity: sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==}
+ '@tauri-apps/cli-win32-arm64-msvc@2.12.1':
+ resolution: {integrity: sha512-I0oPk2uGh86R8dAs2X5OxSP+/GqSc8jh1Px3l8EqrocSNivsRHDTh2k3PVOqdv163dlV6PIVvmhZAbH/lPfZrA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@tauri-apps/cli-win32-ia32-msvc@2.11.4':
- resolution: {integrity: sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==}
+ '@tauri-apps/cli-win32-ia32-msvc@2.12.1':
+ resolution: {integrity: sha512-baNZRBfepAJ5qNFRMwzgBk94xQmkcmTZrNDjZjnzrq2vAaTC3NAhallb/zo3hyoCGQlMS13sdovktrg46NZz6Q==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
- '@tauri-apps/cli-win32-x64-msvc@2.11.4':
- resolution: {integrity: sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==}
+ '@tauri-apps/cli-win32-x64-msvc@2.12.1':
+ resolution: {integrity: sha512-dIFaKslrzcbesb+bBh+E1R9km241pHyj32w6D9FPtvQeYpRUFbiCLEa/2S+S0UnIytfxepp4P+X8IerGqnXeYg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@tauri-apps/cli@2.11.4':
- resolution: {integrity: sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==}
+ '@tauri-apps/cli@2.12.1':
+ resolution: {integrity: sha512-kEDEiGzG+yAc5FeLxtXpES/VN+F2C8H0r4gDVtfRLKxT9np9101d9REG/Kgo2lr0hKi0IpDsODiHnU3+naOmLg==}
engines: {node: '>= 10'}
hasBin: true
- '@tauri-apps/plugin-clipboard-manager@2.3.3':
- resolution: {integrity: sha512-KnyoTs9gj1yEgDkSPUNjOIOHjJTr5wk8IWcYMOWxYTIJCip6QwlyPW8u2X+6bd6kHM4fAdZNpxoal0gy/TwJbg==}
+ '@tauri-apps/plugin-clipboard-manager@2.4.0':
+ resolution: {integrity: sha512-yAuTffXc/sm+4oYnrwxbUkaJXQMTesPJ9dim0ADcA31rpboyhAN2TGQqs9VCcPIpb60LFOeePkvhpP2I3xhejg==}
- '@tauri-apps/plugin-dialog@2.7.3':
- resolution: {integrity: sha512-CRgE+7TP4tvq9MjBU6f04NLTFIqVMLKHk3hAqlhil00ngK9ACTrXPH3oHpKMProxILodd3YjBoKbMwSI4IEcfA==}
+ '@tauri-apps/plugin-dialog@2.8.0':
+ resolution: {integrity: sha512-HSSD5C8UFE9ijD1wue84F7jjaIReFmj8AAPtS+xyjYRltJafIc4BiWHY7SJ6vbbew6u+YljEJHfyNfy5VwywXg==}
- '@tauri-apps/plugin-fs@2.5.2':
- resolution: {integrity: sha512-XXvMSnFiob+G1H+YHCDf+bzWVumseQuEIhzpbOJzevUfL4k0U+sTApZWJHpoLiamggnVPJm5dJ5sDsniRyWxlg==}
+ '@tauri-apps/plugin-fs@2.6.0':
+ resolution: {integrity: sha512-MhBAZ4rryd+h9fijd/GWDfArqiAeGI0ZNduV4wuRyUVI6wDZ+oDBY7atqtoXKDwlTUVSvpvmWJAY0ehQd/v6Uw==}
- '@tauri-apps/plugin-http@2.6.1':
- resolution: {integrity: sha512-9gtfe6eOaVKofASoMZ4Ph8E6vDYnpUTbMXrLt4FkXPzC5+O+wnGqJ9fz2koSPYcQt10bb3cx5qHkU0AU1l8tcQ==}
+ '@tauri-apps/plugin-http@2.8.0':
+ resolution: {integrity: sha512-cPvZvfUSaBkqGxef/dgbh/iEl6T3jQfSJyypi9OdcWr1VcuTt4ZRlk9DLAHEHF2q2NML+0UOkjyXRPNo6Cky6g==}
- '@tauri-apps/plugin-opener@2.5.5':
- resolution: {integrity: sha512-xvzGai5aQds8j8R8RsUK/lW6pGG50YgOYIPLzvkqmkwAj7dfySOD7sGtejRzvVdMmv1EQfKVEFh1MvmDp8QR0g==}
+ '@tauri-apps/plugin-opener@2.7.0':
+ resolution: {integrity: sha512-mBorYfVKh9Lt7s4ZFtKbMUTxBw+Y/sVmSlKCtkkoBgMTC/DIbt/kaPm67L/2djAUqDI1wbixy5OHHVmipjuGMw==}
- '@tauri-apps/plugin-updater@2.12.0':
- resolution: {integrity: sha512-74+g7rSIHXQje3ttR6tYap3FJP/UtZqqYxGVF9EE0Kpz0YADxHX2Ynw/eIlNPMy9D1aG+F8oBosT+6nphSa8Og==}
+ '@tauri-apps/plugin-updater@2.13.1':
+ resolution: {integrity: sha512-+STDzJ0sdQLImjc63zkv6Nncimqeo6jyCWoTQtbSwgGLNj1qbP9I6LC4p5R5ocBk3gNKAZs6i/AJz0jxysytiw==}
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
@@ -2558,8 +2555,8 @@ packages:
'@vscode/l10n@0.0.18':
resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
- '@wdio/config@9.31.9':
- resolution: {integrity: sha512-RrEiAJwWVuc8v1sgLFmqMhNoNqXc14UMEXNDEn+U2ihYY+n5M+86tuP9ns06N4SYhnVofjPjly7IZ2Qhadd2cQ==}
+ '@wdio/config@9.32.0':
+ resolution: {integrity: sha512-HjIANiNoL5ehIuot/KbZyNa26r5SaOaVRscYBxZ6fE4BxZMoHqthiuzGsmbr54Hn6pqQm4nn46GCsEfhPxYzEA==}
engines: {node: '>=18.20.0'}
'@wdio/globals@9.29.1':
@@ -2619,12 +2616,12 @@ packages:
resolution: {integrity: sha512-umKQDbSmu3/ucUsIA5UUTK5gCWnClyVpWz3fC39044rCXQ3zCd1a3GoJibbAITKiwnPFf2yU3LvTa+C78sh9Lg==}
engines: {node: '>=18.20.0'}
- '@wdio/types@9.31.2':
- resolution: {integrity: sha512-lQKaiQDCJJ6VC1K/cKzaAxCpwB9pL1U0VbmX2uGksMxO4EDbNuLvIxWryuUDJ7OaSYTjxILTKYFErdbT/xEikg==}
+ '@wdio/types@9.32.0':
+ resolution: {integrity: sha512-7jMZQ4TGX45bPLgCv9du7mw/Kq7FrjEbQ5vTGg/pUgQy/wSygJ3u4FvPu8FS+DNeQUmvjSPKEUGfl4N+rZjpUg==}
engines: {node: '>=18.20.0'}
- '@wdio/utils@9.31.9':
- resolution: {integrity: sha512-k0Py9L7PxRq8d8/6+B5l4078c12/7lbDzqUVrrhH7VJDV0/EM0qVTtP1LVttLYZEPazdAn0kLSFBCLiiJmfM7Q==}
+ '@wdio/utils@9.32.0':
+ resolution: {integrity: sha512-LsU+PxRQVXJKISaj9v1NZQTmp4m9uugCh55qjN0cKvdqi3bI17V+3orMXNvDYufBgzzZ1eoGxYejJpdIKx98jA==}
engines: {node: '>=18.20.0'}
'@zip.js/zip.js@2.16.0':
@@ -2690,13 +2687,9 @@ packages:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
- archiver-utils@5.0.2:
- resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==}
- engines: {node: '>= 14'}
-
- archiver@7.0.1:
- resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
- engines: {node: '>= 14'}
+ archiver@8.0.0:
+ resolution: {integrity: sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==}
+ engines: {node: '>=18'}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
@@ -2965,9 +2958,9 @@ packages:
compare-versions@6.1.1:
resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
- compress-commons@6.0.2:
- resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
- engines: {node: '>= 14'}
+ compress-commons@7.0.1:
+ resolution: {integrity: sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==}
+ engines: {node: '>=18'}
content-type@3.1.1:
resolution: {integrity: sha512-GW4qUsfFo59d0HbUibDlWv5wPz+vAAcaTWbKIuKCf0JkC7wWkSyf8f13IpXn5JkeMlB2P8iTSSIjwXljorg2vA==}
@@ -3010,9 +3003,9 @@ packages:
engines: {node: '>=0.8'}
hasBin: true
- crc32-stream@6.0.0:
- resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
- engines: {node: '>= 14'}
+ crc32-stream@7.0.1:
+ resolution: {integrity: sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==}
+ engines: {node: '>=18'}
cross-env@10.1.0:
resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==}
@@ -3116,8 +3109,8 @@ packages:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
- dompurify@3.4.8:
- resolution: {integrity: sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==}
+ dompurify@3.4.15:
+ resolution: {integrity: sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==}
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
@@ -3809,9 +3802,9 @@ packages:
is-promise@2.2.2:
resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
- is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
+ is-stream@4.0.1:
+ resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
+ engines: {node: '>=18'}
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
@@ -3899,8 +3892,8 @@ packages:
keyv@5.6.0:
resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
- knip@6.35.1:
- resolution: {integrity: sha512-22wnEnv4do2fvoeJsxpFCG/MBxReNxoCVBccaCl7suUJsG+F0UvxI9ycxZ9YgtLHSSjrZl5tOas0JZ/R1vJ93g==}
+ knip@6.39.0:
+ resolution: {integrity: sha512-Y7g6Ve1ATMox1u1v+gx3z9LTlvzVLTJISm/LVn9TgBU4qc7OoC63AWGO8qCFPVDDdaqlYdXkDDvvO1METBfTRw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -4224,10 +4217,6 @@ packages:
resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
engines: {node: 18 || 20 || >=22}
- minimatch@5.1.9:
- resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==}
- engines: {node: '>=10'}
-
minimatch@9.0.9:
resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -4247,8 +4236,8 @@ packages:
resolution: {integrity: sha512-t9VmxaqrmANnEOBhpSDI6HD192Ge48k8vmWqQQL7hSFEqHEYwZbbsu49+aKLWZeRvFs3j1pMhXOqqF4kPlvjkQ==}
engines: {node: '>=18.0.0'}
- monaco-editor@0.56.0:
- resolution: {integrity: sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==}
+ monaco-editor@0.57.0:
+ resolution: {integrity: sha512-5BkI9KGoqrNvBGUe15/QlZq3OooZ8WLg1AxTpaqHRCP3HNpzPPZKE2EDz8M7c+VRmCeUw1Brp4cx/PWm3kI/5A==}
monaco-languageserver-types@0.4.1:
resolution: {integrity: sha512-uLiYM6K6jPqAa1ni9lRBoj8ZJAErOcegBrfEpurIUUO8cBhlhrGYjWbjhl4OPcxUNoj1JvqSETjwCTyhGgwymQ==}
@@ -4333,8 +4322,8 @@ packages:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
- oxc-parser@0.148.0:
- resolution: {integrity: sha512-syxUKHeUll89RIABQADcI7sikYrwyssvA6gj4phSSIPezKVM8yMaLAiLLSc7fmzVvrwybfFGFbW5zme9sX87rg==}
+ oxc-parser@0.150.0:
+ resolution: {integrity: sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg==}
engines: {node: ^20.19.0 || >=22.12.0}
oxc-resolver@11.24.2:
@@ -4513,8 +4502,8 @@ packages:
peerDependencies:
react: ^19.3.0
- react-error-boundary@6.1.5:
- resolution: {integrity: sha512-l2nk+KhgM6e79tAiHEs3tXTdiTW4ARniKYMQN+cLY5vQFpDOkxuXKIC4uIwYuIKoMpFQ6jEbQz9wBArUmq7GWA==}
+ react-error-boundary@6.1.6:
+ resolution: {integrity: sha512-CDXPnXDGyFIbkwaaJ6u+xgsRmJhSi6YdgUDW1vnyKHfXp1a9pfAlM+ZET2CDu80/A+8iRcmXN0NSY9BCCoWP5A==}
peerDependencies:
'@types/react': ^18.0.0 || ^19.0.0
react: ^18.0.0 || ^19.0.0
@@ -4531,8 +4520,8 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
- react-i18next@17.0.14:
- resolution: {integrity: sha512-ZpMBfJL3BiXPuYHj5QMY1GwvKJNhE1vCxOJQ8BoMBdHP5XONTfi/Qss1nuRlnFdIl72PKo2jPmw+fxuLjRFgaQ==}
+ react-i18next@17.0.15:
+ resolution: {integrity: sha512-7uYpx/oBkesLto7cOzOmfITlUBaXHCAcFahmgETMfWr8nbbWRRnVGvz8wsH/xpbNcyoH+NpCcnOQEqWPMO6/hw==}
peerDependencies:
i18next: '>= 26.2.0'
react: '>= 16.8.0'
@@ -4589,8 +4578,9 @@ packages:
resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- readdir-glob@1.1.3:
- resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+ readdir-glob@3.0.0:
+ resolution: {integrity: sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw==}
+ engines: {node: '>=18'}
readdirp@5.1.1:
resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
@@ -5181,12 +5171,12 @@ packages:
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
- webdriver@9.31.9:
- resolution: {integrity: sha512-mkRevz4ZIHCBe09FtHQnWg0G/p40bqk3Rv7aBooSthc8hpKG0880B9iga08drtPSiYN6/wC59WBh10ooLPboJA==}
+ webdriver@9.32.0:
+ resolution: {integrity: sha512-1Z7mydyw3v3UfzQ6UtrRvu3ij1eHuSoitxBMWlnKi2e3Zpvc1EBPp6FhsXBYhdFg0F4900j6sUTkoF//CkpbpQ==}
engines: {node: '>=18.20.0'}
- webdriverio@9.31.9:
- resolution: {integrity: sha512-C5Uxgry8Gcs4HJ2Ln/9m8QK55S4s5qNw6bjyFnWIFaZhPaoLrC0YN6wSzZ/LqfnysPdefRjgHxctFX/G6xIi0Q==}
+ webdriverio@9.32.0:
+ resolution: {integrity: sha512-A7r7SnvZ6eEJROIWAG6GMOlV82W2Pl7FDjXLn/tJ4L8BEc3yjCrDWzY4EB9i4MtPZwlNZoHgNV9fYYKn7JWAew==}
engines: {node: '>=18.20.0'}
peerDependencies:
puppeteer-core: '>=22.x <=24.x'
@@ -5233,8 +5223,8 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- ws@8.21.3:
- resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==}
+ ws@8.22.0:
+ resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -5280,9 +5270,9 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- zip-stream@6.0.1:
- resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
- engines: {node: '>= 14'}
+ zip-stream@7.0.5:
+ resolution: {integrity: sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w==}
+ engines: {node: '>=18'}
zod-validation-error@3.5.4:
resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==}
@@ -6493,10 +6483,10 @@ snapshots:
dependencies:
state-local: 1.0.7
- '@monaco-editor/react@4.7.0(monaco-editor@0.56.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
+ '@monaco-editor/react@4.7.0(monaco-editor@0.57.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
dependencies:
'@monaco-editor/loader': 1.7.0
- monaco-editor: 0.56.0
+ monaco-editor: 0.57.0
react: 19.3.0
react-dom: 19.3.0(react@19.3.0)
@@ -6659,65 +6649,63 @@ snapshots:
dependencies:
'@octokit/openapi-types': 29.0.1
- '@oxc-parser/binding-android-arm-eabi@0.148.0':
+ '@oxc-parser/binding-android-arm-eabi@0.150.0':
optional: true
- '@oxc-parser/binding-android-arm64@0.148.0':
+ '@oxc-parser/binding-android-arm64@0.150.0':
optional: true
- '@oxc-parser/binding-darwin-arm64@0.148.0':
+ '@oxc-parser/binding-darwin-arm64@0.150.0':
optional: true
- '@oxc-parser/binding-darwin-x64@0.148.0':
+ '@oxc-parser/binding-darwin-x64@0.150.0':
optional: true
- '@oxc-parser/binding-freebsd-x64@0.148.0':
+ '@oxc-parser/binding-freebsd-x64@0.150.0':
optional: true
- '@oxc-parser/binding-linux-arm-gnueabihf@0.148.0':
+ '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0':
optional: true
- '@oxc-parser/binding-linux-arm-musleabihf@0.148.0':
+ '@oxc-parser/binding-linux-arm-musleabihf@0.150.0':
optional: true
- '@oxc-parser/binding-linux-arm64-gnu@0.148.0':
+ '@oxc-parser/binding-linux-arm64-gnu@0.150.0':
optional: true
- '@oxc-parser/binding-linux-arm64-musl@0.148.0':
+ '@oxc-parser/binding-linux-arm64-musl@0.150.0':
optional: true
- '@oxc-parser/binding-linux-ppc64-gnu@0.148.0':
+ '@oxc-parser/binding-linux-ppc64-gnu@0.150.0':
optional: true
- '@oxc-parser/binding-linux-riscv64-gnu@0.148.0':
+ '@oxc-parser/binding-linux-riscv64-gnu@0.150.0':
optional: true
- '@oxc-parser/binding-linux-riscv64-musl@0.148.0':
+ '@oxc-parser/binding-linux-riscv64-musl@0.150.0':
optional: true
- '@oxc-parser/binding-linux-s390x-gnu@0.148.0':
+ '@oxc-parser/binding-linux-s390x-gnu@0.150.0':
optional: true
- '@oxc-parser/binding-linux-x64-gnu@0.148.0':
+ '@oxc-parser/binding-linux-x64-gnu@0.150.0':
optional: true
- '@oxc-parser/binding-linux-x64-musl@0.148.0':
+ '@oxc-parser/binding-linux-x64-musl@0.150.0':
optional: true
- '@oxc-parser/binding-openharmony-arm64@0.148.0':
+ '@oxc-parser/binding-openharmony-arm64@0.150.0':
optional: true
- '@oxc-parser/binding-win32-arm64-msvc@0.148.0':
+ '@oxc-parser/binding-win32-arm64-msvc@0.150.0':
optional: true
- '@oxc-parser/binding-win32-ia32-msvc@0.148.0':
+ '@oxc-parser/binding-win32-ia32-msvc@0.150.0':
optional: true
- '@oxc-parser/binding-win32-x64-msvc@0.148.0':
+ '@oxc-parser/binding-win32-x64-msvc@0.150.0':
optional: true
- '@oxc-project/types@0.148.0': {}
-
'@oxc-project/types@0.150.0': {}
'@oxc-resolver/binding-android-arm-eabi@11.24.2':
@@ -6999,78 +6987,78 @@ snapshots:
'@tanstack/virtual-core@3.17.11': {}
- '@tauri-apps/api@2.11.1': {}
+ '@tauri-apps/api@2.12.1': {}
- '@tauri-apps/cli-darwin-arm64@2.11.4':
+ '@tauri-apps/cli-darwin-arm64@2.12.1':
optional: true
- '@tauri-apps/cli-darwin-x64@2.11.4':
+ '@tauri-apps/cli-darwin-x64@2.12.1':
optional: true
- '@tauri-apps/cli-linux-arm-gnueabihf@2.11.4':
+ '@tauri-apps/cli-linux-arm-gnueabihf@2.12.1':
optional: true
- '@tauri-apps/cli-linux-arm64-gnu@2.11.4':
+ '@tauri-apps/cli-linux-arm64-gnu@2.12.1':
optional: true
- '@tauri-apps/cli-linux-arm64-musl@2.11.4':
+ '@tauri-apps/cli-linux-arm64-musl@2.12.1':
optional: true
- '@tauri-apps/cli-linux-riscv64-gnu@2.11.4':
+ '@tauri-apps/cli-linux-riscv64-gnu@2.12.1':
optional: true
- '@tauri-apps/cli-linux-x64-gnu@2.11.4':
+ '@tauri-apps/cli-linux-x64-gnu@2.12.1':
optional: true
- '@tauri-apps/cli-linux-x64-musl@2.11.4':
+ '@tauri-apps/cli-linux-x64-musl@2.12.1':
optional: true
- '@tauri-apps/cli-win32-arm64-msvc@2.11.4':
+ '@tauri-apps/cli-win32-arm64-msvc@2.12.1':
optional: true
- '@tauri-apps/cli-win32-ia32-msvc@2.11.4':
+ '@tauri-apps/cli-win32-ia32-msvc@2.12.1':
optional: true
- '@tauri-apps/cli-win32-x64-msvc@2.11.4':
+ '@tauri-apps/cli-win32-x64-msvc@2.12.1':
optional: true
- '@tauri-apps/cli@2.11.4':
+ '@tauri-apps/cli@2.12.1':
optionalDependencies:
- '@tauri-apps/cli-darwin-arm64': 2.11.4
- '@tauri-apps/cli-darwin-x64': 2.11.4
- '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.4
- '@tauri-apps/cli-linux-arm64-gnu': 2.11.4
- '@tauri-apps/cli-linux-arm64-musl': 2.11.4
- '@tauri-apps/cli-linux-riscv64-gnu': 2.11.4
- '@tauri-apps/cli-linux-x64-gnu': 2.11.4
- '@tauri-apps/cli-linux-x64-musl': 2.11.4
- '@tauri-apps/cli-win32-arm64-msvc': 2.11.4
- '@tauri-apps/cli-win32-ia32-msvc': 2.11.4
- '@tauri-apps/cli-win32-x64-msvc': 2.11.4
+ '@tauri-apps/cli-darwin-arm64': 2.12.1
+ '@tauri-apps/cli-darwin-x64': 2.12.1
+ '@tauri-apps/cli-linux-arm-gnueabihf': 2.12.1
+ '@tauri-apps/cli-linux-arm64-gnu': 2.12.1
+ '@tauri-apps/cli-linux-arm64-musl': 2.12.1
+ '@tauri-apps/cli-linux-riscv64-gnu': 2.12.1
+ '@tauri-apps/cli-linux-x64-gnu': 2.12.1
+ '@tauri-apps/cli-linux-x64-musl': 2.12.1
+ '@tauri-apps/cli-win32-arm64-msvc': 2.12.1
+ '@tauri-apps/cli-win32-ia32-msvc': 2.12.1
+ '@tauri-apps/cli-win32-x64-msvc': 2.12.1
- '@tauri-apps/plugin-clipboard-manager@2.3.3':
+ '@tauri-apps/plugin-clipboard-manager@2.4.0':
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
- '@tauri-apps/plugin-dialog@2.7.3':
+ '@tauri-apps/plugin-dialog@2.8.0':
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
- '@tauri-apps/plugin-fs@2.5.2':
+ '@tauri-apps/plugin-fs@2.6.0':
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
- '@tauri-apps/plugin-http@2.6.1':
+ '@tauri-apps/plugin-http@2.8.0':
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
- '@tauri-apps/plugin-opener@2.5.5':
+ '@tauri-apps/plugin-opener@2.7.0':
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
- '@tauri-apps/plugin-updater@2.12.0':
+ '@tauri-apps/plugin-updater@2.13.1':
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
'@tootallnate/quickjs-emscripten@0.23.0': {}
@@ -7397,11 +7385,11 @@ snapshots:
'@vscode/l10n@0.0.18': {}
- '@wdio/config@9.31.9(supports-color@7.2.0)':
+ '@wdio/config@9.32.0(supports-color@7.2.0)':
dependencies:
'@wdio/logger': 9.29.1
- '@wdio/types': 9.31.2
- '@wdio/utils': 9.31.9(supports-color@7.2.0)
+ '@wdio/types': 9.32.0
+ '@wdio/utils': 9.32.0(supports-color@7.2.0)
deepmerge-ts: 8.0.2
glob: 10.5.0
import-meta-resolve: 4.2.0
@@ -7412,10 +7400,10 @@ snapshots:
- react-native-b4a
- supports-color
- '@wdio/globals@9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.31.9(supports-color@7.2.0))':
+ '@wdio/globals@9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.32.0(supports-color@7.2.0))':
dependencies:
- expect-webdriverio: 5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.31.9(supports-color@7.2.0))
- webdriverio: 9.31.9(supports-color@7.2.0)
+ expect-webdriverio: 5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.32.0(supports-color@7.2.0))
+ webdriverio: 9.32.0(supports-color@7.2.0)
'@wdio/logger@9.29.1':
dependencies:
@@ -7475,9 +7463,9 @@ snapshots:
easy-table: 1.2.0
pretty-ms: 9.3.1
- '@wdio/tauri-service@1.4.0(expect-webdriverio@5.7.0)(supports-color@7.2.0)(webdriverio@9.31.9(supports-color@7.2.0))':
+ '@wdio/tauri-service@1.4.0(expect-webdriverio@5.7.0)(supports-color@7.2.0)(webdriverio@9.32.0(supports-color@7.2.0))':
dependencies:
- '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.31.9(supports-color@7.2.0))
+ '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.32.0(supports-color@7.2.0))
'@wdio/logger': 9.29.1
'@wdio/native-core': 1.2.0(supports-color@7.2.0)
'@wdio/native-spy': 1.3.0
@@ -7488,7 +7476,7 @@ snapshots:
debug: 4.4.3(supports-color@7.2.0)
get-port: 7.2.0
tslib: 2.8.1
- webdriverio: 9.31.9(supports-color@7.2.0)
+ webdriverio: 9.32.0(supports-color@7.2.0)
transitivePeerDependencies:
- expect-webdriverio
- supports-color
@@ -7498,15 +7486,15 @@ snapshots:
dependencies:
'@types/node': 20.19.43
- '@wdio/types@9.31.2':
+ '@wdio/types@9.32.0':
dependencies:
'@types/node': 20.19.43
- '@wdio/utils@9.31.9(supports-color@7.2.0)':
+ '@wdio/utils@9.32.0(supports-color@7.2.0)':
dependencies:
'@puppeteer/browsers': 2.13.2(supports-color@7.2.0)
'@wdio/logger': 9.29.1
- '@wdio/types': 9.31.2
+ '@wdio/types': 9.32.0
decamelize: 6.0.1
deepmerge-ts: 8.0.2
edgedriver: 6.3.1(supports-color@7.2.0)
@@ -7580,25 +7568,17 @@ snapshots:
ansi-styles@6.2.3: {}
- archiver-utils@5.0.2:
+ archiver@8.0.0:
dependencies:
- glob: 10.5.0
- graceful-fs: 4.2.11
- is-stream: 2.0.1
- lazystream: 1.0.1
- lodash: 4.18.1
- normalize-path: 3.0.0
- readable-stream: 4.7.0
-
- archiver@7.0.1:
- dependencies:
- archiver-utils: 5.0.2
async: 3.2.6
buffer-crc32: 1.0.0
+ is-stream: 4.0.1
+ lazystream: 1.0.1
+ normalize-path: 3.0.0
readable-stream: 4.7.0
- readdir-glob: 1.1.3
+ readdir-glob: 3.0.0
tar-stream: 3.2.1
- zip-stream: 6.0.1
+ zip-stream: 7.0.5
transitivePeerDependencies:
- bare-abort-controller
- bare-buffer
@@ -7851,11 +7831,11 @@ snapshots:
compare-versions@6.1.1: {}
- compress-commons@6.0.2:
+ compress-commons@7.0.1:
dependencies:
crc-32: 1.2.2
- crc32-stream: 6.0.0
- is-stream: 2.0.1
+ crc32-stream: 7.0.1
+ is-stream: 4.0.1
normalize-path: 3.0.0
readable-stream: 4.7.0
@@ -7894,7 +7874,7 @@ snapshots:
crc-32@1.2.2: {}
- crc32-stream@6.0.0:
+ crc32-stream@7.0.1:
dependencies:
crc-32: 1.2.2
readable-stream: 4.7.0
@@ -7993,7 +7973,7 @@ snapshots:
dependencies:
domelementtype: 2.3.0
- dompurify@3.4.8:
+ dompurify@3.4.15:
optionalDependencies:
'@types/trusted-types': 2.0.7
@@ -8443,15 +8423,15 @@ snapshots:
expect-type@1.4.0: {}
- expect-webdriverio@5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.31.9(supports-color@7.2.0)):
+ expect-webdriverio@5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.32.0(supports-color@7.2.0)):
dependencies:
'@vitest/snapshot': 4.1.11
- '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.31.9(supports-color@7.2.0))
+ '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.32.0(supports-color@7.2.0))
'@wdio/logger': 9.29.1
deep-eql: 5.0.2
expect: 30.5.2
jest-matcher-utils: 30.5.2
- webdriverio: 9.31.9(supports-color@7.2.0)
+ webdriverio: 9.32.0(supports-color@7.2.0)
expect@30.5.2:
dependencies:
@@ -8866,7 +8846,7 @@ snapshots:
is-promise@2.2.2: {}
- is-stream@2.0.1: {}
+ is-stream@4.0.1: {}
isarray@1.0.0: {}
@@ -8964,13 +8944,13 @@ snapshots:
dependencies:
'@keyv/serialize': 1.1.1
- knip@6.35.1:
+ knip@6.39.0:
dependencies:
fdir: 6.5.0(picomatch@4.0.7)
formatly: 0.7.1
get-tsconfig: 4.14.3
jiti: 2.7.0
- oxc-parser: 0.148.0
+ oxc-parser: 0.150.0
oxc-resolver: 11.24.2
picomatch: 4.0.7
smol-toml: 1.8.0
@@ -9483,10 +9463,6 @@ snapshots:
dependencies:
brace-expansion: 5.0.12
- minimatch@5.1.9:
- dependencies:
- brace-expansion: 2.1.7
-
minimatch@9.0.9:
dependencies:
brace-expansion: 2.1.7
@@ -9501,9 +9477,9 @@ snapshots:
modern-tar@0.7.7: {}
- monaco-editor@0.56.0:
+ monaco-editor@0.57.0:
dependencies:
- dompurify: 3.4.8
+ dompurify: 3.4.15
marked: 14.0.0
monaco-languageserver-types@0.4.1:
@@ -9518,19 +9494,19 @@ snapshots:
monaco-types@0.1.2: {}
- monaco-worker-manager@2.0.1(monaco-editor@0.56.0):
+ monaco-worker-manager@2.0.1(monaco-editor@0.57.0):
dependencies:
- monaco-editor: 0.56.0
+ monaco-editor: 0.57.0
- monaco-yaml@5.5.1(monaco-editor@0.56.0):
+ monaco-yaml@5.5.1(monaco-editor@0.57.0):
dependencies:
'@vscode/l10n': 0.0.18
jsonc-parser: 3.3.1
- monaco-editor: 0.56.0
+ monaco-editor: 0.57.0
monaco-languageserver-types: 0.4.1
monaco-marker-data-provider: 1.2.5
monaco-types: 0.1.2
- monaco-worker-manager: 2.0.1(monaco-editor@0.56.0)
+ monaco-worker-manager: 2.0.1(monaco-editor@0.57.0)
path-browserify: 1.0.1
prettier: 3.9.8
proxy-disposable: 1.0.0
@@ -9588,29 +9564,29 @@ snapshots:
type-check: 0.4.0
word-wrap: 1.2.5
- oxc-parser@0.148.0:
+ oxc-parser@0.150.0:
dependencies:
- '@oxc-project/types': 0.148.0
+ '@oxc-project/types': 0.150.0
optionalDependencies:
- '@oxc-parser/binding-android-arm-eabi': 0.148.0
- '@oxc-parser/binding-android-arm64': 0.148.0
- '@oxc-parser/binding-darwin-arm64': 0.148.0
- '@oxc-parser/binding-darwin-x64': 0.148.0
- '@oxc-parser/binding-freebsd-x64': 0.148.0
- '@oxc-parser/binding-linux-arm-gnueabihf': 0.148.0
- '@oxc-parser/binding-linux-arm-musleabihf': 0.148.0
- '@oxc-parser/binding-linux-arm64-gnu': 0.148.0
- '@oxc-parser/binding-linux-arm64-musl': 0.148.0
- '@oxc-parser/binding-linux-ppc64-gnu': 0.148.0
- '@oxc-parser/binding-linux-riscv64-gnu': 0.148.0
- '@oxc-parser/binding-linux-riscv64-musl': 0.148.0
- '@oxc-parser/binding-linux-s390x-gnu': 0.148.0
- '@oxc-parser/binding-linux-x64-gnu': 0.148.0
- '@oxc-parser/binding-linux-x64-musl': 0.148.0
- '@oxc-parser/binding-openharmony-arm64': 0.148.0
- '@oxc-parser/binding-win32-arm64-msvc': 0.148.0
- '@oxc-parser/binding-win32-ia32-msvc': 0.148.0
- '@oxc-parser/binding-win32-x64-msvc': 0.148.0
+ '@oxc-parser/binding-android-arm-eabi': 0.150.0
+ '@oxc-parser/binding-android-arm64': 0.150.0
+ '@oxc-parser/binding-darwin-arm64': 0.150.0
+ '@oxc-parser/binding-darwin-x64': 0.150.0
+ '@oxc-parser/binding-freebsd-x64': 0.150.0
+ '@oxc-parser/binding-linux-arm-gnueabihf': 0.150.0
+ '@oxc-parser/binding-linux-arm-musleabihf': 0.150.0
+ '@oxc-parser/binding-linux-arm64-gnu': 0.150.0
+ '@oxc-parser/binding-linux-arm64-musl': 0.150.0
+ '@oxc-parser/binding-linux-ppc64-gnu': 0.150.0
+ '@oxc-parser/binding-linux-riscv64-gnu': 0.150.0
+ '@oxc-parser/binding-linux-riscv64-musl': 0.150.0
+ '@oxc-parser/binding-linux-s390x-gnu': 0.150.0
+ '@oxc-parser/binding-linux-x64-gnu': 0.150.0
+ '@oxc-parser/binding-linux-x64-musl': 0.150.0
+ '@oxc-parser/binding-openharmony-arm64': 0.150.0
+ '@oxc-parser/binding-win32-arm64-msvc': 0.150.0
+ '@oxc-parser/binding-win32-ia32-msvc': 0.150.0
+ '@oxc-parser/binding-win32-x64-msvc': 0.150.0
oxc-resolver@11.24.2:
optionalDependencies:
@@ -9808,7 +9784,7 @@ snapshots:
react: 19.3.0
scheduler: 0.28.0
- react-error-boundary@6.1.5(@types/react@19.3.0)(react@19.3.0):
+ react-error-boundary@6.1.6(@types/react@19.3.0)(react@19.3.0):
dependencies:
react: 19.3.0
optionalDependencies:
@@ -9820,7 +9796,7 @@ snapshots:
dependencies:
react: 19.3.0
- react-i18next@17.0.14(i18next@26.4.2(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3):
+ react-i18next@17.0.15(i18next@26.4.2(typescript@6.0.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(typescript@6.0.3):
dependencies:
'@babel/runtime': 7.29.7
html-parse-stringify: 4.0.1
@@ -9892,9 +9868,9 @@ snapshots:
process: 0.11.10
string_decoder: 1.3.0
- readdir-glob@1.1.3:
+ readdir-glob@3.0.0:
dependencies:
- minimatch: 5.1.9
+ minimatch: 10.2.6
readdirp@5.1.1: {}
@@ -10216,7 +10192,7 @@ snapshots:
tauri-plugin-mihomo-api@https://codeload.github.com/clash-verge-rev/tauri-plugin-mihomo/tar.gz/ba8434c08c869916b8041d707ad66599bb5230b2:
dependencies:
- '@tauri-apps/api': 2.11.1
+ '@tauri-apps/api': 2.12.1
teex@1.0.1:
dependencies:
@@ -10493,19 +10469,19 @@ snapshots:
web-namespaces@2.0.1: {}
- webdriver@9.31.9(supports-color@7.2.0):
+ webdriver@9.32.0(supports-color@7.2.0):
dependencies:
'@types/node': 20.19.43
'@types/ws': 8.18.1
- '@wdio/config': 9.31.9(supports-color@7.2.0)
+ '@wdio/config': 9.32.0(supports-color@7.2.0)
'@wdio/logger': 9.29.1
'@wdio/protocols': 9.31.5
- '@wdio/types': 9.31.2
- '@wdio/utils': 9.31.9(supports-color@7.2.0)
+ '@wdio/types': 9.32.0
+ '@wdio/utils': 9.32.0(supports-color@7.2.0)
deepmerge-ts: 8.0.2
https-proxy-agent: 7.0.6(supports-color@7.2.0)
undici: 6.28.1
- ws: 8.21.3
+ ws: 8.22.0
transitivePeerDependencies:
- bare-abort-controller
- bare-buffer
@@ -10514,17 +10490,17 @@ snapshots:
- supports-color
- utf-8-validate
- webdriverio@9.31.9(supports-color@7.2.0):
+ webdriverio@9.32.0(supports-color@7.2.0):
dependencies:
'@types/node': 20.19.43
'@types/sinonjs__fake-timers': 8.1.5
- '@wdio/config': 9.31.9(supports-color@7.2.0)
+ '@wdio/config': 9.32.0(supports-color@7.2.0)
'@wdio/logger': 9.29.1
'@wdio/protocols': 9.31.5
'@wdio/repl': 9.16.2
- '@wdio/types': 9.31.2
- '@wdio/utils': 9.31.9(supports-color@7.2.0)
- archiver: 7.0.1
+ '@wdio/types': 9.32.0
+ '@wdio/utils': 9.32.0(supports-color@7.2.0)
+ archiver: 8.0.0
aria-query: 5.3.2
cheerio: 1.2.0
css-shorthand-properties: 1.1.2
@@ -10540,7 +10516,7 @@ snapshots:
rgb2hex: 0.2.5
serialize-error: 12.0.0
urlpattern-polyfill: 10.1.0
- webdriver: 9.31.9(supports-color@7.2.0)
+ webdriver: 9.32.0(supports-color@7.2.0)
transitivePeerDependencies:
- bare-abort-controller
- bare-buffer
@@ -10584,7 +10560,7 @@ snapshots:
wrappy@1.0.2: {}
- ws@8.21.3: {}
+ ws@8.22.0: {}
y18n@5.0.8: {}
@@ -10615,10 +10591,10 @@ snapshots:
yocto-queue@0.1.0: {}
- zip-stream@6.0.1:
+ zip-stream@7.0.5:
dependencies:
- archiver-utils: 5.0.2
- compress-commons: 6.0.2
+ compress-commons: 7.0.1
+ normalize-path: 3.0.0
readable-stream: 4.7.0
zod-validation-error@3.5.4(zod@3.25.76):
diff --git a/rust-toolchain.toml b/rust-toolchain.toml
index 68c0ea297..099ed62f9 100644
--- a/rust-toolchain.toml
+++ b/rust-toolchain.toml
@@ -1,3 +1,3 @@
[toolchain]
-channel = "1.98.1"
+channel = "1.99.0"
components = ["rustfmt", "clippy"]
diff --git a/src-tauri/AGENTS.md b/src-tauri/AGENTS.md
index 9fca79414..0198c5bd1 100644
--- a/src-tauri/AGENTS.md
+++ b/src-tauri/AGENTS.md
@@ -8,12 +8,12 @@ These rules supplement the repository's root `AGENTS.md`.
`core::notify::announce` after successful persistence and commit. This keeps
failed transactions from publishing state. Independent transactions retain
their boundaries and announce via `after_commit`; runtime-only profile
- activation announces after successful application. New cross-layer
- exceptions require a rationale in the PR and an update to this file.
-2. **Register every new `IVerge` field.** Add one row, including an explicit
- `NoEffect` where appropriate, to the exhaustive registry and preserve its
- platform attributes. Keep the serialized-field coverage test passing. Manual
- field-to-flag chains hide missing effects and are forbidden. No exceptions.
+ activation announces after successful application. Cross-layer operations
+ must preserve these ownership and transaction boundaries.
+2. **Register every new `IVerge` field.** Register the field in the
+ exhaustive effect registry, including an explicit `NoEffect` where
+ appropriate, and preserve its platform attributes. Manual field-to-flag
+ chains hide missing effects and are forbidden.
3. **Use `utils::retry` for bounded retries.** Do not introduce handwritten retry
loops, including `loop` plus `sleep`; preserve attempt budgets, delays and
terminal errors. Permanent watchers are the exception and must document
@@ -21,17 +21,8 @@ These rules supplement the repository's root `AGENTS.md`.
a retry policy.
4. **Keep notifications typed.** Send notice statuses through `NoticeStatus` and
use `Arc` for notice message payloads. Preserve the event names and
- status strings pinned by the golden tests. Status additions or changes
- require frontend and backend changes in the same PR and an updated golden
- list; this protects the wire contract. No exceptions.
-
- Known dead wire entries, recorded here and intentionally kept (no tracking
- issue): the `config_validate::*` statuses whose frontend handlers never
- receive a backend send (`core_change`, `stdout_error`, `yaml_key_error`,
- `yaml_error`, `merge_key_error`, `merge_error`), and `set_config::ok`,
- sent by the backend with no frontend handler. Each variant carries its own
- comment in `NoticeStatus`. Removal requires a same-PR frontend change and a
- golden-list update.
+ status strings as a shared wire contract. Contract changes must keep
+ frontend consumers and backend producers aligned.
5. **Preserve lock order.** The order is `config_write` before
`config_update_in_progress` before `lifecycle_lock`. Patch callers must use
the executor's guarded claim instead of independently combining these locks;
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 9d88820e6..75d4007a7 100755
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -29,7 +29,7 @@ perf-harness = ["dep:tauri-plugin-wdio-webdriver"]
identifier = "io.github.clash-verge-rev.clash-verge-rev"
[build-dependencies]
-tauri-build = { version = "2.6.3", features = [] }
+tauri-build = { version = "2.7.1", features = [] }
[dependencies]
clash-verge-draft = { workspace = true }
@@ -74,13 +74,13 @@ sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs.git", branch
"guard",
] }
network-interface = { version = "2.0.5", features = ["serde"] }
-tauri-plugin-shell = "2.3.6"
-tauri-plugin-opener = "2.5.5"
-tauri-plugin-dialog = "2.7.3"
-tauri-plugin-fs = "2.5.2"
-tauri-plugin-process = "2.3.1"
-tauri-plugin-deep-link = "2.4.10"
-tauri-plugin-window-state = "2.4.1"
+tauri-plugin-shell = "2.4.0"
+tauri-plugin-opener = "2.7.0"
+tauri-plugin-dialog = "2.8.1"
+tauri-plugin-fs = "2.6.0"
+tauri-plugin-process = "2.4.0"
+tauri-plugin-deep-link = "2.6.1"
+tauri-plugin-window-state = "2.5.0"
zip = "8.6.0"
flate2 = "1.1.10"
reqwest_dav = "0.3.3"
@@ -91,19 +91,19 @@ getrandom = "0.4.3"
futures = "0.3.34"
gethostname = "1.1.0"
scopeguard = "1.2.0"
-tauri-plugin-notification = "2.4.0"
+tauri-plugin-notification = "2.5.1"
tokio-stream = "0.1.19"
backon = { version = "1.6.0", features = ["tokio-sleep"] }
-tauri-plugin-http = "2.6.1"
+tauri-plugin-http = "2.8.0"
tracing = { workspace = true }
-tauri-plugin-devtools = { version = "2.2.1", optional = true }
+tauri-plugin-devtools = { version = "2.2.2", optional = true }
tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo", branch = "main" }
async-trait = "0.1.92"
clash_verge_service_ipc = { git = "https://github.com/clash-verge-rev/clash-verge-service-ipc.git", tag = "v2.7.6", version = "2.7.6", features = [
"client",
] }
arc-swap = "1.9.2"
-tokio-rustls = "0.26.5"
+tokio-rustls = "0.26.6"
rustls = { version = "0.23.45", features = ["ring"] }
webpki-roots = "1.0.9"
dark-light = "3.0.0"
@@ -111,7 +111,7 @@ bytes = "1.12.1"
tokio-util = { version = "0.7.19", features = ["time"] }
[target.'cfg(unix)'.dependencies]
-libc = "0.2.189"
+libc = "0.2.190"
[target.'cfg(target_os = "macos")'.dependencies]
tauri-plugin-wdio-webdriver = { version = "=1.4.0", optional = true }
@@ -146,9 +146,9 @@ windows = { version = "0.62.2", features = ["Win32_Globalization"] }
windows-sys.workspace = true
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
-tauri-plugin-autostart = "2.5.1"
-tauri-plugin-global-shortcut = "2.3.2"
-tauri-plugin-updater = "2.12.0"
+tauri-plugin-autostart = "2.7.0"
+tauri-plugin-global-shortcut = "2.4.0"
+tauri-plugin-updater = "2.13.1"
[dev-dependencies]
criterion = { workspace = true }
diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi
index eb7ada4d2..763ee89f4 100644
--- a/src-tauri/packages/windows/installer.nsi
+++ b/src-tauri/packages/windows/installer.nsi
@@ -901,6 +901,7 @@ Section Install
nsExec::Exec 'netsh int tcp res'
+ !include "Win\RestartManager.nsh"
!insertmacro CheckIfAppIsRunning "${MAINBINARYNAME}.exe" "${PRODUCTNAME}"
!insertmacro CheckAllVergeProcesses
diff --git a/src-tauri/src/cmd/proxy.rs b/src-tauri/src/cmd/proxy.rs
index f3b22aa0f..d91ae9f4e 100644
--- a/src-tauri/src/cmd/proxy.rs
+++ b/src-tauri/src/cmd/proxy.rs
@@ -4,7 +4,7 @@ use crate::{
config::Config,
core::{
handle::Handle,
- proxy_view::{ProxyViewBuilder, ProxyViewInput, ProxyViewV1},
+ proxy_view::{GroupScope, ProxyViewBuilder, ProxyViewInput, ProxyViewV1},
tray::Tray,
},
process::AsyncHandler,
@@ -12,7 +12,7 @@ use crate::{
use clash_verge_logging::{Type, logging};
use serde_yaml_ng::Mapping;
use std::{
- collections::HashSet,
+ collections::{BTreeMap, HashSet},
sync::atomic::{AtomicBool, Ordering},
};
@@ -50,11 +50,65 @@ fn runtime_group_order(config: Option<&Mapping>) -> Vec {
.collect()
}
+/// Mirrors Mihomo: `include-all`/`include-all-providers` replace `use` with every provider, sorted.
+fn runtime_group_scopes(config: Option<&Mapping>) -> BTreeMap {
+ let Some(config) = config else {
+ return BTreeMap::new();
+ };
+ let mut all_providers = config
+ .get("proxy-providers")
+ .and_then(|providers| providers.as_mapping())
+ .into_iter()
+ .flat_map(|providers| providers.keys())
+ .filter_map(|name| name.as_str())
+ .map(str::to_owned)
+ .collect::>();
+ all_providers.sort();
+ let flag = |group: &Mapping, key: &str| group.get(key).and_then(|value| value.as_bool()) == Some(true);
+
+ config
+ .get("proxy-groups")
+ .and_then(|groups| groups.as_sequence())
+ .into_iter()
+ .flatten()
+ .filter_map(|group| group.as_mapping())
+ .filter_map(|group| {
+ let name = group.get("name")?.as_str()?.to_owned();
+ let providers = if flag(group, "include-all") || flag(group, "include-all-providers") {
+ all_providers.clone()
+ } else {
+ group
+ .get("use")
+ .and_then(|providers| providers.as_sequence())
+ .into_iter()
+ .flatten()
+ .filter_map(|provider| provider.as_str())
+ .map(str::to_owned)
+ .collect()
+ };
+ let exclude_types = group
+ .get("exclude-type")
+ .and_then(|types| types.as_str())
+ .filter(|types| !types.is_empty())
+ .map(|types| types.split('|').map(str::to_owned).collect())
+ .unwrap_or_default();
+ Some((
+ name,
+ GroupScope {
+ providers,
+ exclude_types,
+ },
+ ))
+ })
+ .collect()
+}
+
#[tauri::command]
pub async fn get_proxy_view() -> CmdResult {
let runtime = Config::runtime().await;
let latest_runtime = runtime.latest_arc();
let runtime_group_order = runtime_group_order(latest_runtime.config.as_ref());
+ let group_scopes = runtime_group_scopes(latest_runtime.config.as_ref());
let mihomo = Handle::mihomo();
let (proxies, providers) = tokio::join!(mihomo.get_proxies(), mihomo.get_proxy_providers(),);
@@ -62,6 +116,7 @@ pub async fn get_proxy_view() -> CmdResult {
Ok(ProxyViewBuilder::build(ProxyViewInput {
runtime_group_order,
+ group_scopes,
proxies,
providers: providers.ok(),
}))
@@ -110,31 +165,3 @@ async fn run_tray_sync_loop() {
}
}
}
-
-#[cfg(test)]
-#[allow(clippy::expect_used)]
-mod tests {
- use serde_yaml_ng::Value;
-
- use super::runtime_group_order;
-
- #[test]
- fn runtime_order_keeps_first_non_empty_non_global_name() {
- let config: Value = serde_yaml_ng::from_str(
- r#"
-proxy-groups:
- - name: Beta
- - name: ""
- - name: GLOBAL
- - name: " Alpha "
- - name: Beta
-"#,
- )
- .expect("parse runtime");
-
- assert_eq!(
- runtime_group_order(config.as_mapping()),
- ["Beta".to_owned(), " Alpha ".to_owned()]
- );
- }
-}
diff --git a/src-tauri/src/core/manager/lifecycle.rs b/src-tauri/src/core/manager/lifecycle.rs
index 9444a23df..c3f366375 100644
--- a/src-tauri/src/core/manager/lifecycle.rs
+++ b/src-tauri/src/core/manager/lifecycle.rs
@@ -823,7 +823,12 @@ impl CoreManager {
return;
}
- if crate::core::runstate::RUN_STATE.state().service_usable() {
+ let state = crate::core::runstate::RUN_STATE.state();
+ // Waiting cannot bring up a service nothing will start.
+ if state.service_usable()
+ || matches!(&state.health, crate::core::runstate::ServiceHealth::Unavailable(reason)
+ if crate::core::service::is_not_auto_started(reason))
+ {
return;
}
diff --git a/src-tauri/src/core/manager/mod.rs b/src-tauri/src/core/manager/mod.rs
index 26164816e..9ed82eefa 100644
--- a/src-tauri/src/core/manager/mod.rs
+++ b/src-tauri/src/core/manager/mod.rs
@@ -245,7 +245,7 @@ impl CoreManager {
pub(crate) fn invalidate_core_readiness(&self) {
let _ = self
.core_readiness_state
- .fetch_update(Ordering::AcqRel, Ordering::Acquire, |current| {
+ .try_update(Ordering::AcqRel, Ordering::Acquire, |current| {
active_core_readiness_generation(current).map(inactive_core_readiness_state)
});
}
diff --git a/src-tauri/src/core/proxy_view.rs b/src-tauri/src/core/proxy_view.rs
index 4a8d9e30b..4506bd0ce 100644
--- a/src-tauri/src/core/proxy_view.rs
+++ b/src-tauri/src/core/proxy_view.rs
@@ -7,10 +7,17 @@ use tauri_plugin_mihomo::models::{
pub struct ProxyViewInput {
pub runtime_group_order: Vec,
+ pub group_scopes: BTreeMap,
pub proxies: Proxies,
pub providers: Option,
}
+/// The providers a group draws from (Mihomo order) and its `exclude-type` entries.
+pub struct GroupScope {
+ pub providers: Vec,
+ pub exclude_types: Vec,
+}
+
pub struct ProxyViewBuilder;
#[derive(Debug, PartialEq, Eq, Serialize)]
@@ -167,15 +174,41 @@ pub struct ProxySubscriptionInfo {
pub expire: i64,
}
+/// Proxy name -> `(provider name, record id)` in provider order.
+type ProviderCandidates = BTreeMap>;
+
struct MemberResolver<'a> {
group_names: BTreeSet,
+ group_scopes: &'a BTreeMap,
+ records: &'a BTreeMap,
core_node_ids: &'a BTreeMap,
- provider_candidates: &'a BTreeMap>,
+ provider_candidates: &'a ProviderCandidates,
provider_available: bool,
}
-impl MemberResolver<'_> {
- fn resolve(&self, name: String) -> ProxyMemberRef {
+impl<'a> MemberResolver<'a> {
+ /// Same-name records in the order Mihomo lists them in `group`: `use` order, after `exclude-type`.
+ fn scoped_candidates(&self, group: &str, name: &str) -> Vec<&'a String> {
+ let (Some(scope), Some(candidates)) = (self.group_scopes.get(group), self.provider_candidates.get(name)) else {
+ return Vec::new();
+ };
+ scope
+ .providers
+ .iter()
+ .flat_map(|provider| candidates.iter().filter(move |(owner, _)| owner == provider))
+ .map(|(_, record_id)| record_id)
+ .filter(|record_id| {
+ !self.records.get(*record_id).is_some_and(|node| {
+ scope
+ .exclude_types
+ .iter()
+ .any(|excluded| excluded.eq_ignore_ascii_case(node.proxy_type.as_str()))
+ })
+ })
+ .collect()
+ }
+
+ fn resolve(&self, name: String, scoped: Option<&String>) -> ProxyMemberRef {
if self.group_names.contains(&name) {
ProxyMemberRef::Group { name }
} else if let Some(record_id) = self.core_node_ids.get(&name) {
@@ -189,16 +222,17 @@ impl MemberResolver<'_> {
reason: ProxyMemberUnresolvedReason::ProviderUnavailable,
}
} else {
- match self.provider_candidates.get(&name).map(Vec::as_slice) {
- Some([record_id]) => ProxyMemberRef::Node {
+ let candidates = self.provider_candidates.get(&name).map_or(&[][..], Vec::as_slice);
+ match (scoped, candidates) {
+ (Some(record_id), _) | (None, [(_, record_id)]) => ProxyMemberRef::Node {
name,
record_id: record_id.clone(),
},
- None => ProxyMemberRef::Unresolved {
+ (None, []) => ProxyMemberRef::Unresolved {
name,
reason: ProxyMemberUnresolvedReason::Missing,
},
- Some(_) => ProxyMemberRef::Unresolved {
+ (None, _) => ProxyMemberRef::Unresolved {
name,
reason: ProxyMemberUnresolvedReason::Ambiguous,
},
@@ -211,6 +245,7 @@ impl ProxyViewBuilder {
pub fn build(input: ProxyViewInput) -> ProxyViewV1 {
let ProxyViewInput {
runtime_group_order,
+ group_scopes,
proxies,
providers,
} = input;
@@ -224,6 +259,8 @@ impl ProxyViewBuilder {
let (providers, provider_candidates) = build_provider_records(providers, &mut records);
let resolver = MemberResolver {
group_names: core_groups.keys().cloned().collect(),
+ group_scopes: &group_scopes,
+ records: &records,
core_node_ids: &core_node_ids,
provider_candidates: &provider_candidates,
provider_available: provider_state == ProxyViewProviderState::Ready,
@@ -291,7 +328,7 @@ fn build_core_records(
fn build_provider_records(
providers: Option,
records: &mut BTreeMap,
-) -> (Vec, BTreeMap>) {
+) -> (Vec, ProviderCandidates) {
let providers = providers
.map(|providers| providers.providers.into_iter().collect::>())
.unwrap_or_default();
@@ -322,7 +359,7 @@ fn build_provider_records(
candidates
.entry(proxy_name.clone())
.or_insert_with(Vec::new)
- .push(record_id.clone());
+ .push((provider_name.clone(), record_id.clone()));
records.insert(
record_id.clone(),
build_node(
@@ -373,6 +410,20 @@ fn build_group(name: String, proxy: Proxy, resolver: &MemberResolver<'_>) -> Pro
proxy_type,
..
} = proxy;
+ // The n-th occurrence of a name in `all` is the n-th scoped candidate.
+ let mut seen = BTreeMap::)>::new();
+ let members = all
+ .unwrap_or_default()
+ .into_iter()
+ .map(|member| {
+ let (occurrence, scoped) = seen
+ .entry(member.clone())
+ .or_insert_with(|| (0, resolver.scoped_candidates(&name, &member)));
+ let picked = scoped.get(*occurrence).or_else(|| scoped.first()).copied();
+ *occurrence += 1;
+ resolver.resolve(member, picked)
+ })
+ .collect();
ProxyGroupView {
name,
@@ -391,11 +442,7 @@ fn build_group(name: String, proxy: Proxy, resolver: &MemberResolver<'_>) -> Pro
mptcp,
smux,
},
- members: all
- .unwrap_or_default()
- .into_iter()
- .map(|name| resolver.resolve(name))
- .collect(),
+ members,
}
}
@@ -475,303 +522,3 @@ fn build_standalone(core_node_ids: &BTreeMap) -> Vec {
);
standalone
}
-
-#[cfg(test)]
-#[allow(clippy::expect_used)]
-mod tests {
- use std::collections::HashMap;
-
- use tauri_plugin_mihomo::models::{
- Proxies, Proxy, ProxyProvider, ProxyProviders, ProxyType, SubScriptionInfo, VehicleType,
- };
-
- use super::{
- ProxyMemberRef, ProxyMemberUnresolvedReason, ProxyNodeSource, ProxyViewBuilder, ProxyViewInput,
- ProxyViewOrderSource, ProxyViewProviderState,
- };
-
- fn node(name: &str) -> Proxy {
- Proxy {
- name: name.to_owned(),
- proxy_type: ProxyType::Shadowsocks,
- alive: true,
- udp: true,
- ..Proxy::default()
- }
- }
-
- fn group(name: &str, members: &[&str]) -> Proxy {
- Proxy {
- name: format!("ignored-{name}"),
- proxy_type: ProxyType::Selector,
- alive: true,
- all: Some(members.iter().map(|name| (*name).to_owned()).collect()),
- ..Proxy::default()
- }
- }
-
- fn ordered_input(reverse_insert: bool) -> ProxyViewInput {
- let entries = [
- ("Zulu", group("Zulu", &["node-b", "node-b"])),
- ("Alpha", group("Alpha", &["node-a"])),
- ("node-b", node("wrong-node-b")),
- ("node-a", node("wrong-node-a")),
- ("A-before-direct", node("wrong-before-direct")),
- ("DIRECT", node("wrong-direct")),
- ("REJECT", node("wrong-reject")),
- ];
- let mut proxies = HashMap::new();
- if reverse_insert {
- proxies.extend(entries.into_iter().rev().map(|(name, proxy)| (name.to_owned(), proxy)));
- } else {
- proxies.extend(entries.into_iter().map(|(name, proxy)| (name.to_owned(), proxy)));
- }
-
- ProxyViewInput {
- runtime_group_order: vec!["Zulu".into(), "Alpha".into()],
- proxies: Proxies { proxies },
- providers: None,
- }
- }
-
- fn providers_fixture(entries: Vec<(&str, VehicleType, &[&str])>) -> ProxyProviders {
- let providers = entries
- .into_iter()
- .map(|(provider_key, vehicle_type, names)| {
- let provider = ProxyProvider {
- name: format!("ignored-{provider_key}"),
- vehicle_type,
- proxies: names.iter().map(|name| node(name)).collect(),
- ..ProxyProvider::default()
- };
- (provider_key.to_owned(), provider)
- })
- .collect();
-
- ProxyProviders { providers }
- }
-
- fn input_with_members_and_duplicate_providers() -> ProxyViewInput {
- let proxies = HashMap::from([("Group".to_owned(), group("ignored", &["duplicate"]))]);
- ProxyViewInput {
- runtime_group_order: vec![],
- proxies: Proxies { proxies },
- providers: Some(providers_fixture(vec![
- ("a", VehicleType::HTTP, &["duplicate"]),
- ("b", VehicleType::File, &["duplicate"]),
- ])),
- }
- }
-
- fn input_with_provider_member(providers: Option) -> ProxyViewInput {
- let proxies = HashMap::from([("Group".to_owned(), group("ignored", &["provider-only"]))]);
- ProxyViewInput {
- runtime_group_order: vec![],
- proxies: Proxies { proxies },
- providers,
- }
- }
-
- fn input_with_provider_duplicates() -> ProxyViewInput {
- ProxyViewInput {
- runtime_group_order: vec![],
- proxies: Proxies::default(),
- providers: Some(providers_fixture(vec![
- ("z-provider", VehicleType::HTTP, &["z-node"]),
- ("unsupported", VehicleType::Compatible, &["ignored"]),
- ("a-provider", VehicleType::File, &["same", "same"]),
- ])),
- }
- }
-
- fn serde_input_with_provider() -> ProxyViewInput {
- let provider = ProxyProvider {
- name: "ignored-object-name".to_owned(),
- vehicle_type: VehicleType::HTTP,
- updated_at: None,
- subscription_info: Some(SubScriptionInfo {
- upload: 1,
- download: 2,
- total: 3,
- expire: 4,
- }),
- ..ProxyProvider::default()
- };
-
- ProxyViewInput {
- runtime_group_order: vec![],
- proxies: Proxies::default(),
- providers: Some(ProxyProviders {
- providers: HashMap::from([("provider-key".to_owned(), provider)]),
- }),
- }
- }
-
- #[test]
- fn ordering_and_core_records_are_deterministic() {
- let first = ProxyViewBuilder::build(ordered_input(false));
- let second = ProxyViewBuilder::build(ordered_input(true));
-
- assert_eq!(first, second);
- assert_eq!(first.order_source, ProxyViewOrderSource::Runtime);
- assert_eq!(
- first.groups.iter().map(|group| group.name.as_str()).collect::>(),
- ["Zulu", "Alpha"]
- );
- assert_eq!(first.direct.as_deref(), Some("c:1"));
- assert_eq!(first.standalone, ["c:1", "c:2", "c:0", "c:3", "c:4"]);
- assert_eq!(first.records["c:0"].name, "A-before-direct");
- assert_eq!(first.records["c:1"].name, "DIRECT");
- assert_eq!(first.records["c:4"].name, "node-b");
- assert_eq!(first.groups[0].members.len(), 2);
- assert!(matches!(
- &first.groups[0].members[0],
- ProxyMemberRef::Node { name, .. } if name == "node-b"
- ));
- assert_eq!(first.groups[0].members[0], first.groups[0].members[1]);
- }
-
- #[test]
- fn fallback_and_unmatched_groups_are_stable() {
- let mut input = ordered_input(false);
- input.runtime_group_order = vec![];
- let view = ProxyViewBuilder::build(input);
- assert_eq!(view.order_source, ProxyViewOrderSource::Fallback);
- assert_eq!(
- view.groups.iter().map(|group| group.name.as_str()).collect::>(),
- ["Alpha", "Zulu"]
- );
-
- let mut input = ordered_input(false);
- input.runtime_group_order = vec!["Missing".into()];
- let view = ProxyViewBuilder::build(input);
- assert_eq!(view.order_source, ProxyViewOrderSource::Fallback);
- assert_eq!(
- view.groups.iter().map(|group| group.name.as_str()).collect::>(),
- ["Alpha", "Zulu"]
- );
-
- let mut input = ordered_input(false);
- input.runtime_group_order = vec!["Zulu".into(), "Zulu".into()];
- let view = ProxyViewBuilder::build(input);
- assert_eq!(
- view.groups.iter().map(|group| group.name.as_str()).collect::>(),
- ["Zulu", "Alpha"]
- );
- }
-
- #[test]
- fn global_and_member_resolution_follow_the_required_priority() {
- let mut proxies = HashMap::new();
- proxies.insert(
- "GLOBAL".into(),
- group("wrong", &["Nested", "core", "provider-only", "missing"]),
- );
- proxies.insert("Nested".into(), group("wrong", &[]));
- proxies.insert("core".into(), node("wrong"));
- let providers = providers_fixture(vec![
- (
- "a",
- VehicleType::HTTP,
- &["Nested", "core", "provider-only", "duplicate"],
- ),
- ("b", VehicleType::File, &["duplicate"]),
- ]);
-
- let view = ProxyViewBuilder::build(ProxyViewInput {
- runtime_group_order: vec![],
- proxies: Proxies { proxies },
- providers: Some(providers),
- });
- let members = &view.global.as_ref().expect("GLOBAL").members;
-
- assert!(matches!(members[0], ProxyMemberRef::Group { ref name } if name == "Nested"));
- assert!(matches!(members[1], ProxyMemberRef::Node { ref name, .. } if name == "core"));
- assert!(matches!(members[2], ProxyMemberRef::Node { ref name, .. } if name == "provider-only"));
- assert!(matches!(
- members[3],
- ProxyMemberRef::Unresolved {
- reason: ProxyMemberUnresolvedReason::Missing,
- ..
- }
- ));
- assert!(!view.groups.iter().any(|group| group.name == "GLOBAL"));
- }
-
- #[test]
- fn ambiguous_and_provider_unavailable_are_not_reported_as_missing() {
- let ready = ProxyViewBuilder::build(input_with_members_and_duplicate_providers());
- assert!(matches!(
- ready.groups[0].members[0],
- ProxyMemberRef::Unresolved {
- reason: ProxyMemberUnresolvedReason::Ambiguous,
- ..
- }
- ));
-
- let unavailable = ProxyViewBuilder::build(input_with_provider_member(None));
- assert!(matches!(
- unavailable.groups[0].members[0],
- ProxyMemberRef::Unresolved {
- reason: ProxyMemberUnresolvedReason::ProviderUnavailable,
- ..
- }
- ));
- assert_eq!(unavailable.provider_state, ProxyViewProviderState::Unavailable);
- assert!(unavailable.providers.is_empty());
- }
-
- #[test]
- fn providers_preserve_identity_duplicates_and_member_order() {
- let view = ProxyViewBuilder::build(input_with_provider_duplicates());
- assert_eq!(
- view.providers
- .iter()
- .map(|provider| provider.name.as_str())
- .collect::>(),
- ["a-provider", "z-provider"]
- );
- assert_eq!(view.providers[0].proxy_record_ids, ["p:0:0", "p:0:1"]);
- assert_eq!(view.records["p:0:0"].name, "same");
- assert_eq!(view.records["p:0:1"].name, "same");
- assert_eq!(
- view.records["p:0:0"].source,
- ProxyNodeSource::Provider {
- provider_name: "a-provider".into(),
- proxy_name: "same".into(),
- }
- );
- }
-
- #[test]
- fn a_successful_response_with_only_unsupported_providers_is_ready_and_empty() {
- let view = ProxyViewBuilder::build(ProxyViewInput {
- runtime_group_order: vec![],
- proxies: Proxies::default(),
- providers: Some(providers_fixture(vec![(
- "unsupported",
- VehicleType::Compatible,
- &["ignored"],
- )])),
- });
-
- assert_eq!(view.provider_state, ProxyViewProviderState::Ready);
- assert!(view.providers.is_empty());
- }
-
- #[test]
- fn serde_matches_the_v1_wire_contract() {
- let view = ProxyViewBuilder::build(serde_input_with_provider());
- let json = serde_json::to_value(view).expect("serialize view");
-
- assert_eq!(json["schemaVersion"], 1);
- assert_eq!(json["orderSource"], "fallback");
- assert_eq!(json["providerState"], "ready");
- assert!(json["global"].is_null());
- assert!(json["direct"].is_null());
- assert!(json["providers"][0].get("vehicleType").is_some());
- assert!(json["providers"][0].get("updatedAt").is_none());
- assert_eq!(json["providers"][0]["subscriptionInfo"]["upload"], 1);
- assert!(json["providers"][0]["subscriptionInfo"].get("Upload").is_none());
- }
-}
diff --git a/src-tauri/src/core/runstate/env.rs b/src-tauri/src/core/runstate/env.rs
index 8d06acbb5..bda09ff5a 100644
--- a/src-tauri/src/core/runstate/env.rs
+++ b/src-tauri/src/core/runstate/env.rs
@@ -29,11 +29,11 @@ impl RunStateEnv for RealEnv {
async fn probe_service_version(&self) -> Result {
// The IPC client would otherwise back off for about two minutes before failing.
#[cfg(windows)]
- if tokio::task::spawn_blocking(crate::core::service::service_stopped)
+ if let Some(reason) = tokio::task::spawn_blocking(crate::core::service::service_stop_reason)
.await
.context("service status probe did not finish")??
{
- anyhow::bail!("the Windows service is not running");
+ anyhow::bail!(reason);
}
let response = clash_verge_service_ipc::get_version().await?;
let core = if response.code == 0
diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs
index e54eb9d55..095938231 100644
--- a/src-tauri/src/core/service.rs
+++ b/src-tauri/src/core/service.rs
@@ -50,6 +50,15 @@ static PENDING_SERVICE_OWNER_NOTICE: Mutex