Compare commits

..
Author SHA1 Message Date
Tunglies fba4dc5409 feat(connections): add network protocol filter
Filter connections by metadata.network (All/TCP/UDP) in both table and
list layouts, combined with search, and kept across page switches like
the existing search state.

Refs #6140
2026-11-10 07:51:43 +08:00
23 changed files with 209 additions and 182 deletions
Generated
+14 -70
View File
@@ -159,9 +159,9 @@ dependencies = [
[[package]]
name = "arc-swap"
version = "1.9.4"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db4c94f57a570fce5d381be3289b3f79aef6332d72948fe82ab5772e423ccf92"
checksum = "380962b3d93b99642e50b9febf72c071e97e8b32d86eae9cf4ef582bb960ae6e"
dependencies = [
"rustversion",
]
@@ -1120,7 +1120,7 @@ dependencies = [
"percent-encoding",
"reqwest 0.13.5",
"reqwest_dav",
"rfd 0.18.0",
"rfd",
"runas",
"rustls",
"scopeguard",
@@ -2404,9 +2404,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
[[package]]
name = "flate2"
version = "1.1.11"
version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "626d4928326b646e70f65ed36fc7cf9f206bdb68a0019ee7c6b4709da4e084c4"
checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb"
dependencies = [
"crc32fast",
"miniz_oxide 0.9.1",
@@ -3241,9 +3241,9 @@ dependencies = [
[[package]]
name = "http-body-util"
version = "0.1.5"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c"
checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2"
dependencies = [
"bytes",
"futures-core",
@@ -4070,9 +4070,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
[[package]]
name = "lzma-rust2"
version = "0.25.0"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef1d73c59a56771343712b22ea5615092c612c16ba291c0979e3105dfeec4890"
checksum = "490750560fa7851fbbf5d3ab1a8750f09350ed361ed8aed85b1e1e40587812ee"
dependencies = [
"sha2 0.11.1",
]
@@ -4538,7 +4538,6 @@ dependencies = [
"objc2-core-video",
"objc2-foundation",
"objc2-quartz-core",
"objc2-uniform-type-identifiers",
]
[[package]]
@@ -4760,16 +4759,6 @@ dependencies = [
"objc2-user-notifications",
]
[[package]]
name = "objc2-uniform-type-identifiers"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7902ac02859fc1f7045f8b598c63f1ae0cc7efeaa06a9bc9f3d9a3c955974fa4"
dependencies = [
"objc2",
"objc2-foundation",
]
[[package]]
name = "objc2-user-notifications"
version = "0.3.2"
@@ -5313,12 +5302,6 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "pollster"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc6355899e1c9462875b6757c79f3caa011a1fdae12bbb1a2e72dd1f234f8336"
[[package]]
name = "polonius-the-crab"
version = "0.5.0"
@@ -5951,31 +5934,6 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "rfd"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4b9d4857b10297ffb0f64cae711e983a7aeaee561848d56d429d3858bd8ed93"
dependencies = [
"block2",
"dispatch2",
"js-sys",
"libc",
"log",
"objc2",
"objc2-app-kit",
"objc2-core-foundation",
"objc2-foundation",
"objc2-uniform-type-identifiers",
"percent-encoding",
"pollster",
"raw-window-handle",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"windows-sys 0.61.2",
]
[[package]]
name = "ring"
version = "0.17.14"
@@ -7469,7 +7427,7 @@ checksum = "ce0fb9c2b6d34a9720627ed930ebc8af26f61e648695aecaeb03d5c33c5896f5"
dependencies = [
"log",
"raw-window-handle",
"rfd 0.17.2",
"rfd",
"serde",
"serde_json",
"tauri",
@@ -10074,20 +10032,6 @@ name = "zeroize"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.119",
]
[[package]]
name = "zerotrie"
@@ -10126,9 +10070,9 @@ dependencies = [
[[package]]
name = "zip"
version = "9.4.2"
version = "9.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3845f734baabdd02de353a20580e30ceccd03897def44a4eb8e9654992e294"
checksum = "eaeb7f16d2605b49aef586996ded29e65642fab7259a3077e537351df6d80426"
dependencies = [
"aes",
"bzip2",
@@ -10156,9 +10100,9 @@ dependencies = [
[[package]]
name = "zlib-rs"
version = "0.6.8"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112"
checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5"
[[package]]
name = "zmij"
+1 -1
View File
@@ -28,7 +28,6 @@
- 修复订阅响应过大导致内存占用过高,限制单次下载为 4 MiB
- 修复全局模式默认停在 `DIRECT` 或 `REJECT` 导致流量未经代理,现自动切换到第一个策略组
- 修复订阅中未加引号的 REALITY `short-id`(如 `1234e123`)被误读为数字,导致订阅无法启用
- 修复订阅中唯一的代理组名为 `GLOBAL` 或没有代理组时,规则模式下代理页面显示「未获取到代理信息」
**🍎 macOS**
@@ -40,6 +39,7 @@
<details>
<summary><strong> ✨ 新增功能 </strong></summary>
- 新增连接页面按网络协议(TCP/UDP)筛选连接
</details>
+2 -2
View File
@@ -121,7 +121,7 @@
"https-proxy-agent": "^9.1.0",
"husky": "^9.1.7",
"jiti": "^2.7.0",
"knip": "6.44.2",
"knip": "6.44.1",
"lint-staged": "^17.5.1",
"sass": "^1.104.1",
"tar": "^7.5.22",
@@ -133,7 +133,7 @@
"vite-plugin-svgr": "^5.2.0",
"vitest": "^5.0.1",
"webdriverio": "10.2.0",
"ws": "8.22.2"
"ws": "8.22.1"
},
"lint-staged": {
"*.{ts,tsx,js,mjs}": [
+97 -92
View File
@@ -396,8 +396,8 @@ importers:
specifier: ^2.7.0
version: 2.7.0
knip:
specifier: 6.44.2
version: 6.44.2
specifier: 6.44.1
version: 6.44.1
lint-staged:
specifier: ^17.5.1
version: 17.5.1
@@ -432,8 +432,8 @@ importers:
specifier: 10.2.0
version: 10.2.0(supports-color@7.2.0)(yauzl@2.10.0)
ws:
specifier: 8.22.2
version: 8.22.2
specifier: 8.22.1
version: 8.22.1
packages:
@@ -1595,128 +1595,131 @@ packages:
'@octokit/types@18.0.0':
resolution: {integrity: sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==}
'@oxc-parser/binding-android-arm-eabi@0.156.0':
resolution: {integrity: sha512-RMq7DKNzEp1T51QKNLTn0NryNEt2IYfh7mZBlIdi2Ju52ltOEDMeIXv0XBpA6dL7j7ChjlcovtGcc1Jv4qMipg==}
'@oxc-parser/binding-android-arm-eabi@0.155.0':
resolution: {integrity: sha512-A6xv7hDtnTm+xlZ7utn6rRQpRMJHRhVr3gjRGqlx0RUX84mNk0pAsy6YN/wWhuOTkaZhRrrzaLxf0NfbH77j2w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
'@oxc-parser/binding-android-arm64@0.156.0':
resolution: {integrity: sha512-mwkWKhOBpmh8fWc3m4MiLsmEAtx0YuHmvyo9ff557cnb3QZ2kt2eauSz75wCGIpiZG3gUsJ4WwzEjm4R4/BHig==}
'@oxc-parser/binding-android-arm64@0.155.0':
resolution: {integrity: sha512-T1wWwH9/JI5g7Z4kEQwDOwhToxdDhRyOTklH+uuNpJ16m3MZFmGl+l2rKc0NHQdbVRG2LTOBsNjpW3h1BWytPA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
'@oxc-parser/binding-darwin-arm64@0.156.0':
resolution: {integrity: sha512-6pGR5fUszM9M4eBBapqpGjCRJolFwuCldx8bRQjqXyM09cQysBTWVF2Ttg4UNJVxYSaw5RRINbveCOOCrsuGvA==}
'@oxc-parser/binding-darwin-arm64@0.155.0':
resolution: {integrity: sha512-ZoRB3qJxJ8DWA41jHja+YeB0lLfjBy4T+Kr15vnN1k65X3zbJt3rPZftEwN4Ju4tmA4K/T9dWWD7Z8ewQLnrVA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
'@oxc-parser/binding-darwin-x64@0.156.0':
resolution: {integrity: sha512-M9QghL7uCAqMKjYJv1rDGblfEvkeQu3QzTPd7Uwo16gG3uO7m9ikVQ9OL8FZTnKzU4vbCEby6kTlEkqN+JeEMA==}
'@oxc-parser/binding-darwin-x64@0.155.0':
resolution: {integrity: sha512-vxtL86BtM+IgrpejA86nbTk5j0HKTIMeuaJ1fQciw6p9RfavPtIPjI7gN34owap0yG9txXBaAWpGdxokNwdqIw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
'@oxc-parser/binding-freebsd-x64@0.156.0':
resolution: {integrity: sha512-lX0ANxSwAOrpOT7NHB+YsrBqDJ8sOVon5m7GS9eQtkuUeNzQMMGpFsJLsStawTbrdwOF5KDVxgPWcKmt/DIZUQ==}
'@oxc-parser/binding-freebsd-x64@0.155.0':
resolution: {integrity: sha512-tN6Ru5e0UVnWaIuiH8jEwnvxuxg7FvhWwSd3oe5oDhOD4ObsSr9/N6WfHLjilUWlPPj65ptwrSDH0Y7lzwTzmw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
'@oxc-parser/binding-linux-arm-gnueabihf@0.156.0':
resolution: {integrity: sha512-iPgYpasRcqk7X3TGncQg7B+6RotDvG8weug0UrgF+FXLf4KmaNDyT91BKONlqbHcNgK9Nryp7AEZGuQn32fP6g==}
'@oxc-parser/binding-linux-arm-gnueabihf@0.155.0':
resolution: {integrity: sha512-h4ozA5n6L6lwolsz9iwunEhKWnIVbmFRots5QxEix0H6nJ5ICpuDa7PuShuhfpIDFe3+Qvyscioyiv+9g+4Syg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@oxc-parser/binding-linux-arm-musleabihf@0.156.0':
resolution: {integrity: sha512-sJqJDEZevtkEfoxrXfaRTkSt6Itckr549cIfBbs11UgXv8bFyqQsXTQa6iKm8mTiWYmCDDFJf7TLnqxcbqzPOw==}
'@oxc-parser/binding-linux-arm-musleabihf@0.155.0':
resolution: {integrity: sha512-058/+LardpfuUlsKIvBGk/CYoakEVcMgqYx8GgyUZeOxFWTojYLlCc1Gb60/y21v3esDhHidgiY/Zbq9LpBhaQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@oxc-parser/binding-linux-arm64-gnu@0.156.0':
resolution: {integrity: sha512-mrQs5OdRiqKskRuWEORPKT6YGIFhrpVvCvL9hqVaIh60EzgR4qjPvSsV6hWZcOfyWHBTbdEvfnDJPh/eQlxPRQ==}
'@oxc-parser/binding-linux-arm64-gnu@0.155.0':
resolution: {integrity: sha512-nrOt2Y3xIAzu+lSPzH0864ieO+iCCXgoo9qFlGANE8Xh0cQ+RP8Wstfp+/wXN2YCyb98cAGzX0VruKYw7it/jw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@oxc-parser/binding-linux-arm64-musl@0.156.0':
resolution: {integrity: sha512-ZtPqgCU3+wpU7dvX7YbaEiw71r0UdguzuPhcx4PIEZSs4XFqc6F5wXCtNdb6M7m3DMErlxrwosryoXrzYOY/Gg==}
'@oxc-parser/binding-linux-arm64-musl@0.155.0':
resolution: {integrity: sha512-KYAayyN5hQbJPtGKtRxlyc8XYmyntOplyXSQzTDrmbz7l/GCrzQbSswvyJFBTH1LGtsZrbXOAfN52i/Kz6kLKg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@oxc-parser/binding-linux-ppc64-gnu@0.156.0':
resolution: {integrity: sha512-ZuGRT/adReZZJn3PYNneb1HQIOH0iIZ2fzFgC1/XJYpMQ5KsRKmWIEzy3wEFsUwIOTomCmnmTZ/zbFYo9z9VeA==}
'@oxc-parser/binding-linux-ppc64-gnu@0.155.0':
resolution: {integrity: sha512-CSuSY5hfjtsBnHXydOj8jiNfS1qHbdPZuPz1YL1cSgK7VmNYP+QlZIbG0BBYYBgX/vYEgZwbG9mBdW4YairZ5w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@oxc-parser/binding-linux-riscv64-gnu@0.156.0':
resolution: {integrity: sha512-T+iWCeAOoEAJpHqr6/pogHIv98g9p8Ctccysm/h962hG4ayX5OL2c0Ih4oYe+JuFndLXy/OASvwMlTPe76sIiw==}
'@oxc-parser/binding-linux-riscv64-gnu@0.155.0':
resolution: {integrity: sha512-7KCfOQm+Nz2N8trAXbQkal4TQ5756WVEmhm35y816YHvyFnEfVsICsiV5k0pEszNf/fRm4cm2i6i18SJ6/iCWg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@oxc-parser/binding-linux-riscv64-musl@0.156.0':
resolution: {integrity: sha512-wL55bI2kVKfwdxScbw60zVgzAqbQbmE5zpSPWPZoZ9RSG8egm6ITE/UWE5mDWlglxz1QElJCcUbpaJCtHD11BQ==}
'@oxc-parser/binding-linux-riscv64-musl@0.155.0':
resolution: {integrity: sha512-JSlhgoK+/g1TGJI5NuADx2+6syhxnQNLCWLXyO5QLFyetomcr/vIxSdiNlmyAv963YXUzCuwAwRG6npZ5xyJ1A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@oxc-parser/binding-linux-s390x-gnu@0.156.0':
resolution: {integrity: sha512-+D+JilhLqwrDLODYEl4qtovVwgxKALb23FkAWBiPvgmUWYgjCV83KKuwwxZJM8GCdKlNA1vt3iKtow8HUFjXtg==}
'@oxc-parser/binding-linux-s390x-gnu@0.155.0':
resolution: {integrity: sha512-WFIX+dPokWp64mi434Md3U3lJaTwNxAphvGjpltoyQjGUsdXavOIRrnp9dOS34Hd75HOAwDxAI+YwWOwqmJbtg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@oxc-parser/binding-linux-x64-gnu@0.156.0':
resolution: {integrity: sha512-jRfwpN4xKrsEpC+SgrUPY5k0mINYZn7aLrt22I3uQFoumiSgHgsLYgS9f84ntbkvSydH4HiwGuDa2b1XCHaJzw==}
'@oxc-parser/binding-linux-x64-gnu@0.155.0':
resolution: {integrity: sha512-g6xSDC/JpbnVOz5uafMGyK3txBVRFMQTx8opv/yHXGxqV3ZMVl3bf7W8XrSnF68dmy3gM4dgReNryuE53+WkeQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@oxc-parser/binding-linux-x64-musl@0.156.0':
resolution: {integrity: sha512-P/ajnypgLmxmuRRyCIZcp2o4lOwmCaXYH5+eqDTcCW+MCTI+csKSw/Zc6GB67jZoVa4ey3q1jXEt7S60adBEMQ==}
'@oxc-parser/binding-linux-x64-musl@0.155.0':
resolution: {integrity: sha512-6/4xlxKlZJWrQ0uwDFPc0H9+xLu7068CKhX3vIDW3SbvP/lVgnVuT5v6dyugeWskWpuxqF/WJ4WKwhxjU3pG2w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@oxc-parser/binding-openharmony-arm64@0.156.0':
resolution: {integrity: sha512-WSN6rQZZc9KqgZ4lMfjVDvqKhVOCjey/YEZIPisGXmwBqwgWOzru207dyiH50LHcf1n9LO2oceGk/id6RL9v0g==}
'@oxc-parser/binding-openharmony-arm64@0.155.0':
resolution: {integrity: sha512-tltklL0J0XjDxIRTBXWOBhvc2mitcmES45pIxhwDWfxRyqz7Vkeu0NekTZEIxGE4f/lXgq3vZcjjffteQOVorg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
'@oxc-parser/binding-win32-arm64-msvc@0.156.0':
resolution: {integrity: sha512-l21Tz6tjraGBC3JefVeJZ9pojD0fCiB62PydAv+i9nrqJX7z/pDmyDNYLamDr/PRcQ4UQbFwkSnz7NKBB9UMLw==}
'@oxc-parser/binding-win32-arm64-msvc@0.155.0':
resolution: {integrity: sha512-alAb9TzjatUEsOeoncAziUnfdTDxfyswhalFZ9sC6plUgATIUx2NIZ0+bMn6aJ28AduS1OpG/OAisr/YISn4Ig==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
'@oxc-parser/binding-win32-ia32-msvc@0.156.0':
resolution: {integrity: sha512-CUq0ZFl/RODqPiIgfNNSamkpTj5x8AjBTkR/y1DNVIQiTGnmWqjHcn3o08ZW3q/LgkI4g9G9g6UirmmQFvuOZw==}
'@oxc-parser/binding-win32-ia32-msvc@0.155.0':
resolution: {integrity: sha512-yc5cbSfcGmRv/KpxDFuyk8adEBaWd/9HilWvBbQ4bFbus1V2PUh2mGB2Cfq9rqZTqLeiMT8x0skV+LKp9hOMgQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
'@oxc-parser/binding-win32-x64-msvc@0.156.0':
resolution: {integrity: sha512-dcpx5Y1x2v/cs7U/q3SZMvmxfyXjVvqC86jMuw2ZZUbHDd7W2cW7uSMQfg3GLVaE68Su3H9xd/Pc4v6QNyeSRg==}
'@oxc-parser/binding-win32-x64-msvc@0.155.0':
resolution: {integrity: sha512-8heq6jGq+rfpTDRDjoQiBHw0maQZf3IXkS99pdHQZPoTL5kyF5qyPS0RidUlSdnWDIqxXb5nux7GBD9cT+imUw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
'@oxc-project/types@0.155.0':
resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==}
'@oxc-project/types@0.156.0':
resolution: {integrity: sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==}
@@ -3855,8 +3858,8 @@ packages:
keyv@5.6.0:
resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
knip@6.44.2:
resolution: {integrity: sha512-6URO7pnqtOnyvSsXfW6+8C9j1lfcicxUCysXO0RgMtHTZ96HqCXh29op8iabeQW5JeIc8dJWwzSdJVWDokeScQ==}
knip@6.44.1:
resolution: {integrity: sha512-Hbd8nvkIsNgFfXgC7Jsb5LHv7jj6VwA3tmfHd53XPX2z9Vc9RnAZqV0BIiP4OrtYqKwCoLseFHQZerb1bNlbSw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -4227,8 +4230,8 @@ packages:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
oxc-parser@0.156.0:
resolution: {integrity: sha512-7JhjgOfZjrIFJH5TlHrpRua864Si5GvwrPr5+eIRCY2sszhKXo6pyhP0HQKOGTtfO4UowwZ72XTGba0+lZphOQ==}
oxc-parser@0.155.0:
resolution: {integrity: sha512-C/ReSf1JUFukK/zvk6jhcNibSssvas5+ktIzK7fbKVd3CedWe59C3QwHEOrEZj/4Rt9+xg0Jeis/Jv1F/KM1mw==}
engines: {node: ^20.19.0 || >=22.12.0}
oxc-resolver@11.24.2:
@@ -5064,8 +5067,8 @@ packages:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
ws@8.22.2:
resolution: {integrity: sha512-/rEZ2ejown2N5gxVTHUu9bVVC7ttu0/Tgzf5hbTOixR3Fs7mbbXgn2DbdbcKgJOmpQMtrIUWivtYuVMnp/W/yA==}
ws@8.22.1:
resolution: {integrity: sha512-oyL6OPYme/CmiFvNuGzeoxCJ4nOrZE2O1FwM9MWM1AsGri6nLXB2pg+lNA8aLeXMSav0J6eIVS1j6vUPzUtK9g==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -6483,63 +6486,65 @@ snapshots:
dependencies:
'@octokit/openapi-types': 29.0.1
'@oxc-parser/binding-android-arm-eabi@0.156.0':
'@oxc-parser/binding-android-arm-eabi@0.155.0':
optional: true
'@oxc-parser/binding-android-arm64@0.156.0':
'@oxc-parser/binding-android-arm64@0.155.0':
optional: true
'@oxc-parser/binding-darwin-arm64@0.156.0':
'@oxc-parser/binding-darwin-arm64@0.155.0':
optional: true
'@oxc-parser/binding-darwin-x64@0.156.0':
'@oxc-parser/binding-darwin-x64@0.155.0':
optional: true
'@oxc-parser/binding-freebsd-x64@0.156.0':
'@oxc-parser/binding-freebsd-x64@0.155.0':
optional: true
'@oxc-parser/binding-linux-arm-gnueabihf@0.156.0':
'@oxc-parser/binding-linux-arm-gnueabihf@0.155.0':
optional: true
'@oxc-parser/binding-linux-arm-musleabihf@0.156.0':
'@oxc-parser/binding-linux-arm-musleabihf@0.155.0':
optional: true
'@oxc-parser/binding-linux-arm64-gnu@0.156.0':
'@oxc-parser/binding-linux-arm64-gnu@0.155.0':
optional: true
'@oxc-parser/binding-linux-arm64-musl@0.156.0':
'@oxc-parser/binding-linux-arm64-musl@0.155.0':
optional: true
'@oxc-parser/binding-linux-ppc64-gnu@0.156.0':
'@oxc-parser/binding-linux-ppc64-gnu@0.155.0':
optional: true
'@oxc-parser/binding-linux-riscv64-gnu@0.156.0':
'@oxc-parser/binding-linux-riscv64-gnu@0.155.0':
optional: true
'@oxc-parser/binding-linux-riscv64-musl@0.156.0':
'@oxc-parser/binding-linux-riscv64-musl@0.155.0':
optional: true
'@oxc-parser/binding-linux-s390x-gnu@0.156.0':
'@oxc-parser/binding-linux-s390x-gnu@0.155.0':
optional: true
'@oxc-parser/binding-linux-x64-gnu@0.156.0':
'@oxc-parser/binding-linux-x64-gnu@0.155.0':
optional: true
'@oxc-parser/binding-linux-x64-musl@0.156.0':
'@oxc-parser/binding-linux-x64-musl@0.155.0':
optional: true
'@oxc-parser/binding-openharmony-arm64@0.156.0':
'@oxc-parser/binding-openharmony-arm64@0.155.0':
optional: true
'@oxc-parser/binding-win32-arm64-msvc@0.156.0':
'@oxc-parser/binding-win32-arm64-msvc@0.155.0':
optional: true
'@oxc-parser/binding-win32-ia32-msvc@0.156.0':
'@oxc-parser/binding-win32-ia32-msvc@0.155.0':
optional: true
'@oxc-parser/binding-win32-x64-msvc@0.156.0':
'@oxc-parser/binding-win32-x64-msvc@0.155.0':
optional: true
'@oxc-project/types@0.155.0': {}
'@oxc-project/types@0.156.0': {}
'@oxc-resolver/binding-android-arm-eabi@11.24.2':
@@ -8685,12 +8690,12 @@ snapshots:
dependencies:
'@keyv/serialize': 1.1.1
knip@6.44.2:
knip@6.44.1:
dependencies:
formatly: 0.11.4
get-tsconfig: 4.14.3
jiti: 2.7.0
oxc-parser: 0.156.0
oxc-parser: 0.155.0
oxc-resolver: 11.24.2
picomatch: 4.0.7
smol-toml: 1.9.1
@@ -9171,29 +9176,29 @@ snapshots:
type-check: 0.4.0
word-wrap: 1.2.5
oxc-parser@0.156.0:
oxc-parser@0.155.0:
dependencies:
'@oxc-project/types': 0.156.0
'@oxc-project/types': 0.155.0
optionalDependencies:
'@oxc-parser/binding-android-arm-eabi': 0.156.0
'@oxc-parser/binding-android-arm64': 0.156.0
'@oxc-parser/binding-darwin-arm64': 0.156.0
'@oxc-parser/binding-darwin-x64': 0.156.0
'@oxc-parser/binding-freebsd-x64': 0.156.0
'@oxc-parser/binding-linux-arm-gnueabihf': 0.156.0
'@oxc-parser/binding-linux-arm-musleabihf': 0.156.0
'@oxc-parser/binding-linux-arm64-gnu': 0.156.0
'@oxc-parser/binding-linux-arm64-musl': 0.156.0
'@oxc-parser/binding-linux-ppc64-gnu': 0.156.0
'@oxc-parser/binding-linux-riscv64-gnu': 0.156.0
'@oxc-parser/binding-linux-riscv64-musl': 0.156.0
'@oxc-parser/binding-linux-s390x-gnu': 0.156.0
'@oxc-parser/binding-linux-x64-gnu': 0.156.0
'@oxc-parser/binding-linux-x64-musl': 0.156.0
'@oxc-parser/binding-openharmony-arm64': 0.156.0
'@oxc-parser/binding-win32-arm64-msvc': 0.156.0
'@oxc-parser/binding-win32-ia32-msvc': 0.156.0
'@oxc-parser/binding-win32-x64-msvc': 0.156.0
'@oxc-parser/binding-android-arm-eabi': 0.155.0
'@oxc-parser/binding-android-arm64': 0.155.0
'@oxc-parser/binding-darwin-arm64': 0.155.0
'@oxc-parser/binding-darwin-x64': 0.155.0
'@oxc-parser/binding-freebsd-x64': 0.155.0
'@oxc-parser/binding-linux-arm-gnueabihf': 0.155.0
'@oxc-parser/binding-linux-arm-musleabihf': 0.155.0
'@oxc-parser/binding-linux-arm64-gnu': 0.155.0
'@oxc-parser/binding-linux-arm64-musl': 0.155.0
'@oxc-parser/binding-linux-ppc64-gnu': 0.155.0
'@oxc-parser/binding-linux-riscv64-gnu': 0.155.0
'@oxc-parser/binding-linux-riscv64-musl': 0.155.0
'@oxc-parser/binding-linux-s390x-gnu': 0.155.0
'@oxc-parser/binding-linux-x64-gnu': 0.155.0
'@oxc-parser/binding-linux-x64-musl': 0.155.0
'@oxc-parser/binding-openharmony-arm64': 0.155.0
'@oxc-parser/binding-win32-arm64-msvc': 0.155.0
'@oxc-parser/binding-win32-ia32-msvc': 0.155.0
'@oxc-parser/binding-win32-x64-msvc': 0.155.0
oxc-resolver@11.24.2:
optionalDependencies:
@@ -10002,7 +10007,7 @@ snapshots:
deepmerge-ts: 8.0.2
https-proxy-agent: 9.1.0(supports-color@7.2.0)
undici: 8.12.3
ws: 8.22.2
ws: 8.22.1
transitivePeerDependencies:
- bufferutil
- kerberos
@@ -10070,7 +10075,7 @@ snapshots:
string-width: 7.2.0
strip-ansi: 7.2.0
ws@8.22.2: {}
ws@8.22.1: {}
y18n@5.0.8: {}
+5 -5
View File
@@ -58,13 +58,13 @@ smartstring = { workspace = true, features = ["serde"] }
socket2 = { workspace = true }
warp = { version = "0.4.3", features = ["server"] }
open = "5.4.5"
rfd = { version = "0.18.0", default-features = false, features = ["common-controls-v6", "xdg-portal"] }
rfd = { version = "0.17.2", default-features = false, features = ["common-controls-v6"] }
dirs = "7.0.0"
dunce = "1.0.5"
nanoid = "0.5"
chrono = { workspace = true }
boa_engine = "0.22.0"
http-body-util = "0.1.5"
http-body-util = "0.1.4"
percent-encoding = "2.3.2"
reqwest = { workspace = true }
sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs.git", branch = "main", features = [
@@ -77,8 +77,8 @@ tauri-plugin-dialog = "2.8.4"
tauri-plugin-fs = "2.7.1"
tauri-plugin-deep-link = "2.6.3"
tauri-plugin-window-state = "2.5.0"
zip = "9.4.2"
flate2 = "1.1.11"
zip = "9.3.0"
flate2 = "1.1.10"
reqwest_dav = "0.3.3"
aes-gcm = { version = "0.11.1" }
base64 = "0.23.1"
@@ -97,7 +97,7 @@ async-trait = "0.1.92"
clash_verge_service_ipc = { git = "https://github.com/clash-verge-rev/clash-verge-service-ipc.git", tag = "v2.7.7", version = "2.7.7", features = [
"client",
] }
arc-swap = "1.9.4"
arc-swap = "1.9.3"
tokio-rustls = "0.26.6"
rustls = { version = "0.23.46", features = ["ring"] }
webpki-roots = "1.0.11"
+1 -7
View File
@@ -209,13 +209,7 @@ export const useRenderList = (
const renderGroups = useMemo(() => {
if (!proxyView) return []
// A profile whose only group is GLOBAL (mihomo then skips its built-in one)
// or that has no proxy-groups has nothing else to show in rule mode.
if (mode === 'rule') {
return proxyView.groups.length || !proxyView.global
? proxyView.groups
: [proxyView.global]
}
if (mode === 'rule') return proxyView.groups
const { global } = proxyView
if (!global) return []
const current = findCurrentGroupMember(proxyView, global)?.member
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "سرعة الرفع",
"downloadSpeed": "سرعة التنزيل"
},
"filter": {
"allNetworks": "كل الشبكات"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Upload-Geschwindigkeit",
"downloadSpeed": "Download-Geschwindigkeit"
},
"filter": {
"allNetworks": "Alle Netzwerke"
},
"actions": {
"active": "Aktiv",
"closed": "Geschlossen",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Upload Speed",
"downloadSpeed": "Download Speed"
},
"filter": {
"allNetworks": "All Networks"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Velocidad de subida",
"downloadSpeed": "Velocidad de descarga"
},
"filter": {
"allNetworks": "Todas las redes"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "سرعت بارگذاری",
"downloadSpeed": "سرعت دانلود"
},
"filter": {
"allNetworks": "همه شبکه‌ها"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Kecepatan Unggah",
"downloadSpeed": "Kecepatan Unduh"
},
"filter": {
"allNetworks": "Semua Jaringan"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "アップロード速度",
"downloadSpeed": "ダウンロード速度"
},
"filter": {
"allNetworks": "すべてのネットワーク"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "업로드 속도",
"downloadSpeed": "다운로드 속도"
},
"filter": {
"allNetworks": "모든 네트워크"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Velocidade de upload",
"downloadSpeed": "Velocidade de download"
},
"filter": {
"allNetworks": "Todas as redes"
},
"actions": {
"active": "Ativas",
"closed": "Fechadas",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Скорость загрузки",
"downloadSpeed": "Скорость скачивания"
},
"filter": {
"allNetworks": "Все сети"
},
"actions": {
"active": "Активные",
"closed": "Закрытые",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Yükleme Hızı",
"downloadSpeed": "İndirme Hızı"
},
"filter": {
"allNetworks": "Tüm Ağlar"
},
"actions": {
"active": "Etkin",
"closed": "Kapatılan",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "Йөкләү (чыгару) тизлеге",
"downloadSpeed": "Йөкләү тизлеге"
},
"filter": {
"allNetworks": "Барлык челтәрләр"
},
"actions": {
"active": "Active",
"closed": "Closed",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "上传速度",
"downloadSpeed": "下载速度"
},
"filter": {
"allNetworks": "全部网络"
},
"actions": {
"active": "活跃",
"closed": "已关闭",
+3
View File
@@ -21,6 +21,9 @@
"uploadSpeed": "上傳速度",
"downloadSpeed": "下載速度"
},
"filter": {
"allNetworks": "全部網路"
},
"actions": {
"active": "活躍",
"closed": "已關閉",
+43 -5
View File
@@ -71,6 +71,10 @@ const ORDER_OPTIONS = [
type OrderKey = (typeof ORDER_OPTIONS)[number]['id']
type NetworkFilter = 'all' | 'tcp' | 'udp'
let savedNetworkFilter: NetworkFilter = 'all'
const orderFunctionMap = ORDER_OPTIONS.reduce<Record<OrderKey, OrderFunc>>(
(acc, option) => {
acc[option.id] = option.fn
@@ -86,6 +90,9 @@ const ConnectionsPage = () => {
const { searchState, match, onSearch } = usePageSearch('connections')
const hasSearch = searchState.text.length > 0
const [curOrderOpt, setCurOrderOpt] = useState<OrderKey>('default')
const [networkFilter, setNetworkFilter] =
useState<NetworkFilter>(savedNetworkFilter)
const hasFilter = networkFilter !== 'all'
const [connectionsType, setConnectionsType] = useState<'active' | 'closed'>(
'active',
)
@@ -112,18 +119,30 @@ const ConnectionsPage = () => {
const filterConn = useMemo(() => {
const orderFunc = orderFunctionMap[curOrderOpt]
if (isTableLayout && !hasSearch) return selectedConnections
if (!hasSearch) return orderFunc([...selectedConnections])
if (isTableLayout && !hasSearch && !hasFilter) return selectedConnections
if (!hasSearch && !hasFilter) return orderFunc([...selectedConnections])
const matchConns = selectedConnections.filter((conn) => {
const { host, destinationIP, process } = conn.metadata
const { host, destinationIP, process, network } = conn.metadata
if (networkFilter !== 'all' && network !== networkFilter) return false
return (
match(host || '') || match(destinationIP || '') || match(process || '')
!hasSearch ||
match(host || '') ||
match(destinationIP || '') ||
match(process || '')
)
})
return orderFunc ? orderFunc(matchConns) : matchConns
}, [selectedConnections, isTableLayout, hasSearch, match, curOrderOpt])
}, [
selectedConnections,
isTableLayout,
hasSearch,
hasFilter,
networkFilter,
match,
curOrderOpt,
])
const displayRows = useConnectionRowViews(
isTableLayout ? EMPTY_CONNECTIONS : filterConn,
@@ -255,6 +274,25 @@ const ConnectionsPage = () => {
))}
</BaseStyledSelect>
)}
<BaseStyledSelect
value={networkFilter}
onChange={(e) => {
savedNetworkFilter = e.target.value as NetworkFilter
setNetworkFilter(savedNetworkFilter)
}}
>
<MenuItem value="all">
<span style={{ fontSize: 14 }}>
{t('connections.components.filter.allNetworks')}
</span>
</MenuItem>
<MenuItem value="tcp">
<span style={{ fontSize: 14 }}>TCP</span>
</MenuItem>
<MenuItem value="udp">
<span style={{ fontSize: 14 }}>UDP</span>
</MenuItem>
</BaseStyledSelect>
<Box
sx={{
flex: 1,
+1
View File
@@ -17,6 +17,7 @@ export const translationKeys = [
'connections.components.order.default',
'connections.components.order.uploadSpeed',
'connections.components.order.downloadSpeed',
'connections.components.filter.allNetworks',
'connections.components.actions.active',
'connections.components.actions.closed',
'connections.components.actions.closeConnection',
+3
View File
@@ -27,6 +27,9 @@ export interface TranslationResources {
type: string
ulSpeed: string
}
filter: {
allNetworks: string
}
order: {
default: string
downloadSpeed: string