From f2339620a57fc3c22b8218cdf1c4b52f17bc1724 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 21:19:13 +0800 Subject: [PATCH 1/9] chore(deps): update cargo dependencies (#4468) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- src-tauri/Cargo.lock | 35 ++++++++++++++++++----------------- src-tauri/Cargo.toml | 12 ++++++------ 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 93db7783..c11d1602 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4862,9 +4862,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" @@ -5692,9 +5692,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -6870,9 +6870,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.8.2" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a54629607ea3084a8b455c1ebe888cbdfc4de02fa5edb2e40db0dc97091007e3" +checksum = "5d545ccf7b60dcd44e07c6fb5aeb09140966f0aabd5d2aa14a6821df7bc99348" dependencies = [ "anyhow", "bytes", @@ -7034,11 +7034,12 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fec67f32d7a06d80bd3dc009fdb678c35a66116d9cb8cd2bb32e406c2b5bbd2" +checksum = "6d430110d4ee102a9b673d3c03ff48098c80fe8ca71ba1ff52d8a5919538a1a6" dependencies = [ "dunce", + "plist", "rust-ini", "serde", "serde_json", @@ -7136,13 +7137,13 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe06ed89cff6d0ec06ff4f544fb961e4718348a33309f56ccb2086e77bc9116" +checksum = "d2fbc86b929b5376ab84b25c060f966d146b2fbd59b6af8264027b343c82c219" dependencies = [ "log", "notify-rust", - "rand 0.8.5", + "rand 0.9.2", "serde", "serde_json", "serde_repr", @@ -7165,9 +7166,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b9ffadec5c3523f11e8273465cacb3d86ea7652a28e6e2a2e9b5c182f791d25" +checksum = "54777d0c0d8add34eea3ced84378619ef5b97996bd967d3038c668feefd21071" dependencies = [ "encoding_rs", "log", @@ -7258,9 +7259,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb0f10f831f75832ac74d14d98f701868f9a8adccef2c249b466cf70b607db9" +checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807" dependencies = [ "gtk", "http 1.3.1", @@ -9290,9 +9291,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wry" -version = "0.53.1" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5698e50a589268aec06d2219f48b143222f7b5ad9aa690118b8dce0a8dcac574" +checksum = "e3b6763512fe4b51c80b3ce9b50939d682acb4de335dfabbdb20d7a2642199b7" dependencies = [ "base64 0.22.1", "block2 0.6.1", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f5000600..659850ab 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -33,7 +33,7 @@ once_cell = "1.21.3" port_scanner = "0.1.5" delay_timer = "0.11.6" parking_lot = "0.12.4" -percent-encoding = "2.3.1" +percent-encoding = "2.3.2" tokio = { version = "1.47.1", features = [ "rt-multi-thread", "macros", @@ -42,9 +42,9 @@ tokio = { version = "1.47.1", features = [ ] } serde = { version = "1.0.219", features = ["derive"] } reqwest = { version = "0.12.23", features = ["json", "rustls-tls", "cookies"] } -regex = "1.11.1" +regex = "1.11.2" sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs" } -tauri = { version = "2.8.2", features = [ +tauri = { version = "2.8.4", features = [ "protocol-asset", "devtools", "tray-icon", @@ -52,12 +52,12 @@ tauri = { version = "2.8.2", features = [ "image-png", ] } network-interface = { version = "2.0.3", features = ["serde"] } -tauri-plugin-shell = "2.3.0" +tauri-plugin-shell = "2.3.1" tauri-plugin-dialog = "2.3.3" tauri-plugin-fs = "2.4.2" tauri-plugin-process = "2.3.0" tauri-plugin-clipboard-manager = "2.3.0" -tauri-plugin-deep-link = "2.4.1" +tauri-plugin-deep-link = "2.4.2" tauri-plugin-devtools = "2.0.1" tauri-plugin-window-state = "2.4.0" zip = "=4.2.0" @@ -75,7 +75,7 @@ hex = "0.4.3" scopeguard = "1.2.0" kode-bridge = "0.2.1-rc1" dashmap = "6.1.0" -tauri-plugin-notification = "2.3.0" +tauri-plugin-notification = "2.3.1" console-subscriber = { version = "0.4.1", optional = true } tokio-stream = "0.1.17" From 040fcd059f4ecc213519f945f38b4fc5f394a8ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 21:19:22 +0800 Subject: [PATCH 2/9] chore(deps): update npm dependencies (#4467) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 28 +-- pnpm-lock.yaml | 563 ++++++++++++++++++++++++------------------------- 2 files changed, 292 insertions(+), 299 deletions(-) diff --git a/package.json b/package.json index 9a064863..aeadc73f 100644 --- a/package.json +++ b/package.json @@ -43,18 +43,18 @@ "@tauri-apps/plugin-clipboard-manager": "^2.3.0", "@tauri-apps/plugin-dialog": "^2.3.3", "@tauri-apps/plugin-fs": "^2.4.2", - "@tauri-apps/plugin-notification": "^2.3.0", + "@tauri-apps/plugin-notification": "^2.3.1", "@tauri-apps/plugin-process": "^2.3.0", - "@tauri-apps/plugin-shell": "2.3.0", + "@tauri-apps/plugin-shell": "2.3.1", "@tauri-apps/plugin-updater": "2.9.0", "@types/json-schema": "^7.0.15", - "ahooks": "^3.9.3", + "ahooks": "^3.9.4", "axios": "^1.11.0", "cli-color": "^2.0.4", "dayjs": "1.11.13", "foxact": "^0.2.49", "glob": "^11.0.3", - "i18next": "^25.4.0", + "i18next": "^25.4.2", "js-yaml": "^4.1.0", "json-schema": "^0.4.0", "lodash-es": "^4.17.21", @@ -65,10 +65,10 @@ "react-dom": "19.1.1", "react-error-boundary": "6.0.0", "react-hook-form": "^7.62.0", - "react-i18next": "15.7.0", + "react-i18next": "15.7.2", "react-markdown": "10.1.0", "react-monaco-editor": "0.59.0", - "react-router-dom": "7.8.1", + "react-router-dom": "7.8.2", "react-virtuoso": "^4.14.0", "sockette": "^2.0.6", "swr": "^2.3.6", @@ -78,18 +78,18 @@ }, "devDependencies": { "@actions/github": "^6.0.1", - "@eslint/js": "^9.33.0", - "@tauri-apps/cli": "2.8.1", + "@eslint/js": "^9.34.0", + "@tauri-apps/cli": "2.8.3", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", - "@types/react": "19.1.10", - "@types/react-dom": "19.1.7", + "@types/react": "19.1.11", + "@types/react-dom": "19.1.8", "@vitejs/plugin-legacy": "^7.2.1", "@vitejs/plugin-react": "5.0.1", "adm-zip": "^0.5.16", "commander": "^14.0.0", "cross-env": "^10.0.0", - "eslint": "^9.33.0", + "eslint": "^9.34.0", "eslint-plugin-react": "^7.37.5", "globals": "^16.3.0", "https-proxy-agent": "^7.0.6", @@ -97,13 +97,13 @@ "meta-json-schema": "^1.19.12", "node-fetch": "^3.3.2", "prettier": "^3.6.2", - "sass": "^1.90.0", + "sass": "^1.91.0", "terser": "^5.43.1", "typescript": "^5.9.2", - "typescript-eslint": "^8.40.0", + "typescript-eslint": "^8.41.0", "vite": "^7.1.3", "vite-plugin-monaco-editor": "^1.1.0", - "vite-plugin-svgr": "^4.3.0" + "vite-plugin-svgr": "^4.5.0" }, "type": "module", "packageManager": "pnpm@9.13.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd54f9ee..718289bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,25 +19,25 @@ importers: version: 3.2.2(react@19.1.1) '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@19.1.10)(react@19.1.1) + version: 11.14.0(@types/react@19.1.11)(react@19.1.1) '@emotion/styled': specifier: ^11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) '@juggle/resize-observer': specifier: ^3.4.0 version: 3.4.0 '@mui/icons-material': specifier: ^7.3.1 - version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) '@mui/lab': specifier: 7.0.0-beta.16 - version: 7.0.0-beta.16(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.0.0-beta.16(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/material': specifier: ^7.3.1 - version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/x-data-grid': specifier: ^8.10.2 - version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tauri-apps/api': specifier: 2.8.0 version: 2.8.0 @@ -51,14 +51,14 @@ importers: specifier: ^2.4.2 version: 2.4.2 '@tauri-apps/plugin-notification': - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.3.1 + version: 2.3.1 '@tauri-apps/plugin-process': specifier: ^2.3.0 version: 2.3.0 '@tauri-apps/plugin-shell': - specifier: 2.3.0 - version: 2.3.0 + specifier: 2.3.1 + version: 2.3.1 '@tauri-apps/plugin-updater': specifier: 2.9.0 version: 2.9.0 @@ -66,8 +66,8 @@ importers: specifier: ^7.0.15 version: 7.0.15 ahooks: - specifier: ^3.9.3 - version: 3.9.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^3.9.4 + version: 3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) axios: specifier: ^1.11.0 version: 1.11.0 @@ -84,8 +84,8 @@ importers: specifier: ^11.0.3 version: 11.0.3 i18next: - specifier: ^25.4.0 - version: 25.4.0(typescript@5.9.2) + specifier: ^25.4.2 + version: 25.4.2(typescript@5.9.2) js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -117,17 +117,17 @@ importers: specifier: ^7.62.0 version: 7.62.0(react@19.1.1) react-i18next: - specifier: 15.7.0 - version: 15.7.0(i18next@25.4.0(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: 15.7.2 + version: 15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) react-markdown: specifier: 10.1.0 - version: 10.1.0(@types/react@19.1.10)(react@19.1.1) + version: 10.1.0(@types/react@19.1.11)(react@19.1.1) react-monaco-editor: specifier: 0.59.0 version: 0.59.0(monaco-editor@0.52.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-router-dom: - specifier: 7.8.1 - version: 7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 7.8.2 + version: 7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-virtuoso: specifier: ^4.14.0 version: 4.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -145,17 +145,17 @@ importers: version: 1.0.3 zustand: specifier: ^5.0.8 - version: 5.0.8(@types/react@19.1.10)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + version: 5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) devDependencies: '@actions/github': specifier: ^6.0.1 version: 6.0.1 '@eslint/js': - specifier: ^9.33.0 - version: 9.33.0 + specifier: ^9.34.0 + version: 9.34.0 '@tauri-apps/cli': - specifier: 2.8.1 - version: 2.8.1 + specifier: 2.8.3 + version: 2.8.3 '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 @@ -163,17 +163,17 @@ importers: specifier: ^4.17.12 version: 4.17.12 '@types/react': - specifier: 19.1.10 - version: 19.1.10 + specifier: 19.1.11 + version: 19.1.11 '@types/react-dom': - specifier: 19.1.7 - version: 19.1.7(@types/react@19.1.10) + specifier: 19.1.8 + version: 19.1.8(@types/react@19.1.11) '@vitejs/plugin-legacy': specifier: ^7.2.1 - version: 7.2.1(terser@5.43.1)(vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1)) + version: 7.2.1(terser@5.43.1)(vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1)) '@vitejs/plugin-react': specifier: 5.0.1 - version: 5.0.1(vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1)) + version: 5.0.1(vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1)) adm-zip: specifier: ^0.5.16 version: 0.5.16 @@ -184,11 +184,11 @@ importers: specifier: ^10.0.0 version: 10.0.0 eslint: - specifier: ^9.33.0 - version: 9.33.0(jiti@2.5.1) + specifier: ^9.34.0 + version: 9.34.0(jiti@2.5.1) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.33.0(jiti@2.5.1)) + version: 7.37.5(eslint@9.34.0(jiti@2.5.1)) globals: specifier: ^16.3.0 version: 16.3.0 @@ -208,8 +208,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 sass: - specifier: ^1.90.0 - version: 1.90.0 + specifier: ^1.91.0 + version: 1.91.0 terser: specifier: ^5.43.1 version: 5.43.1 @@ -217,17 +217,17 @@ importers: specifier: ^5.9.2 version: 5.9.2 typescript-eslint: - specifier: ^8.40.0 - version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ^8.41.0 + version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) vite: specifier: ^7.1.3 - version: 7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1) + version: 7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1) vite-plugin-monaco-editor: specifier: ^1.1.0 version: 1.1.0(monaco-editor@0.52.2) vite-plugin-svgr: - specifier: ^4.3.0 - version: 4.3.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1)) + specifier: ^4.5.0 + version: 4.5.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1)) packages: @@ -1003,8 +1003,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.33.0': - resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} + '@eslint/js@9.34.0': + resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -1363,8 +1363,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.32': resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1543,74 +1543,74 @@ packages: '@tauri-apps/api@2.8.0': resolution: {integrity: sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==} - '@tauri-apps/cli-darwin-arm64@2.8.1': - resolution: {integrity: sha512-301XWcDozcvJ79uMRquSvgI4vvAxetFs+reMpBI1U5mSWixjUqxZjxs9UDJAtE+GFXdGYTjSLUxCKe5WBDKZ/A==} + '@tauri-apps/cli-darwin-arm64@2.8.3': + resolution: {integrity: sha512-+X/DjTlH9ZLT9kWrU+Mk9TSu8vVpv30GgfAOKUxlCQobaRSOzN0cxgZfRcgWaDLu80/gWsJ7Ktk9jLfJ9h9CVA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.8.1': - resolution: {integrity: sha512-fJpOD/jWNy3sn27mjPGexBxGPTCgoCu29C+7qBV8kKJQGrRB4/zJk2zMqcKMjV/1Dma47n+saQWXLFwGpRUHgQ==} + '@tauri-apps/cli-darwin-x64@2.8.3': + resolution: {integrity: sha512-Bs+DK+gGinSj373DEeAuZMUrvTE1m7X5Ef2jC2lU2X8ZhQf4VBV+gNMRoOlSuwIlSTU2eKDQsExtKeFFSpbc8A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.8.1': - resolution: {integrity: sha512-BcrZiInB3xjdV/Q2yv88aAz4Ajrxomd1+oePUO8ZWVpdhFwMZaAAOMbpPVgrlanGBeSzU7Aim9i1Opz/+JYiDA==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.8.3': + resolution: {integrity: sha512-9pri7KWES6x0M0DWCr5RIsGtXD4yy83Zsf8xuSmn8z6xboFquSnfJZmFsfPz25G8awLFIhxUkxP0YtZGiIUy7g==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.8.1': - resolution: {integrity: sha512-uZXaQrcdk55h4qWSe3pngg6LMUwVUIoluxXG/cmKHeq8LddlUdKpj3OaSPahLWip1Ol6hq14ysvywzsrdhM4kA==} + '@tauri-apps/cli-linux-arm64-gnu@2.8.3': + resolution: {integrity: sha512-2+qRdUgnFJ7pDW69dFZxYduWEZPya3U2YA6GaDhrYTHBq8/ypPSpuUT+BZ6n9r68+ij7tFMTj+vwNDgNp3M/0w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.8.1': - resolution: {integrity: sha512-VK/zwBzQY9SfyK7RSrxlIRQLJyhyssoByYWPK/FJMre8SV/y8zZ071cTQNG9dPWM1f+onI1WPTleG+TBUq/0Gw==} + '@tauri-apps/cli-linux-arm64-musl@2.8.3': + resolution: {integrity: sha512-DJHW1vcqmLMqZCBiu9qv7/oYAygNC6xvrxwrUWvWMvaz/qKNy9NVXZm/EUx+sLTCcOxWHyJe+CII1kW3ouI18Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-riscv64-gnu@2.8.1': - resolution: {integrity: sha512-bFw3zK6xkyurDR5kw2QgiU6YFlFNrfgtli3wRdTRv8zSVLZMQ2iZ8keYnd57vpvsbZ9PusFPYAMS7Fkzkf9I4g==} + '@tauri-apps/cli-linux-riscv64-gnu@2.8.3': + resolution: {integrity: sha512-+CbLaQXAqd5lPJnfXGyitbgp/q5mnsvCoToGspeVMBYNGd04ES/6XDEcXH7EwNCTgXBTJVRYf3qhI8a8/x31Aw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.8.1': - resolution: {integrity: sha512-zOnFX+Rppuz0UVVSeCi67lMet8le+yT4UIiQ6t/QYGtpoWO/D4GpMoVYehJlR14klNXrC2CRxT9b3BUWTCEBwA==} + '@tauri-apps/cli-linux-x64-gnu@2.8.3': + resolution: {integrity: sha512-FGjLnA+3PTJwoN5KEMAi6Q8I6SkuW5w8qSFKldGx2Mma8GqtttXqIDw1BzxcIw/LMcr6JrxjbIRULzmV05q/QA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.8.1': - resolution: {integrity: sha512-gLy6eisaeOTC6NQirs3a0XZNCVT/i7JPYHkXx6ArH6+Kb9IU8ogthTY4MQoYbkWmdOp3ijKX+RT1dD3IZURrEg==} + '@tauri-apps/cli-linux-x64-musl@2.8.3': + resolution: {integrity: sha512-tWRX3rQJCeUq9mR0Rc0tUV+pdgGL94UqVIzPn0/VmhDehdiDouRdXOUPggJrYUz2Aj/4RvVa83J6B8Hg37s8RQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-win32-arm64-msvc@2.8.1': - resolution: {integrity: sha512-ciZ93Dm847zFDqRyc1e0YRiu/cdWne1bMhvifcZOibbyqSKB9o+b95Y5axMtXqR4Wsd2mHiC5TE+MVF3NDsdEw==} + '@tauri-apps/cli-win32-arm64-msvc@2.8.3': + resolution: {integrity: sha512-UQHDmbSMIeWs/Yr3KmtfZFs5m6b+NWUe2+NE7fHu3o4EzPrvNa/Uf4U2XsYKOr0V/yetxZH0/fc+xovcnsqyqA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.8.1': - resolution: {integrity: sha512-uWUa503Pw53XidUvcqWOvVsBY7vpQs+ZlTyQgXSnPuTiMF1l5bFEzqoHMvZfIL3MFG13xCAqVK1bR7lFB/6qMQ==} + '@tauri-apps/cli-win32-ia32-msvc@2.8.3': + resolution: {integrity: sha512-aIP38i2KeADboPD1wsBFYdodEQ9PIJe0HW2urd3ocHpGxF8gX/KMiGOwGVSobu9gFlCpFNoVwCX6J1S5pJCRIQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.8.1': - resolution: {integrity: sha512-KmiT0vI7FMBWfk5YDQg7+WcjzuMdeaHOQ7H0podZ7lyJg2qo2DpbGp8y+fMVCRsmvQx5bW6Cyh1ArfO1kkUInA==} + '@tauri-apps/cli-win32-x64-msvc@2.8.3': + resolution: {integrity: sha512-Z+H+PwK+3yMffG1rN7iqs+uPo6FkPyHJ4MTtFhnEvvGzc3aH711bwFb6+PXwMXfOb/jPR/LB+o6kEXghBu9ynQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.8.1': - resolution: {integrity: sha512-ONVAfI7PFUO6MdSq9dh2YwlIb1cAezrzqrWw2+TChVskoqzDyyzncU7yXlcph/H/nR/kNDEY3E1pC8aV3TVCNQ==} + '@tauri-apps/cli@2.8.3': + resolution: {integrity: sha512-5IlcOtVBI6HYcTRFH4tuLZV+FX09Psi4Xi+TyFf/S8T8w+ZzPNnrehHz6KUGRbuXHfJhtmRDoUULXNEhpdVkfA==} engines: {node: '>= 10'} hasBin: true @@ -1623,14 +1623,14 @@ packages: '@tauri-apps/plugin-fs@2.4.2': resolution: {integrity: sha512-YGhmYuTgXGsi6AjoV+5mh2NvicgWBfVJHHheuck6oHD+HC9bVWPaHvCP0/Aw4pHDejwrvT8hE3+zZAaWf+hrig==} - '@tauri-apps/plugin-notification@2.3.0': - resolution: {integrity: sha512-QDwXo9VzAlH97c0veuf19TZI6cRBPfJDl2O6hNEDvI66j60lOO9z+PL6MJrj8A6Y+t55r7mGhe3rQWLmOre2HA==} + '@tauri-apps/plugin-notification@2.3.1': + resolution: {integrity: sha512-7gqgfANSREKhh35fY1L4j3TUjUdePmU735FYDqRGeIf8nMXWpcx6j4FhN9/4nYz+m0mv79DCTPLqIPTySggGgg==} '@tauri-apps/plugin-process@2.3.0': resolution: {integrity: sha512-0DNj6u+9csODiV4seSxxRbnLpeGYdojlcctCuLOCgpH9X3+ckVZIEj6H7tRQ7zqWr7kSTEWnrxtAdBb0FbtrmQ==} - '@tauri-apps/plugin-shell@2.3.0': - resolution: {integrity: sha512-6GIRxO2z64uxPX4CCTuhQzefvCC0ew7HjdBhMALiGw74vFBDY95VWueAHOHgNOMV4UOUAFupyidN9YulTe5xlA==} + '@tauri-apps/plugin-shell@2.3.1': + resolution: {integrity: sha512-jjs2WGDO/9z2pjNlydY/F5yYhNsscv99K5lCmU5uKjsVvQ3dRlDhhtVYoa4OLDmktLtQvgvbQjCFibMl6tgGfw==} '@tauri-apps/plugin-updater@2.9.0': resolution: {integrity: sha512-j++sgY8XpeDvzImTrzWA08OqqGqgkNyxczLD7FjNJJx/uXxMZFz5nDcfkyoI/rCjYuj2101Tci/r/HFmOmoxCg==} @@ -1683,8 +1683,8 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@19.1.7': - resolution: {integrity: sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==} + '@types/react-dom@19.1.8': + resolution: {integrity: sha512-xG7xaBMJCpcK0RpN8jDbAACQo54ycO6h4dSSmgv8+fu6ZIAdANkx/WsawASUjVXYfy+J9AbUpRMNNEsXCDfDBQ==} peerDependencies: '@types/react': ^19.0.0 @@ -1693,8 +1693,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@19.1.10': - resolution: {integrity: sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==} + '@types/react@19.1.11': + resolution: {integrity: sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1702,63 +1702,63 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.40.0': - resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + '@typescript-eslint/eslint-plugin@8.41.0': + resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.40.0 + '@typescript-eslint/parser': ^8.41.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.40.0': - resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} + '@typescript-eslint/parser@8.41.0': + resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.40.0': - resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} + '@typescript-eslint/project-service@8.41.0': + resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.40.0': - resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} + '@typescript-eslint/scope-manager@8.41.0': + resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.40.0': - resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} + '@typescript-eslint/tsconfig-utils@8.41.0': + resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.40.0': - resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + '@typescript-eslint/type-utils@8.41.0': + resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.40.0': - resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} + '@typescript-eslint/types@8.41.0': + resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.40.0': - resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} + '@typescript-eslint/typescript-estree@8.41.0': + resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.40.0': - resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + '@typescript-eslint/utils@8.41.0': + resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.40.0': - resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} + '@typescript-eslint/visitor-keys@8.41.0': + resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -1782,11 +1782,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -1800,8 +1795,8 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - ahooks@3.9.3: - resolution: {integrity: sha512-pw4oNW9at8c/EDpZEQY/2rcU1NQw1GOzw6CUlDPMKUp1hh79NZVfPxgUUhUVKs8Dr48GWYC5ILovuQSO5CeH0A==} + ahooks@3.9.4: + resolution: {integrity: sha512-NkbX0mamCz4aBX27mZnObbzqcM9S4fzpjVf/6yOvmHh+McBo74xQw5Yz5ry4q2cLMkfNUjhe2q3M5RpjfMVu4g==} engines: {node: '>=18'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -2225,8 +2220,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.33.0: - resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} + eslint@9.34.0: + resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2467,8 +2462,8 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - i18next@25.4.0: - resolution: {integrity: sha512-UH5aiamXsO3cfrZFurCHiB6YSs3C+s+XY9UaJllMMSbmaoXILxFgqDEZu4NbfzJFjmUo3BNMa++Rjkr3ofjfLw==} + i18next@25.4.2: + resolution: {integrity: sha512-gD4T25a6ovNXsfXY1TwHXXXLnD/K2t99jyYMCSimSCBnBRJVQr5j+VAaU83RJCPzrTGhVQ6dqIga66xO2rtd5g==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -3093,10 +3088,10 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@15.7.0: - resolution: {integrity: sha512-hogS6K+7hJnGN1k5hpxcY0x3SnQ30K2Cj9PMKSwP8lqyhfbj7DEdjFhc7tXh9+z+npDQaxvPCGnpkRmCnRNCcQ==} + react-i18next@15.7.2: + resolution: {integrity: sha512-xJxq7ibnhUlMvd82lNC4te1GxGUMoM1A05KKyqoqsBXVZtEvZg/fz/fnVzdlY/hhQ3SpP/79qCocZOtICGhd3g==} peerDependencies: - i18next: '>= 23.2.3' + i18next: '>= 25.4.1' react: '>= 16.8.0' react-dom: '*' react-native: '*' @@ -3132,15 +3127,15 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@7.8.1: - resolution: {integrity: sha512-NkgBCF3sVgCiAWIlSt89GR2PLaksMpoo3HDCorpRfnCEfdtRPLiuTf+CNXvqZMI5SJLZCLpVCvcZrTdtGW64xQ==} + react-router-dom@7.8.2: + resolution: {integrity: sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.8.1: - resolution: {integrity: sha512-5cy/M8DHcG51/KUIka1nfZ2QeylS4PJRs6TT8I4PF5axVsI5JUxp0hC0NZ/AEEj8Vw7xsEoD7L/6FY+zoYaOGA==} + react-router@7.8.2: + resolution: {integrity: sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -3247,8 +3242,8 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - sass@1.90.0: - resolution: {integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==} + sass@1.91.0: + resolution: {integrity: sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==} engines: {node: '>=14.0.0'} hasBin: true @@ -3478,8 +3473,8 @@ packages: types-pac@1.0.3: resolution: {integrity: sha512-MF2UAZGvGMOM+vHi9Zj/LvQqdNN1m1xSB+PjAW9B/GvFqaB4GwR18YaIbGIGDRTW/J8iqFXQHLZd5eJVtho46w==} - typescript-eslint@8.40.0: - resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} + typescript-eslint@8.41.0: + resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3560,8 +3555,8 @@ packages: peerDependencies: monaco-editor: '>=0.33.0' - vite-plugin-svgr@4.3.0: - resolution: {integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==} + vite-plugin-svgr@4.5.0: + resolution: {integrity: sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==} peerDependencies: vite: '>=2.6.0' @@ -4449,7 +4444,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1)': + '@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 @@ -4461,7 +4456,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 transitivePeerDependencies: - supports-color @@ -4475,18 +4470,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.1) '@emotion/utils': 1.4.2 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 transitivePeerDependencies: - supports-color @@ -4577,9 +4572,9 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.5.1))': dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -4612,7 +4607,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.33.0': {} + '@eslint/js@9.34.0': {} '@eslint/object-schema@2.1.6': {} @@ -4678,39 +4673,39 @@ snapshots: '@mui/core-downloads-tracker@7.3.1': {} - '@mui/icons-material@7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': + '@mui/icons-material@7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 - '@mui/lab@7.0.0-beta.16(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/lab@7.0.0-beta.16(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/types': 7.4.5(@types/react@19.1.10) - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) + '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mui/types': 7.4.5(@types/react@19.1.11) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@types/react': 19.1.10 + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@types/react': 19.1.11 - '@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 '@mui/core-downloads-tracker': 7.3.1 - '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/types': 7.4.5(@types/react@19.1.10) - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) + '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mui/types': 7.4.5(@types/react@19.1.11) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@19.1.10) + '@types/react-transition-group': 4.4.12(@types/react@19.1.11) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -4719,20 +4714,20 @@ snapshots: react-is: 19.1.1 react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@types/react': 19.1.10 + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@types/react': 19.1.11 - '@mui/private-theming@7.3.1(@types/react@19.1.10)(react@19.1.1)': + '@mui/private-theming@7.3.1(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 - '@mui/styled-engine@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(react@19.1.1)': + '@mui/styled-engine@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 '@emotion/cache': 11.14.0 @@ -4742,77 +4737,77 @@ snapshots: prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) - '@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': + '@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/private-theming': 7.3.1(@types/react@19.1.10)(react@19.1.1) - '@mui/styled-engine': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(react@19.1.1) - '@mui/types': 7.4.5(@types/react@19.1.10) - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) + '@mui/private-theming': 7.3.1(@types/react@19.1.11)(react@19.1.1) + '@mui/styled-engine': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(react@19.1.1) + '@mui/types': 7.4.5(@types/react@19.1.11) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 19.1.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@types/react': 19.1.10 + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@types/react': 19.1.11 - '@mui/types@7.4.5(@types/react@19.1.10)': + '@mui/types@7.4.5(@types/react@19.1.11)': dependencies: '@babel/runtime': 7.28.2 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 - '@mui/utils@7.3.1(@types/react@19.1.10)(react@19.1.1)': + '@mui/utils@7.3.1(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/types': 7.4.5(@types/react@19.1.10) + '@mui/types': 7.4.5(@types/react@19.1.11) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-is: 19.1.1 optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 - '@mui/x-data-grid@8.10.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/x-data-grid@8.10.2(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) - '@mui/x-internals': 8.10.2(@types/react@19.1.10)(react@19.1.1) - '@mui/x-virtualizer': 0.1.3(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) + '@mui/x-internals': 8.10.2(@types/react@19.1.11)(react@19.1.1) + '@mui/x-virtualizer': 0.1.3(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) clsx: 2.1.1 prop-types: 15.8.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.10.2(@types/react@19.1.10)(react@19.1.1)': + '@mui/x-internals@8.10.2(@types/react@19.1.11)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) react: 19.1.1 reselect: 5.1.1 use-sync-external-store: 1.5.0(react@19.1.1) transitivePeerDependencies: - '@types/react' - '@mui/x-virtualizer@0.1.3(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/x-virtualizer@0.1.3(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) - '@mui/x-internals': 8.10.2(@types/react@19.1.10)(react@19.1.1) + '@mui/utils': 7.3.1(@types/react@19.1.11)(react@19.1.1) + '@mui/x-internals': 8.10.2(@types/react@19.1.11)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -4953,7 +4948,7 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.32': {} - '@rollup/pluginutils@5.1.4(rollup@4.46.2)': + '@rollup/pluginutils@5.2.0(rollup@4.46.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 @@ -5093,52 +5088,52 @@ snapshots: '@tauri-apps/api@2.8.0': {} - '@tauri-apps/cli-darwin-arm64@2.8.1': + '@tauri-apps/cli-darwin-arm64@2.8.3': optional: true - '@tauri-apps/cli-darwin-x64@2.8.1': + '@tauri-apps/cli-darwin-x64@2.8.3': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.8.1': + '@tauri-apps/cli-linux-arm-gnueabihf@2.8.3': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.8.1': + '@tauri-apps/cli-linux-arm64-gnu@2.8.3': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.8.1': + '@tauri-apps/cli-linux-arm64-musl@2.8.3': optional: true - '@tauri-apps/cli-linux-riscv64-gnu@2.8.1': + '@tauri-apps/cli-linux-riscv64-gnu@2.8.3': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.8.1': + '@tauri-apps/cli-linux-x64-gnu@2.8.3': optional: true - '@tauri-apps/cli-linux-x64-musl@2.8.1': + '@tauri-apps/cli-linux-x64-musl@2.8.3': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.8.1': + '@tauri-apps/cli-win32-arm64-msvc@2.8.3': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.8.1': + '@tauri-apps/cli-win32-ia32-msvc@2.8.3': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.8.1': + '@tauri-apps/cli-win32-x64-msvc@2.8.3': optional: true - '@tauri-apps/cli@2.8.1': + '@tauri-apps/cli@2.8.3': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.8.1 - '@tauri-apps/cli-darwin-x64': 2.8.1 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.8.1 - '@tauri-apps/cli-linux-arm64-gnu': 2.8.1 - '@tauri-apps/cli-linux-arm64-musl': 2.8.1 - '@tauri-apps/cli-linux-riscv64-gnu': 2.8.1 - '@tauri-apps/cli-linux-x64-gnu': 2.8.1 - '@tauri-apps/cli-linux-x64-musl': 2.8.1 - '@tauri-apps/cli-win32-arm64-msvc': 2.8.1 - '@tauri-apps/cli-win32-ia32-msvc': 2.8.1 - '@tauri-apps/cli-win32-x64-msvc': 2.8.1 + '@tauri-apps/cli-darwin-arm64': 2.8.3 + '@tauri-apps/cli-darwin-x64': 2.8.3 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.8.3 + '@tauri-apps/cli-linux-arm64-gnu': 2.8.3 + '@tauri-apps/cli-linux-arm64-musl': 2.8.3 + '@tauri-apps/cli-linux-riscv64-gnu': 2.8.3 + '@tauri-apps/cli-linux-x64-gnu': 2.8.3 + '@tauri-apps/cli-linux-x64-musl': 2.8.3 + '@tauri-apps/cli-win32-arm64-msvc': 2.8.3 + '@tauri-apps/cli-win32-ia32-msvc': 2.8.3 + '@tauri-apps/cli-win32-x64-msvc': 2.8.3 '@tauri-apps/plugin-clipboard-manager@2.3.0': dependencies: @@ -5152,7 +5147,7 @@ snapshots: dependencies: '@tauri-apps/api': 2.8.0 - '@tauri-apps/plugin-notification@2.3.0': + '@tauri-apps/plugin-notification@2.3.1': dependencies: '@tauri-apps/api': 2.8.0 @@ -5160,7 +5155,7 @@ snapshots: dependencies: '@tauri-apps/api': 2.8.0 - '@tauri-apps/plugin-shell@2.3.0': + '@tauri-apps/plugin-shell@2.3.1': dependencies: '@tauri-apps/api': 2.8.0 @@ -5223,15 +5218,15 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.1.7(@types/react@19.1.10)': + '@types/react-dom@19.1.8(@types/react@19.1.11)': dependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 - '@types/react-transition-group@4.4.12(@types/react@19.1.10)': + '@types/react-transition-group@4.4.12(@types/react@19.1.11)': dependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 - '@types/react@19.1.10': + '@types/react@19.1.11': dependencies: csstype: 3.1.3 @@ -5239,15 +5234,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.40.0 - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 + eslint: 9.34.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -5256,56 +5251,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) - '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.40.0': + '@typescript-eslint/scope-manager@8.41.0': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 - '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/types@8.41.0': {} - '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/visitor-keys': 8.41.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -5316,25 +5311,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.41.0 + '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.40.0': + '@typescript-eslint/visitor-keys@8.41.0': dependencies: - '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/types': 8.41.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-legacy@7.2.1(terser@5.43.1)(vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1))': + '@vitejs/plugin-legacy@7.2.1(terser@5.43.1)(vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1))': dependencies: '@babel/core': 7.28.3 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.3) @@ -5349,11 +5344,11 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.43.1 - vite: 7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1) + vite: 7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.0.1(vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1))': + '@vitejs/plugin-react@5.0.1(vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1))': dependencies: '@babel/core': 7.28.3 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) @@ -5361,7 +5356,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.32 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1) + vite: 7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -5369,15 +5364,13 @@ snapshots: dependencies: acorn: 8.15.0 - acorn@8.14.1: {} - acorn@8.15.0: {} adm-zip@0.5.16: {} agent-base@7.1.3: {} - ahooks@3.9.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + ahooks@3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.28.2 dayjs: 1.11.13 @@ -5916,7 +5909,7 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react@7.37.5(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-react@7.37.5(eslint@9.34.0(jiti@2.5.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5924,7 +5917,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.34.0(jiti@2.5.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5947,15 +5940,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.33.0(jiti@2.5.1): + eslint@9.34.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.33.0 + '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -6243,7 +6236,7 @@ snapshots: transitivePeerDependencies: - supports-color - i18next@25.4.0(typescript@5.9.2): + i18next@25.4.2(typescript@5.9.2): dependencies: '@babel/runtime': 7.28.2 optionalDependencies: @@ -6979,11 +6972,11 @@ snapshots: dependencies: react: 19.1.1 - react-i18next@15.7.0(i18next@25.4.0(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): + react-i18next@15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): dependencies: '@babel/runtime': 7.28.2 html-parse-stringify: 3.0.1 - i18next: 25.4.0(typescript@5.9.2) + i18next: 25.4.2(typescript@5.9.2) react: 19.1.1 optionalDependencies: react-dom: 19.1.1(react@19.1.1) @@ -6993,11 +6986,11 @@ snapshots: react-is@19.1.1: {} - react-markdown@10.1.0(@types/react@19.1.10)(react@19.1.1): + react-markdown@10.1.0(@types/react@19.1.11)(react@19.1.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 19.1.10 + '@types/react': 19.1.11 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -7019,13 +7012,13 @@ snapshots: react-refresh@0.17.0: {} - react-router-dom@7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-router-dom@7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-router: 7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: 7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-router@7.8.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-router@7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: cookie: 1.0.2 react: 19.1.1 @@ -7180,7 +7173,7 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - sass@1.90.0: + sass@1.91.0: dependencies: chokidar: 4.0.3 immutable: 5.1.2 @@ -7392,7 +7385,7 @@ snapshots: terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -7463,13 +7456,13 @@ snapshots: types-pac@1.0.3: {} - typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.34.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -7561,18 +7554,18 @@ snapshots: dependencies: monaco-editor: 0.52.2 - vite-plugin-svgr@4.3.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1)): + vite-plugin-svgr@4.5.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1)): dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.46.2) + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) '@svgr/core': 8.1.0(typescript@5.9.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - vite: 7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1) + vite: 7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite@7.1.3(jiti@2.5.1)(sass@1.90.0)(terser@5.43.1)(yaml@2.7.1): + vite@7.1.3(jiti@2.5.1)(sass@1.91.0)(terser@5.43.1)(yaml@2.7.1): dependencies: esbuild: 0.25.4 fdir: 6.5.0(picomatch@4.0.3) @@ -7583,7 +7576,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 jiti: 2.5.1 - sass: 1.90.0 + sass: 1.91.0 terser: 5.43.1 yaml: 2.7.1 @@ -7675,9 +7668,9 @@ snapshots: yocto-queue@0.1.0: {} - zustand@5.0.8(@types/react@19.1.10)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): + zustand@5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): optionalDependencies: - '@types/react': 19.1.10 + '@types/react': 19.1.11 react: 19.1.1 use-sync-external-store: 1.5.0(react@19.1.1) From 824814da562eeb6b3e55a5d2832377889eb44abe Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 27 Aug 2025 22:04:44 +0800 Subject: [PATCH 3/9] fix: unexpected restart behavior #4438 --- src-tauri/src/feat/clash.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src-tauri/src/feat/clash.rs b/src-tauri/src/feat/clash.rs index f7b6a24a..9085523d 100644 --- a/src-tauri/src/feat/clash.rs +++ b/src-tauri/src/feat/clash.rs @@ -7,7 +7,6 @@ use crate::{ utils::{logging::Type, resolve}, }; use serde_yaml::{Mapping, Value}; -use tauri::Manager; /// Restart the Clash core pub async fn restart_clash_core() { @@ -31,7 +30,7 @@ pub async fn restart_app() { handle::Handle::global() .app_handle() .map(|app_handle| { - tauri::process::restart(&app_handle.env()); + app_handle.restart(); }) .unwrap_or_else(|| { logging_error!( From 51ff9e1851e3c1d2cc96228956fb9e91d96c22bb Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 27 Aug 2025 22:20:04 +0800 Subject: [PATCH 4/9] fix: resolve issue with application not restoring after tray restart --- UPDATELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/UPDATELOG.md b/UPDATELOG.md index f013eaaf..b6003887 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -16,6 +16,7 @@ - 修复应用在某些操作中可能出现的响应延迟问题 - 修复任务管理中的潜在并发问题 +- 修复通过托盘重启应用无法恢复 ## v2.4.0 From d23d1d9a1d12b9f4b709db74233166c29b692696 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 28 Aug 2025 04:38:10 +0800 Subject: [PATCH 5/9] fix: remove auto clean up profiles behavior in resolve process --- UPDATELOG.md | 4 ++++ src-tauri/src/cmd/profile.rs | 4 ---- src-tauri/src/config/profiles.rs | 19 ------------------- src-tauri/src/utils/resolve.rs | 12 ------------ 4 files changed, 4 insertions(+), 35 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index b6003887..d65fe076 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -18,6 +18,10 @@ - 修复任务管理中的潜在并发问题 - 修复通过托盘重启应用无法恢复 +### 🗑️ 移除内容 + +- 移除启动阶段自动清理过期订阅 + ## v2.4.0 **发行代号:融** diff --git a/src-tauri/src/cmd/profile.rs b/src-tauri/src/cmd/profile.rs index 54df240b..0311bed7 100644 --- a/src-tauri/src/cmd/profile.rs +++ b/src-tauri/src/cmd/profile.rs @@ -253,10 +253,6 @@ pub async fn delete_profile(index: String) -> CmdResult { // 使用Send-safe helper函数 let should_update = wrap_err!(profiles_delete_item_safe(index).await)?; - // 删除后自动清理冗余文件 - let profiles = Config::profiles().await; - let _ = profiles.latest_ref().auto_cleanup(); - if should_update { match CoreManager::global().update_config().await { Ok(_) => { diff --git a/src-tauri/src/config/profiles.rs b/src-tauri/src/config/profiles.rs index 1a644dd1..09253984 100644 --- a/src-tauri/src/config/profiles.rs +++ b/src-tauri/src/config/profiles.rs @@ -735,25 +735,6 @@ impl IProfiles { .unwrap_or(false) }) } - - pub fn auto_cleanup(&self) -> Result<()> { - match self.cleanup_orphaned_files() { - Ok(result) => { - if !result.deleted_files.is_empty() { - log::info!( - target: "app", - "自动清理完成,删除了 {} 个冗余文件", - result.deleted_files.len() - ); - } - Ok(()) - } - Err(e) => { - log::warn!(target: "app", "自动清理失败: {e}"); - Ok(()) - } - } - } } // 特殊的Send-safe helper函数,完全避免跨await持有guard diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 9f9eda54..b16aaec7 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -138,18 +138,6 @@ pub async fn resolve_setup_async(app_handle: &AppHandle) { logging_error!(Type::Config, true, Config::init_config().await); logging!(info, Type::Config, true, "配置初始化完成"); - // 启动时清理冗余的 Profile 文件 - logging!(info, Type::Setup, true, "开始清理冗余的Profile文件..."); - - match Config::profiles().await.latest_ref().auto_cleanup() { - Ok(_) => { - logging!(info, Type::Setup, true, "启动时Profile文件清理完成"); - } - Err(e) => { - logging!(warn, Type::Setup, true, "启动时清理Profile文件失败: {}", e); - } - } - logging!(trace, Type::Core, true, "启动核心管理器..."); logging_error!(Type::Core, true, CoreManager::global().init().await); From 53688f332ffab3b34b0867a6346c4b9ddd910c60 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 28 Aug 2025 04:58:24 +0800 Subject: [PATCH 6/9] fix: replace tokio::runtime::Handle with tauri::async_runtime::handle --- src-tauri/src/config/profiles.rs | 12 ++++++------ src-tauri/src/process/async_handler.rs | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/config/profiles.rs b/src-tauri/src/config/profiles.rs index 09253984..2d951918 100644 --- a/src-tauri/src/config/profiles.rs +++ b/src-tauri/src/config/profiles.rs @@ -742,7 +742,7 @@ use crate::config::Config; pub async fn profiles_append_item_safe(item: PrfItem) -> Result<()> { AsyncHandler::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(async { + AsyncHandler::handle().block_on(async { let profiles = Config::profiles().await; let mut profiles_guard = profiles.data_mut(); profiles_guard.append_item(item).await @@ -754,7 +754,7 @@ pub async fn profiles_append_item_safe(item: PrfItem) -> Result<()> { pub async fn profiles_patch_item_safe(index: String, item: PrfItem) -> Result<()> { AsyncHandler::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(async { + AsyncHandler::handle().block_on(async { let profiles = Config::profiles().await; let mut profiles_guard = profiles.data_mut(); profiles_guard.patch_item(index, item).await @@ -766,7 +766,7 @@ pub async fn profiles_patch_item_safe(index: String, item: PrfItem) -> Result<() pub async fn profiles_delete_item_safe(index: String) -> Result { AsyncHandler::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(async { + AsyncHandler::handle().block_on(async { let profiles = Config::profiles().await; let mut profiles_guard = profiles.data_mut(); profiles_guard.delete_item(index).await @@ -778,7 +778,7 @@ pub async fn profiles_delete_item_safe(index: String) -> Result { pub async fn profiles_reorder_safe(active_id: String, over_id: String) -> Result<()> { AsyncHandler::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(async { + AsyncHandler::handle().block_on(async { let profiles = Config::profiles().await; let mut profiles_guard = profiles.data_mut(); profiles_guard.reorder(active_id, over_id).await @@ -790,7 +790,7 @@ pub async fn profiles_reorder_safe(active_id: String, over_id: String) -> Result pub async fn profiles_save_file_safe() -> Result<()> { AsyncHandler::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(async { + AsyncHandler::handle().block_on(async { let profiles = Config::profiles().await; let profiles_guard = profiles.data_mut(); profiles_guard.save_file().await @@ -802,7 +802,7 @@ pub async fn profiles_save_file_safe() -> Result<()> { pub async fn profiles_draft_update_item_safe(index: String, item: PrfItem) -> Result<()> { AsyncHandler::spawn_blocking(move || { - tokio::runtime::Handle::current().block_on(async { + AsyncHandler::handle().block_on(async { let profiles = Config::profiles().await; let mut profiles_guard = profiles.draft_mut(); profiles_guard.update_item(index, item).await diff --git a/src-tauri/src/process/async_handler.rs b/src-tauri/src/process/async_handler.rs index bfc9cc23..a06e7067 100644 --- a/src-tauri/src/process/async_handler.rs +++ b/src-tauri/src/process/async_handler.rs @@ -8,7 +8,6 @@ use tauri::{async_runtime, async_runtime::JoinHandle}; pub struct AsyncHandler; impl AsyncHandler { - #[allow(dead_code)] pub fn handle() -> async_runtime::RuntimeHandle { async_runtime::handle() } From a9951e4eca7e38d80ee1d8846503af3c22ca5167 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:27:54 +0800 Subject: [PATCH 7/9] refactor: replace AppHandleManager with handle::Handle for macOS activation policy management --- src-tauri/src/core/handle.rs | 55 +++++++++++ src-tauri/src/feat/window.rs | 4 +- src-tauri/src/lib.rs | 131 ++------------------------ src-tauri/src/module/lightweight.rs | 6 +- src-tauri/src/utils/resolve.rs | 14 +-- src-tauri/src/utils/window_manager.rs | 5 +- 6 files changed, 72 insertions(+), 143 deletions(-) diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index a37d97a9..38f87eee 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -294,6 +294,10 @@ impl Handle { } } + pub fn is_initialized(&self) -> bool { + self.app_handle().is_some() + } + /// 获取 AppHandle pub fn app_handle(&self) -> Option { self.app_handle.read().clone() @@ -522,3 +526,54 @@ impl Handle { *self.is_exiting.read() } } + +#[cfg(target_os = "macos")] +impl Handle { + pub fn set_activation_policy(&self, policy: tauri::ActivationPolicy) -> Result<(), String> { + let app_handle = self.app_handle(); + if let Some(app_handle) = app_handle.as_ref() { + app_handle + .set_activation_policy(policy) + .map_err(|e| e.to_string()) + } else { + Err("AppHandle not initialized".to_string()) + } + } + + pub fn set_activation_policy_regular(&self) { + if let Err(e) = self.set_activation_policy(tauri::ActivationPolicy::Regular) { + logging!( + warn, + Type::Setup, + true, + "Failed to set regular activation policy: {}", + e + ); + } + } + + pub fn set_activation_policy_accessory(&self) { + if let Err(e) = self.set_activation_policy(tauri::ActivationPolicy::Accessory) { + logging!( + warn, + Type::Setup, + true, + "Failed to set accessory activation policy: {}", + e + ); + } + } + + #[allow(dead_code)] + pub fn set_activation_policy_prohibited(&self) { + if let Err(e) = self.set_activation_policy(tauri::ActivationPolicy::Prohibited) { + logging!( + warn, + Type::Setup, + true, + "Failed to set prohibited activation policy: {}", + e + ); + } + } +} diff --git a/src-tauri/src/feat/window.rs b/src-tauri/src/feat/window.rs index fe38e96d..370bc2a0 100644 --- a/src-tauri/src/feat/window.rs +++ b/src-tauri/src/feat/window.rs @@ -1,5 +1,3 @@ -#[cfg(target_os = "macos")] -use crate::AppHandleManager; use crate::{ config::Config, core::{handle, sysopt, CoreManager}, @@ -259,5 +257,5 @@ pub async fn hide() { let _ = window.hide(); } } - AppHandleManager::global().set_activation_policy_accessory(); + handle::Handle::global().set_activation_policy_accessory(); } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 8a686b15..a14f56b5 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -26,120 +26,10 @@ use tauri_plugin_deep_link::DeepLinkExt; use tokio::time::{timeout, Duration}; use utils::logging::Type; -/// A global singleton handle to the application. -pub struct AppHandleManager { - handle: Mutex>, -} - -impl AppHandleManager { - /// Create a new AppHandleManager instance - fn new() -> Self { - Self { - handle: Mutex::new(None), - } - } - - /// Initialize the app handle manager with an app handle. - pub fn init(&self, handle: AppHandle) { - let mut app_handle = self.handle.lock(); - if app_handle.is_none() { - *app_handle = Some(handle); - logging!( - info, - Type::Setup, - true, - "AppHandleManager initialized with handle" - ); - } - } - - /// Get the app handle if it has been initialized. - fn get(&self) -> Option { - self.handle.lock().clone() - } - - /// Get the app handle, panics if it hasn't been initialized. - pub fn get_handle(&self) -> AppHandle { - if let Some(handle) = self.get() { - handle - } else { - logging!( - error, - Type::Setup, - "AppHandle not initialized - ensure init() was called first" - ); - std::process::exit(1) - } - } - - /// Check if the app handle has been initialized. - pub fn is_initialized(&self) -> bool { - self.handle.lock().is_some() - } - - #[cfg(target_os = "macos")] - pub fn set_activation_policy(&self, policy: tauri::ActivationPolicy) -> Result<(), String> { - let app_handle = self.handle.lock(); - if let Some(app_handle) = app_handle.as_ref() { - app_handle - .set_activation_policy(policy) - .map_err(|e| e.to_string()) - } else { - Err("AppHandle not initialized".to_string()) - } - } - - pub fn set_activation_policy_regular(&self) { - #[cfg(target_os = "macos")] - { - if let Err(e) = self.set_activation_policy(tauri::ActivationPolicy::Regular) { - logging!( - warn, - Type::Setup, - true, - "Failed to set regular activation policy: {}", - e - ); - } - } - } - - pub fn set_activation_policy_accessory(&self) { - #[cfg(target_os = "macos")] - { - if let Err(e) = self.set_activation_policy(tauri::ActivationPolicy::Accessory) { - logging!( - warn, - Type::Setup, - true, - "Failed to set accessory activation policy: {}", - e - ); - } - } - } - - pub fn set_activation_policy_prohibited(&self) { - #[cfg(target_os = "macos")] - { - if let Err(e) = self.set_activation_policy(tauri::ActivationPolicy::Prohibited) { - logging!( - warn, - Type::Setup, - true, - "Failed to set prohibited activation policy: {}", - e - ); - } - } - } -} - -// Use unified singleton macro -singleton_with_logging!(AppHandleManager, INSTANCE, "AppHandleManager"); - /// Application initialization helper functions mod app_init { + use crate::core::handle; + use super::*; /// Initialize singleton monitoring for other instances @@ -150,8 +40,8 @@ mod app_init { Ok(result) => { if result.is_err() { logging!(info, Type::Setup, true, "检测到已有应用实例运行"); - if let Some(app_handle) = AppHandleManager::global().get() { - app_handle.exit(0); + if handle::Handle::global().is_initialized() { + handle::Handle::global().app_handle().unwrap().exit(0); } else { std::process::exit(0); } @@ -271,9 +161,6 @@ mod app_init { /// Initialize core components synchronously pub async fn init_core_sync(app_handle: &AppHandle) -> Result<(), Box> { - logging!(info, Type::Setup, true, "初始化AppHandleManager..."); - AppHandleManager::global().init(app_handle.clone()); - logging!(info, Type::Setup, true, "初始化核心句柄..."); core::handle::Handle::global().init(app_handle.clone()); @@ -509,12 +396,14 @@ pub fn run() { /// Event handling helper functions mod event_handlers { + use crate::core::handle; + use super::*; /// Handle application ready/resumed events pub fn handle_ready_resumed(app_handle: &AppHandle) { logging!(info, Type::System, true, "应用就绪或恢复"); - AppHandleManager::global().init(app_handle.clone()); + handle::Handle::global().init(app_handle.clone()); #[cfg(target_os = "macos")] { @@ -536,11 +425,11 @@ pub fn run() { has_visible_windows ); - AppHandleManager::global().init(app_handle.clone()); + handle::Handle::global().init(app_handle.clone()); if !has_visible_windows { // 当没有可见窗口时,设置为 regular 模式并显示主窗口 - AppHandleManager::global().set_activation_policy_regular(); + handle::Handle::global().set_activation_policy_regular(); logging!(info, Type::System, true, "没有可见窗口,尝试显示主窗口"); @@ -560,7 +449,7 @@ pub fn run() { /// Handle window close requests pub fn handle_window_close(api: &tauri::WindowEvent) { #[cfg(target_os = "macos")] - AppHandleManager::global().set_activation_policy_accessory(); + handle::Handle::global().set_activation_policy_accessory(); if core::handle::Handle::global().is_exiting() { return; diff --git a/src-tauri/src/module/lightweight.rs b/src-tauri/src/module/lightweight.rs index 115ffb76..48821e8a 100644 --- a/src-tauri/src/module/lightweight.rs +++ b/src-tauri/src/module/lightweight.rs @@ -9,8 +9,6 @@ use crate::{ #[cfg(target_os = "macos")] use crate::logging_error; -#[cfg(target_os = "macos")] -use crate::AppHandleManager; use anyhow::{Context, Result}; use delay_timer::prelude::TaskBuilder; @@ -173,7 +171,7 @@ pub async fn entry_lightweight_mode() { let _ = webview.destroy(); } #[cfg(target_os = "macos")] - AppHandleManager::global().set_activation_policy_accessory(); + handle::Handle::global().set_activation_policy_accessory(); } set_lightweight_mode(true).await; let _ = cancel_light_weight_timer(); @@ -213,7 +211,7 @@ pub async fn exit_lightweight_mode() { // macOS激活策略 #[cfg(target_os = "macos")] - AppHandleManager::global().set_activation_policy_regular(); + handle::Handle::global().set_activation_policy_regular(); // 重置UI就绪状态 crate::utils::resolve::reset_ui_ready(); diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index b16aaec7..e2c85a3e 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -1,5 +1,3 @@ -#[cfg(target_os = "macos")] -use crate::AppHandleManager; use crate::{ config::{Config, PrfItem}, core::*, @@ -185,9 +183,7 @@ pub async fn resolve_setup_async(app_handle: &AppHandle) { #[cfg(target_os = "macos")] { if is_silent_start { - use crate::AppHandleManager; - - AppHandleManager::global().set_activation_policy_accessory(); + handle::Handle::global().set_activation_policy_accessory(); } } create_window(!is_silent_start).await; @@ -273,9 +269,7 @@ pub async fn create_window(is_show: bool) -> bool { let _ = window.set_focus(); #[cfg(target_os = "macos")] - { - AppHandleManager::global().set_activation_policy_regular(); - } + handle::Handle::global().set_activation_policy_regular(); } return true; } @@ -432,9 +426,7 @@ pub async fn create_window(is_show: bool) -> bool { let _ = window_clone.set_focus(); logging!(info, Type::Window, true, "窗口已立即显示"); #[cfg(target_os = "macos")] - { - AppHandleManager::global().set_activation_policy_regular(); - } + handle::Handle::global().set_activation_policy_regular(); let timeout_seconds = if crate::module::lightweight::is_in_lightweight_mode() { 3 diff --git a/src-tauri/src/utils/window_manager.rs b/src-tauri/src/utils/window_manager.rs index 45f6ae7a..c1b287f9 100644 --- a/src-tauri/src/utils/window_manager.rs +++ b/src-tauri/src/utils/window_manager.rs @@ -1,9 +1,6 @@ use crate::{core::handle, logging, utils::logging::Type}; use tauri::{Manager, WebviewWindow, Wry}; -#[cfg(target_os = "macos")] -use crate::AppHandleManager; - use once_cell::sync::OnceCell; use parking_lot::Mutex; use scopeguard; @@ -283,7 +280,7 @@ impl WindowManager { #[cfg(target_os = "macos")] { logging!(info, Type::Window, true, "应用 macOS 特定的激活策略"); - AppHandleManager::global().set_activation_policy_regular(); + handle::Handle::global().set_activation_policy_regular(); } #[cfg(target_os = "windows")] From 6eecd70bd57cc9fd259a3c35be8f6103bbdd350f Mon Sep 17 00:00:00 2001 From: Tunglies Date: Fri, 29 Aug 2025 17:46:46 +0800 Subject: [PATCH 8/9] fix(subscription): resolve issues causing import failures in some cases #4534, #4436, #4552, #4519, #4517, #4503, #4336, #4301 (#4553) * fix(subscription): resolve issues causing import failures in some cases #4534, #4436, #4552, #4519, #4517, #4503, #4336, #4301 * fix(profile): update profile creation to include file data handling * fix(app): improve singleton instance exit handling * fix: remove unsued handle method --- UPDATELOG.md | 2 + src-tauri/Cargo.lock | 169 +++++++++++- src-tauri/Cargo.toml | 1 + src-tauri/src/cmd/profile.rs | 10 +- src-tauri/src/config/config.rs | 2 +- src-tauri/src/config/prfitem.rs | 7 +- src-tauri/src/config/profiles.rs | 16 ++ src-tauri/src/core/handle.rs | 4 - src-tauri/src/feat/clash.rs | 2 +- src-tauri/src/lib.rs | 6 +- src-tauri/src/utils/network.rs | 431 +++++++++++-------------------- 11 files changed, 341 insertions(+), 309 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index d65fe076..eccbcd4f 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -17,6 +17,8 @@ - 修复应用在某些操作中可能出现的响应延迟问题 - 修复任务管理中的潜在并发问题 - 修复通过托盘重启应用无法恢复 +- 修复订阅在某些情况下无法导入 +- 修复无法新建订阅时使用远程链接 ### 🗑️ 移除内容 diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index c11d1602..574ab039 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -151,7 +151,7 @@ dependencies = [ "objc2-core-foundation", "objc2-core-graphics", "objc2-foundation 0.3.1", - "parking_lot", + "parking_lot 0.12.4", "percent-encoding", "windows-sys 0.59.0", "wl-clipboard-rs", @@ -964,6 +964,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "castaway" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" + [[package]] name = "cc" version = "1.2.30" @@ -1112,6 +1118,7 @@ dependencies = [ "getrandom 0.3.3", "hex", "hmac", + "isahc", "kode-bridge", "libc", "log", @@ -1120,7 +1127,7 @@ dependencies = [ "network-interface", "once_cell", "open", - "parking_lot", + "parking_lot 0.12.4", "percent-encoding", "port_scanner", "regex", @@ -1544,6 +1551,37 @@ dependencies = [ "cipher", ] +[[package]] +name = "curl" +version = "0.4.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" +dependencies = [ + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2 0.6.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "curl-sys" +version = "0.4.83+curl-8.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5830daf304027db10c82632a464879d46a3f7c4ba17a31592657ad16c719b483" +dependencies = [ + "cc", + "libc", + "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "windows-sys 0.59.0", +] + [[package]] name = "darling" version = "0.20.11" @@ -1589,7 +1627,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.11", ] [[package]] @@ -1603,7 +1641,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.11", ] [[package]] @@ -3537,6 +3575,34 @@ dependencies = [ "once_cell", ] +[[package]] +name = "isahc" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +dependencies = [ + "async-channel 1.9.0", + "castaway", + "crossbeam-utils", + "curl", + "curl-sys", + "encoding_rs", + "event-listener 2.5.3", + "futures-lite 1.13.0", + "http 0.2.12", + "log", + "mime", + "once_cell", + "parking_lot 0.11.2", + "polling 2.8.0", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + [[package]] name = "itertools" version = "0.12.1" @@ -3676,7 +3742,7 @@ dependencies = [ "http 1.3.1", "httparse", "interprocess", - "parking_lot", + "parking_lot 0.12.4", "pin-project-lite", "rand 0.9.2", "serde", @@ -3777,6 +3843,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libnghttp2-sys" +version = "0.1.11+1.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6c24e48a7167cffa7119da39d577fa482e66c688a4aac016bee862e1a713c4" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "libredox" version = "0.1.6" @@ -3785,7 +3861,7 @@ checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall", + "redox_syscall 0.5.16", ] [[package]] @@ -3797,6 +3873,18 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -3886,7 +3974,7 @@ dependencies = [ "log", "log-mdc", "once_cell", - "parking_lot", + "parking_lot 0.12.4", "rand 0.8.5", "serde", "serde-value", @@ -4805,6 +4893,17 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.4" @@ -4812,7 +4911,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.11", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -4823,7 +4936,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.16", "smallvec", "windows-targets 0.52.6", ] @@ -5639,6 +5752,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.16" @@ -6507,6 +6629,17 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel 1.9.0", + "futures-core", + "futures-io", +] + [[package]] name = "smallvec" version = "1.15.1" @@ -6576,7 +6709,7 @@ dependencies = [ "objc2-foundation 0.2.2", "objc2-quartz-core 0.2.2", "raw-window-handle", - "redox_syscall", + "redox_syscall 0.5.16", "wasm-bindgen", "web-sys", "windows-sys 0.59.0", @@ -6633,7 +6766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "parking_lot", + "parking_lot 0.12.4", "phf_shared 0.11.3", "precomputed-hash", "serde", @@ -6822,7 +6955,7 @@ dependencies = [ "objc2-app-kit", "objc2-foundation 0.3.1", "once_cell", - "parking_lot", + "parking_lot 0.12.4", "raw-window-handle", "scopeguard", "tao-macros", @@ -7599,7 +7732,7 @@ dependencies = [ "io-uring", "libc", "mio", - "parking_lot", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", "slab", @@ -7982,6 +8115,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.2.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 659850ab..5a2365b3 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -78,6 +78,7 @@ dashmap = "6.1.0" tauri-plugin-notification = "2.3.1" console-subscriber = { version = "0.4.1", optional = true } tokio-stream = "0.1.17" +isahc = { version = "1.7.2", features = ["parking_lot"] } [target.'cfg(windows)'.dependencies] runas = "=1.2.0" diff --git a/src-tauri/src/cmd/profile.rs b/src-tauri/src/cmd/profile.rs index 0311bed7..d78f6446 100644 --- a/src-tauri/src/cmd/profile.rs +++ b/src-tauri/src/cmd/profile.rs @@ -2,10 +2,10 @@ use super::CmdResult; use crate::{ config::{ profiles::{ - profiles_append_item_safe, profiles_delete_item_safe, profiles_patch_item_safe, - profiles_reorder_safe, profiles_save_file_safe, + profiles_append_item_with_filedata_safe, profiles_delete_item_safe, + profiles_patch_item_safe, profiles_reorder_safe, profiles_save_file_safe, }, - Config, IProfiles, PrfItem, PrfOption, + profiles_append_item_safe, Config, IProfiles, PrfItem, PrfOption, }, core::{handle, timer::Timer, tray::Tray, CoreManager}, feat, logging, @@ -225,8 +225,8 @@ pub async fn reorder_profile(active_id: String, over_id: String) -> CmdResult { /// 创建新的profile /// 创建一个新的配置文件 #[tauri::command] -pub async fn create_profile(item: PrfItem, _file_data: Option) -> CmdResult { - match profiles_append_item_safe(item).await { +pub async fn create_profile(item: PrfItem, file_data: Option) -> CmdResult { + match profiles_append_item_with_filedata_safe(item, file_data).await { Ok(_) => Ok(()), Err(err) => match err.to_string().as_str() { "the file already exists" => Err("the file already exists".into()), diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs index ad0be9e8..22e63fc4 100644 --- a/src-tauri/src/config/config.rs +++ b/src-tauri/src/config/config.rs @@ -1,6 +1,6 @@ use super::{Draft, IClashTemp, IProfiles, IRuntime, IVerge}; use crate::{ - config::{profiles::profiles_append_item_safe, PrfItem}, + config::{profiles_append_item_safe, PrfItem}, core::{handle, CoreManager}, enhance, logging, process::AsyncHandler, diff --git a/src-tauri/src/config/prfitem.rs b/src-tauri/src/config/prfitem.rs index 1049e939..e3c07d6d 100644 --- a/src-tauri/src/config/prfitem.rs +++ b/src-tauri/src/config/prfitem.rs @@ -4,7 +4,6 @@ use crate::utils::{ tmpl, }; use anyhow::{bail, Context, Result}; -use reqwest::StatusCode; use serde::{Deserialize, Serialize}; use serde_yaml::Mapping; use std::{fs, time::Duration}; @@ -266,7 +265,7 @@ impl PrfItem { }; // 使用网络管理器发送请求 - let resp = match NetworkManager::global() + let resp = match NetworkManager::new() .get_with_interrupt( url, proxy_type, @@ -284,7 +283,7 @@ impl PrfItem { }; let status_code = resp.status(); - if !StatusCode::is_success(&status_code) { + if !status_code.is_success() { bail!("failed to fetch remote profile with status {status_code}") } @@ -350,7 +349,7 @@ impl PrfItem { let uid = help::get_uid("R"); let file = format!("{uid}.yaml"); let name = name.unwrap_or(filename.unwrap_or("Remote File".into())); - let data = resp.text_with_charset("utf-8").await?; + let data = resp.text_with_charset()?; // process the charset "UTF-8 with BOM" let data = data.trim_start_matches('\u{feff}'); diff --git a/src-tauri/src/config/profiles.rs b/src-tauri/src/config/profiles.rs index 2d951918..ef557370 100644 --- a/src-tauri/src/config/profiles.rs +++ b/src-tauri/src/config/profiles.rs @@ -740,6 +740,22 @@ impl IProfiles { // 特殊的Send-safe helper函数,完全避免跨await持有guard use crate::config::Config; +pub async fn profiles_append_item_with_filedata_safe( + item: PrfItem, + file_data: Option, +) -> Result<()> { + AsyncHandler::spawn_blocking(move || { + AsyncHandler::handle().block_on(async { + let item = PrfItem::from(item, file_data).await?; + let profiles = Config::profiles().await; + let mut profiles_guard = profiles.data_mut(); + profiles_guard.append_item(item).await + }) + }) + .await + .map_err(|e| anyhow::anyhow!("Task join error: {}", e))? +} + pub async fn profiles_append_item_safe(item: PrfItem) -> Result<()> { AsyncHandler::spawn_blocking(move || { AsyncHandler::handle().block_on(async { diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index 38f87eee..6405b6d4 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -294,10 +294,6 @@ impl Handle { } } - pub fn is_initialized(&self) -> bool { - self.app_handle().is_some() - } - /// 获取 AppHandle pub fn app_handle(&self) -> Option { self.app_handle.read().clone() diff --git a/src-tauri/src/feat/clash.rs b/src-tauri/src/feat/clash.rs index 9085523d..d5aa9e0e 100644 --- a/src-tauri/src/feat/clash.rs +++ b/src-tauri/src/feat/clash.rs @@ -122,7 +122,7 @@ pub async fn test_delay(url: String) -> anyhow::Result { let start = Instant::now(); - let response = NetworkManager::global() + let response = NetworkManager::new() .get_with_interrupt(&url, proxy_type, Some(10), user_agent, false) .await; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a14f56b5..f867d7f1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -40,8 +40,8 @@ mod app_init { Ok(result) => { if result.is_err() { logging!(info, Type::Setup, true, "检测到已有应用实例运行"); - if handle::Handle::global().is_initialized() { - handle::Handle::global().app_handle().unwrap().exit(0); + if let Some(app_handle) = handle::Handle::global().app_handle() { + app_handle.exit(0); } else { std::process::exit(0); } @@ -309,7 +309,7 @@ pub fn run() { app_init::init_singleton_check(); // Initialize network manager - utils::network::NetworkManager::global().init(); + utils::network::NetworkManager::new().init(); // Initialize portable flag let _ = utils::dirs::init_portable_flag(); diff --git a/src-tauri/src/utils/network.rs b/src-tauri/src/utils/network.rs index f4efa1cb..e68bccd3 100644 --- a/src-tauri/src/utils/network.rs +++ b/src-tauri/src/utils/network.rs @@ -1,143 +1,97 @@ use anyhow::Result; -use parking_lot::Mutex; -use reqwest::{Client, ClientBuilder, Proxy, RequestBuilder, Response}; -use std::{ - sync::{ - atomic::{AtomicUsize, Ordering}, - Arc, Once, - }, - time::{Duration, Instant}, +use isahc::http::{ + header::{HeaderMap, HeaderValue, USER_AGENT}, + StatusCode, Uri, }; -use tokio::runtime::{Builder, Runtime}; +use isahc::prelude::*; +use isahc::{config::SslOption, HttpClient}; +use std::sync::Once; +use std::time::{Duration, Instant}; +use sysproxy::Sysproxy; +use tokio::sync::Mutex; +use tokio::time::timeout; -use crate::utils::logging::Type; -use crate::{config::Config, logging, process::AsyncHandler, singleton_lazy}; +use crate::config::Config; -// HTTP2 相关 -const H2_CONNECTION_WINDOW_SIZE: u32 = 1024 * 1024; -const H2_STREAM_WINDOW_SIZE: u32 = 1024 * 1024; -const H2_MAX_FRAME_SIZE: u32 = 16 * 1024; -const H2_KEEP_ALIVE_INTERVAL: Duration = Duration::from_secs(5); -const H2_KEEP_ALIVE_TIMEOUT: Duration = Duration::from_secs(5); -const DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(10); -const DEFAULT_REQUEST_TIMEOUT: Duration = Duration::from_secs(30); -const POOL_MAX_IDLE_PER_HOST: usize = 5; -const POOL_IDLE_TIMEOUT: Duration = Duration::from_secs(15); - -/// 网络管理器 -pub struct NetworkManager { - runtime: Arc, - self_proxy_client: Mutex>, - system_proxy_client: Mutex>, - no_proxy_client: Mutex>, - init: Once, - last_connection_error: Mutex>, - connection_error_count: AtomicUsize, +#[derive(Debug)] +pub struct HttpResponse { + status: StatusCode, + headers: HeaderMap, + body: String, } -// Use singleton_lazy macro to replace lazy_static! -singleton_lazy!(NetworkManager, NETWORK_MANAGER, NetworkManager::new); +impl HttpResponse { + pub fn new(status: StatusCode, headers: HeaderMap, body: String) -> Self { + Self { + status, + headers, + body, + } + } + + pub fn status(&self) -> StatusCode { + self.status + } + + pub fn headers(&self) -> &HeaderMap { + &self.headers + } + + pub fn text_with_charset(&self) -> Result<&str> { + Ok(&self.body) + } +} + +#[derive(Debug, Clone, Copy)] +pub enum ProxyType { + None, + Localhost, + System, +} + +pub struct NetworkManager { + self_proxy_client: Mutex>, + system_proxy_client: Mutex>, + no_proxy_client: Mutex>, + init: Once, + last_connection_error: Mutex>, + connection_error_count: Mutex, +} impl NetworkManager { - fn new() -> Self { - // 创建专用的异步运行时,线程数限制为4个 - let runtime = match Builder::new_multi_thread() - .worker_threads(4) - .thread_name("clash-verge-network") - .enable_io() - .enable_time() - .build() - { - Ok(runtime) => runtime, - Err(e) => { - log::error!( - "Failed to create network runtime: {}. Using fallback single-threaded runtime.", - e - ); - // Fallback to current thread runtime - match Builder::new_current_thread() - .enable_io() - .enable_time() - .thread_name("clash-verge-network-fallback") - .build() - { - Ok(fallback_runtime) => fallback_runtime, - Err(fallback_err) => { - log::error!( - "Failed to create fallback runtime: {}. This is critical.", - fallback_err - ); - std::process::exit(1); - } - } - } - }; - - NetworkManager { - runtime: Arc::new(runtime), + pub fn new() -> Self { + Self { self_proxy_client: Mutex::new(None), system_proxy_client: Mutex::new(None), no_proxy_client: Mutex::new(None), init: Once::new(), last_connection_error: Mutex::new(None), - connection_error_count: AtomicUsize::new(0), + connection_error_count: Mutex::new(0), } } - /// 初始化网络客户端 pub fn init(&self) { - self.init.call_once(|| { - self.runtime.spawn(async { - logging!(info, Type::Network, true, "初始化网络管理器"); - - // 创建无代理客户端 - let no_proxy_client = match ClientBuilder::new() - .use_rustls_tls() - .no_proxy() - .pool_max_idle_per_host(POOL_MAX_IDLE_PER_HOST) - .pool_idle_timeout(POOL_IDLE_TIMEOUT) - .connect_timeout(Duration::from_secs(10)) - .timeout(Duration::from_secs(30)) - .build() - { - Ok(client) => client, - Err(e) => { - logging!( - error, - Type::Network, - true, - "Failed to build no_proxy client: {}", - e - ); - return; - } - }; - - let mut no_proxy_guard = NetworkManager::global().no_proxy_client.lock(); - *no_proxy_guard = Some(no_proxy_client); - - logging!(info, Type::Network, true, "网络管理器初始化完成"); - }); - }); + self.init.call_once(|| {}); } - fn record_connection_error(&self, error: &str) { - let mut last_error = self.last_connection_error.lock(); + async fn record_connection_error(&self, error: &str) { + let mut last_error = self.last_connection_error.lock().await; *last_error = Some((Instant::now(), error.to_string())); - self.connection_error_count.fetch_add(1, Ordering::Relaxed); + let mut count = self.connection_error_count.lock().await; + *count += 1; } - fn should_reset_clients(&self) -> bool { - let error_count = self.connection_error_count.load(Ordering::Relaxed); - let last_error = self.last_connection_error.lock(); + async fn should_reset_clients(&self) -> bool { + let count = *self.connection_error_count.lock().await; + let last_error_guard = self.last_connection_error.lock().await; - if error_count > 5 { + if count > 5 { return true; } - if let Some((time, _)) = *last_error { - if time.elapsed() < Duration::from_secs(30) && error_count > 2 { + if let Some((time, _)) = &*last_error_guard { + if time.elapsed() < Duration::from_secs(30) && count > 2 { return true; } } @@ -145,60 +99,57 @@ impl NetworkManager { false } - pub fn reset_clients(&self) { - logging!(info, Type::Network, true, "正在重置所有HTTP客户端"); - { - let mut client = self.self_proxy_client.lock(); - *client = None; - } - { - let mut client = self.system_proxy_client.lock(); - *client = None; - } - { - let mut client = self.no_proxy_client.lock(); - *client = None; - } - self.connection_error_count.store(0, Ordering::Relaxed); + pub async fn reset_clients(&self) { + *self.self_proxy_client.lock().await = None; + *self.system_proxy_client.lock().await = None; + *self.no_proxy_client.lock().await = None; + *self.connection_error_count.lock().await = 0; + } + + fn build_client( + &self, + proxy_uri: Option, + default_headers: HeaderMap, + accept_invalid_certs: bool, + timeout_secs: Option, + ) -> Result { + let proxy_uri_clone = proxy_uri.clone(); + let headers_clone = default_headers.clone(); + let client = { + let mut builder = HttpClient::builder(); + + builder = match proxy_uri_clone { + Some(uri) => builder.proxy(Some(uri)), + None => builder.proxy(None), + }; + + for (name, value) in headers_clone.iter() { + builder = builder.default_header(name, value); + } + + if accept_invalid_certs { + builder = builder.ssl_options(SslOption::DANGER_ACCEPT_INVALID_CERTS); + } + + if let Some(secs) = timeout_secs { + builder = builder.timeout(Duration::from_secs(secs)); + } + + Ok(builder.build()?) + }; + + client } - /// 创建带有自定义选项的HTTP请求 pub async fn create_request( &self, - url: &str, proxy_type: ProxyType, timeout_secs: Option, user_agent: Option, accept_invalid_certs: bool, - ) -> RequestBuilder { - if self.should_reset_clients() { - self.reset_clients(); - } - - let mut builder = ClientBuilder::new() - .use_rustls_tls() - .pool_max_idle_per_host(POOL_MAX_IDLE_PER_HOST) - .pool_idle_timeout(POOL_IDLE_TIMEOUT) - .connect_timeout(DEFAULT_CONNECT_TIMEOUT) - .http2_initial_stream_window_size(H2_STREAM_WINDOW_SIZE) - .http2_initial_connection_window_size(H2_CONNECTION_WINDOW_SIZE) - .http2_adaptive_window(true) - .http2_keep_alive_interval(Some(H2_KEEP_ALIVE_INTERVAL)) - .http2_keep_alive_timeout(H2_KEEP_ALIVE_TIMEOUT) - .http2_max_frame_size(H2_MAX_FRAME_SIZE) - .tcp_keepalive(Some(Duration::from_secs(10))) - .http2_max_header_list_size(16 * 1024); - - if let Some(timeout) = timeout_secs { - builder = builder.timeout(Duration::from_secs(timeout)); - } else { - builder = builder.timeout(DEFAULT_REQUEST_TIMEOUT); - } - - match proxy_type { - ProxyType::None => { - builder = builder.no_proxy(); - } + ) -> Result { + let proxy_uri = match proxy_type { + ProxyType::None => None, ProxyType::Localhost => { let port = { let verge_port = Config::verge().await.latest_ref().verge_mixed_port; @@ -207,94 +158,31 @@ impl NetworkManager { None => Config::clash().await.latest_ref().get_mixed_port(), } }; - let proxy_scheme = format!("http://127.0.0.1:{port}"); - - if let Ok(proxy) = Proxy::http(&proxy_scheme) { - builder = builder.proxy(proxy); - } - if let Ok(proxy) = Proxy::https(&proxy_scheme) { - builder = builder.proxy(proxy); - } - if let Ok(proxy) = Proxy::all(&proxy_scheme) { - builder = builder.proxy(proxy); - } + proxy_scheme.parse::().ok() } ProxyType::System => { - use sysproxy::Sysproxy; - if let Ok(p @ Sysproxy { enable: true, .. }) = Sysproxy::get_system_proxy() { let proxy_scheme = format!("http://{}:{}", p.host, p.port); - - if let Ok(proxy) = Proxy::http(&proxy_scheme) { - builder = builder.proxy(proxy); - } - if let Ok(proxy) = Proxy::https(&proxy_scheme) { - builder = builder.proxy(proxy); - } - if let Ok(proxy) = Proxy::all(&proxy_scheme) { - builder = builder.proxy(proxy); - } - } - } - } - - builder = builder.danger_accept_invalid_certs(accept_invalid_certs); - - if let Some(ua) = user_agent { - builder = builder.user_agent(ua); - } else { - use crate::utils::resolve::VERSION; - - let version = match VERSION.get() { - Some(v) => format!("clash-verge/v{v}"), - None => "clash-verge/unknown".to_string(), - }; - - builder = builder.user_agent(version); - } - - let client = match builder.build() { - Ok(client) => client, - Err(e) => { - logging!( - error, - Type::Network, - true, - "Failed to build custom HTTP client: {}", - e - ); - // Return a simple no-proxy client as fallback - match ClientBuilder::new() - .use_rustls_tls() - .no_proxy() - .timeout(DEFAULT_REQUEST_TIMEOUT) - .build() - { - Ok(fallback_client) => fallback_client, - Err(fallback_err) => { - logging!( - error, - Type::Network, - true, - "Failed to create fallback client: {}", - fallback_err - ); - self.record_connection_error(&format!( - "Critical client build failure: {}", - fallback_err - )); - // Return a minimal client that will likely fail but won't panic - ClientBuilder::new().build().unwrap_or_else(|_| { - // If even the most basic client fails, this is truly critical - std::process::exit(1); - }) - } + proxy_scheme.parse::().ok() + } else { + None } } }; - client.get(url) + let mut headers = HeaderMap::new(); + headers.insert( + USER_AGENT, + HeaderValue::from_str( + &user_agent + .unwrap_or_else(|| format!("clash-verge/v{}", env!("CARGO_PKG_VERSION"))), + )?, + ); + + let client = self.build_client(proxy_uri, headers, accept_invalid_certs, timeout_secs)?; + + Ok(client) } pub async fn get_with_interrupt( @@ -304,51 +192,38 @@ impl NetworkManager { timeout_secs: Option, user_agent: Option, accept_invalid_certs: bool, - ) -> Result { - let request = self - .create_request( - url, - proxy_type, - timeout_secs, - user_agent, - accept_invalid_certs, - ) - .await; + ) -> Result { + if self.should_reset_clients().await { + self.reset_clients().await; + } - let timeout_duration = timeout_secs.unwrap_or(20); + let client = self + .create_request(proxy_type, timeout_secs, user_agent, accept_invalid_certs) + .await?; - let (cancel_tx, cancel_rx) = tokio::sync::oneshot::channel::<()>(); + let timeout_duration = Duration::from_secs(timeout_secs.unwrap_or(20)); + let url_owned = url.to_string(); - let url_clone = url.to_string(); - let watchdog = AsyncHandler::spawn(move || async move { - tokio::time::sleep(Duration::from_secs(timeout_duration)).await; - let _ = cancel_tx.send(()); - logging!(warn, Type::Network, true, "请求超时取消: {}", url_clone); - }); - - let result = tokio::select! { - result = request.send() => result, - _ = cancel_rx => { - self.record_connection_error(&format!("Request interrupted for: {url}")); - return Err(anyhow::anyhow!("Request interrupted after {} seconds", timeout_duration)); + let response = match timeout(timeout_duration, async { + let mut response = client.get_async(&url_owned).await?; + let status = response.status(); + let headers = response.headers().clone(); + let body = response.text().await?; + Ok::<_, anyhow::Error>(HttpResponse::new(status, headers, body)) + }) + .await + { + Ok(res) => res?, + Err(_) => { + self.record_connection_error(&format!("Request interrupted: {}", url)) + .await; + return Err(anyhow::anyhow!( + "Request interrupted after {}s", + timeout_duration.as_secs() + )); } }; - watchdog.abort(); - match result { - Ok(response) => Ok(response), - Err(e) => { - self.record_connection_error(&e.to_string()); - Err(anyhow::anyhow!("Failed to send HTTP request: {}", e)) - } - } + Ok(response) } } - -/// 代理类型 -#[derive(Debug, Clone, Copy)] -pub enum ProxyType { - None, - Localhost, - System, -} From 2080dbdc0fe984f98518ec7b35507d0c5c810576 Mon Sep 17 00:00:00 2001 From: wonfen Date: Fri, 29 Aug 2025 20:46:45 +0800 Subject: [PATCH 9/9] refactor: proxy control component and system settings UI fix: handle tun toggle state after service uninstall --- UPDATELOG.md | 5 + src/components/home/proxy-tun-card.tsx | 1 + src/components/setting/setting-system.tsx | 173 ++---------------- .../shared/ProxyControlSwitches.tsx | 75 ++++++-- src/hooks/use-verge.ts | 30 +++ src/locales/en.json | 2 + src/locales/zh.json | 2 + 7 files changed, 117 insertions(+), 171 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index eccbcd4f..9ada17c8 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -19,6 +19,11 @@ - 修复通过托盘重启应用无法恢复 - 修复订阅在某些情况下无法导入 - 修复无法新建订阅时使用远程链接 +- 修复卸载服务后的 tun 开关状态问题 + +### 👙 界面样式 + +- 统一代理设置样式 ### 🗑️ 移除内容 diff --git a/src/components/home/proxy-tun-card.tsx b/src/components/home/proxy-tun-card.tsx index fe1dc04e..3a6795b9 100644 --- a/src/components/home/proxy-tun-card.tsx +++ b/src/components/home/proxy-tun-card.tsx @@ -232,6 +232,7 @@ export const ProxyTunCard: FC = () => { diff --git a/src/components/setting/setting-system.tsx b/src/components/setting/setting-system.tsx index 37012d49..c015b4ff 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -1,29 +1,19 @@ import { mutate } from "swr"; -import { useRef } from "react"; +import React, { useRef } from "react"; import { useTranslation } from "react-i18next"; -import { - SettingsRounded, - PlayArrowRounded, - PauseRounded, - WarningRounded, - BuildRounded, - DeleteForeverRounded, -} from "@mui/icons-material"; +import { WarningRounded } from "@mui/icons-material"; import { useVerge } from "@/hooks/use-verge"; -import { useSystemProxyState } from "@/hooks/use-system-proxy-state"; import { DialogRef, Switch } from "@/components/base"; import { SettingList, SettingItem } from "./mods/setting-comp"; import { GuardState } from "./mods/guard-state"; import { SysproxyViewer } from "./mods/sysproxy-viewer"; import { TunViewer } from "./mods/tun-viewer"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; -import { uninstallService, restartCore, stopCore } from "@/services/cmds"; -import { useLockFn } from "ahooks"; -import { Button, Tooltip } from "@mui/material"; +import { Tooltip } from "@mui/material"; import { useSystemState } from "@/hooks/use-system-state"; +import ProxyControlSwitches from "@/components/shared/ProxyControlSwitches"; import { showNotice } from "@/services/noticeService"; -import { useServiceInstaller } from "@/hooks/useServiceInstaller"; interface Props { onError?: (err: Error) => void; @@ -33,167 +23,30 @@ const SettingSystem = ({ onError }: Props) => { const { t } = useTranslation(); const { verge, mutateVerge, patchVerge } = useVerge(); - const { installServiceAndRestartCore } = useServiceInstaller(); - const { actualState: systemProxyActualState, toggleSystemProxy } = - useSystemProxyState(); - const { isAdminMode, isServiceMode, mutateRunningMode } = useSystemState(); + const { isAdminMode } = useSystemState(); - // +++ isTunAvailable 现在使用 SWR 的 isServiceMode - const isTunAvailable = isServiceMode || isAdminMode; + const { enable_auto_launch, enable_silent_start } = verge ?? {}; const sysproxyRef = useRef(null); const tunRef = useRef(null); - const { enable_tun_mode, enable_auto_launch, enable_silent_start } = - verge ?? {}; - - const onSwitchFormat = (_e: any, value: boolean) => value; + const onSwitchFormat = ( + _e: React.ChangeEvent, + value: boolean, + ) => value; const onChangeData = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); }; - // 抽象服务操作逻辑 - const handleServiceOperation = useLockFn( - async ({ - beforeMsg, - action, - actionMsg, - successMsg, - }: { - beforeMsg: string; - action: () => Promise; - actionMsg: string; - successMsg: string; - }) => { - try { - showNotice("info", beforeMsg); - await stopCore(); - showNotice("info", actionMsg); - await action(); - showNotice("success", successMsg); - showNotice("info", t("Restarting Core...")); - await restartCore(); - await mutateRunningMode(); - } catch (err: any) { - showNotice("error", err.message || err.toString()); - try { - showNotice("info", t("Try running core as Sidecar...")); - await restartCore(); - await mutateRunningMode(); - } catch (e: any) { - showNotice("error", e?.message || e?.toString()); - } - } - }, - ); - - // 卸载系统服务 - const onUninstallService = () => - handleServiceOperation({ - beforeMsg: t("Stopping Core..."), - action: uninstallService, - actionMsg: t("Uninstalling Service..."), - successMsg: t("Service Uninstalled Successfully"), - }); - return ( - - tunRef.current?.open()} - /> - {!isTunAvailable && ( - - - - )} - {!isServiceMode && !isAdminMode && ( - - - - )} - {isServiceMode && ( - - - - )} - - } - > - { - if (!isTunAvailable) return; - onChangeData({ enable_tun_mode: e }); - }} - onGuard={(e) => { - if (!isTunAvailable) { - showNotice("error", t("TUN requires Service Mode or Admin Mode")); - return Promise.reject( - new Error(t("TUN requires Service Mode or Admin Mode")), - ); - } - return patchVerge({ enable_tun_mode: e }); - }} - > - - - - - sysproxyRef.current?.open()} - /> - {systemProxyActualState ? ( - - ) : ( - - )} - - } - > - toggleSystemProxy(e)} - > - - - + + + void; + noRightPadding?: boolean; } /** * 可复用的代理控制开关组件 * 包含 Tun Mode 和 System Proxy 的开关功能 */ -const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { +const ProxyControlSwitches = ({ + label, + onError, + noRightPadding = false, +}: ProxySwitchProps) => { const { t } = useTranslation(); const { verge, mutateVerge, patchVerge } = useVerge(); const theme = useTheme(); @@ -42,7 +51,7 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { const { actualState: systemProxyActualState, toggleSystemProxy } = useSystemProxyState(); - const { isAdminMode, isServiceMode } = useSystemState(); + const { isAdminMode, isServiceMode, mutateRunningMode } = useSystemState(); const isTunAvailable = isServiceMode || isAdminMode; @@ -55,7 +64,10 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { const isSystemProxyMode = label === t("System Proxy") || !label; const isTunMode = label === t("Tun Mode"); - const onSwitchFormat = (_e: any, value: boolean) => value; + const onSwitchFormat = ( + _e: React.ChangeEvent, + value: boolean, + ) => value; const onChangeData = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); }; @@ -63,8 +75,31 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { // 安装系统服务 const onInstallService = installServiceAndRestartCore; + // 卸载系统服务 + const onUninstallService = useLockFn(async () => { + try { + showNotice("info", t("Stopping Core...")); + await stopCore(); + showNotice("info", t("Uninstalling Service...")); + await uninstallService(); + showNotice("success", t("Service Uninstalled Successfully")); + showNotice("info", t("Restarting Core...")); + await restartCore(); + await mutateRunningMode(); + } catch (err: unknown) { + showNotice("error", (err as Error).message || err?.toString()); + try { + showNotice("info", t("Try running core as Sidecar...")); + await restartCore(); + await mutateRunningMode(); + } catch (e: unknown) { + showNotice("error", (e as Error)?.message || e?.toString()); + } + } + }); + return ( - + {label && ( { alignItems: "center", justifyContent: "space-between", p: 1, + pr: noRightPadding ? 1 : 2, borderRadius: 1.5, bgcolor: enable_system_proxy ? alpha(theme.palette.success.main, 0.07) @@ -111,12 +147,6 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { > {t("System Proxy")} - {/* - {sysproxy?.enable - ? t("Proxy is active") - : t("Enable this for most users") - } - */} @@ -155,6 +185,7 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { alignItems: "center", justifyContent: "space-between", p: 1, + pr: noRightPadding ? 1 : 2, borderRadius: 1.5, bgcolor: enable_tun_mode ? alpha(theme.palette.success.main, 0.07) @@ -182,6 +213,15 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { {t("Tun Mode")} + + {!isTunAvailable && ( + + + + )} @@ -199,6 +239,19 @@ const ProxyControlSwitches = ({ label, onError }: ProxySwitchProps) => { )} + {isServiceMode && ( + + + + )} + { + const { t } = useTranslation(); + const { isAdminMode, isServiceMode } = useSystemState(); + const { data: verge, mutate: mutateVerge } = useSWR( "getVergeConfig", async () => { @@ -15,6 +22,29 @@ export const useVerge = () => { mutateVerge(); }; + const isTunAvailable = isServiceMode || isAdminMode; + const { enable_tun_mode } = verge ?? {}; + + // 当服务不可用且TUN模式开启时自动关闭TUN + useEffect(() => { + if (enable_tun_mode && !isTunAvailable) { + console.log("[useVerge] 检测到服务不可用,自动关闭TUN模式"); + + patchVergeConfig({ enable_tun_mode: false }) + .then(() => { + mutateVerge(); + showNotice( + "info", + t("TUN Mode automatically disabled due to service unavailable"), + ); + }) + .catch((err) => { + console.error("[useVerge] 自动关闭TUN模式失败:", err); + showNotice("error", t("Failed to disable TUN Mode automatically")); + }); + } + }, [isTunAvailable, enable_tun_mode, mutateVerge, t]); + return { verge, mutateVerge, diff --git a/src/locales/en.json b/src/locales/en.json index 8650e095..b747d5a7 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -210,6 +210,8 @@ "Reset to Default": "Reset to Default", "Tun Mode Info": "Tun (Virtual NIC) mode: Captures all system traffic, when enabled, there is no need to enable system proxy.", "TUN requires Service Mode or Admin Mode": "TUN requires Service Mode or Admin Mode", + "TUN Mode automatically disabled due to service unavailable": "TUN Mode automatically disabled due to service unavailable", + "Failed to disable TUN Mode automatically": "Failed to disable TUN Mode automatically", "System Proxy Enabled": "System proxy is enabled, your applications will access the network through the proxy", "System Proxy Disabled": "System proxy is disabled, it is recommended for most users to turn on this option", "TUN Mode Enabled": "TUN mode is enabled, applications will access the network through the virtual network card", diff --git a/src/locales/zh.json b/src/locales/zh.json index ac574727..c7a522e4 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -210,6 +210,8 @@ "Reset to Default": "重置为默认值", "Tun Mode Info": "TUN(虚拟网卡)模式接管系统所有流量,启用时无须打开系统代理", "TUN requires Service Mode or Admin Mode": "TUN 模式需要安装服务模式或管理员模式", + "TUN Mode automatically disabled due to service unavailable": "由于服务不可用,TUN 模式已自动关闭", + "Failed to disable TUN Mode automatically": "自动关闭 TUN 模式失败", "System Proxy Enabled": "系统代理已启用,您的应用将通过代理访问网络", "System Proxy Disabled": "系统代理已关闭,建议大多数用户打开此选项", "TUN Mode Enabled": "TUN 模式已启用,应用将通过虚拟网卡访问网络",