mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-19 16:10:46 +08:00
Compare commits
10
Commits
main
...
27efaf34f4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27efaf34f4 | ||
|
|
585c67f8c5 | ||
|
|
d6a2717fc4 | ||
|
|
84312a5cd1 | ||
|
|
63ee674dcb | ||
|
|
52dca35acb | ||
|
|
44477d97d4 | ||
|
|
0fefa7a7ff | ||
|
|
b6d94d45d5 | ||
|
|
9975322b9b |
@@ -5,7 +5,7 @@
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/node:2": {
|
||||
"version": "24.21.0",
|
||||
"pnpmVersion": "12.10.0"
|
||||
"pnpmVersion": "12.11.2"
|
||||
},
|
||||
"ghcr.io/devcontainers/features/rust:1": {
|
||||
"version": "1.99.0",
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"ff92739239d50701d56d10eb77fff5083a556fe471496674aa066c4f73b6b6d2","body_hash":"e7b165b458a07108c2e6bfe6f4ed61f5659ce81512691dda091165d5966ee732","compiler_version":"v0.89.21","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.87"}}
|
||||
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"8296ef86aad04ad225d29c7fe51dd18dfa50f258c46e8bd24e443193cc6f80fc","body_hash":"e7b165b458a07108c2e6bfe6f4ed61f5659ce81512691dda091165d5966ee732","compiler_version":"v0.89.21","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.87"}}
|
||||
# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"924af5fdc64061cfbf66fb584c8b07e2ac230c60","version":"v0.89.21"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.23","digest":"sha256:2c78aaba1c108e130e2d6d01e4f2cca334ea04c53e6f258913ac34173fe7e3b2","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.23@sha256:2c78aaba1c108e130e2d6d01e4f2cca334ea04c53e6f258913ac34173fe7e3b2"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.23","digest":"sha256:c15c3d1208df10c5b588a3657be53742aa982ae0909d1eb1812525268794ca64","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.23@sha256:c15c3d1208df10c5b588a3657be53742aa982ae0909d1eb1812525268794ca64"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.23","digest":"sha256:02ffc56dd40158223064ef03a78c2d9717473c93723b4e403d455ea6f0b09ae0","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.23@sha256:02ffc56dd40158223064ef03a78c2d9717473c93723b4e403d455ea6f0b09ae0"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.25","digest":"sha256:9be0a86220e807a0ecc89e53d7453468f7a53fbc6b3d1efd2299025ffe01d086","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.25@sha256:9be0a86220e807a0ecc89e53d7453468f7a53fbc6b3d1efd2299025ffe01d086"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e","pinned_image":"ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e"},{"image":"ghcr.io/github/github-mcp-server:v1.12.2","digest":"sha256:508a0857ec762b1ab1cece29193345b501fab1dd9d1228a7b617062954cecac6","pinned_image":"ghcr.io/github/github-mcp-server:v1.12.2@sha256:508a0857ec762b1ab1cece29193345b501fab1dd9d1228a7b617062954cecac6"}],"has_pull_request_target":true,"mcp_servers":[{"name":"github","tools":["get_pull_request","get_pull_request_comments","get_pull_request_diff","get_pull_request_files","get_pull_request_review_comments","get_pull_request_reviews","get_pull_request_status","issue_read","list_issue_types","list_issues","list_pull_requests","pull_request_read","search_issues","search_pull_requests"]},{"name":"safeoutputs","tools":["add_comment","add_labels","missing_data","missing_tool","noop","remove_labels"]}]}
|
||||
# This file was automatically generated by gh-aw (v0.89.21). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
|
||||
#
|
||||
@@ -541,7 +541,7 @@ jobs:
|
||||
GH_AW_SKILL_DIR: ".github/skills"
|
||||
run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh"
|
||||
- name: Make Copilot quota exhaustion non-blocking
|
||||
run: "node <<'NODE'\nconst fs = require('fs');\nconst harnessPath = `${process.env.RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs`;\nconst harness = fs.readFileSync(harnessPath, 'utf8');\nconst quotaBranch = [\n ' if (isQuotaExceeded) {',\n ' log(`attempt ${attempt + 1}: Copilot quota exceeded — not retrying`);',\n ' return { action: \"stop\" };',\n ' }',\n].join('\\n');\nconst nonBlockingQuotaBranch = [\n ' if (isQuotaExceeded) {',\n ' log(`attempt ${attempt + 1}: Copilot quota exceeded — not retrying`);',\n ' if (/\\\\b429\\\\b|Too Many Requests/i.test(result.output)) {',\n ' log(`attempt ${attempt + 1}: Copilot quota unavailable — exiting 0`);',\n ' return { action: \"stop\", exitCode: 0 };',\n ' }',\n ' return { action: \"stop\" };',\n ' }',\n].join('\\n');\n\nif (harness.split(quotaBranch).length !== 2) {\n throw new Error('Unexpected Copilot quota branch; re-audit the gh-aw upgrade');\n}\nfs.writeFileSync(harnessPath, harness.replace(quotaBranch, nonBlockingQuotaBranch));\nNODE"
|
||||
run: "node <<'NODE'\nconst fs = require('fs');\nconst harnessPath = `${process.env.RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs`;\nconst harness = fs.readFileSync(harnessPath, 'utf8');\nconst quotaBranch = [\n ' if (isQuotaExceeded) {',\n ' log(`attempt ${attempt + 1}: Copilot quota exceeded — not retrying`);',\n ' return { action: \"stop\" };',\n ' }',\n].join('\\n');\nconst nonBlockingQuotaBranch = [\n ' let quotaErrorMsg = null;',\n ' if (isQuotaExceeded) {',\n ' log(`attempt ${attempt + 1}: Copilot quota exceeded — not retrying`);',\n ' quotaErrorMsg = { action: \"stop\" };',\n ' }',\n ' if (/\\\\b429\\\\b|Too Many Requests/i.test(result.output)) {',\n ' log(`attempt ${attempt + 1}: Copilot quota unavailable — exiting 0`);',\n ' quotaErrorMsg = { action: \"stop\", exitCode: 0 };',\n ' }',\n ' if (quotaErrorMsg) {',\n ' return quotaErrorMsg;',\n ' }',\n].join('\\n');\n\nif (harness.split(quotaBranch).length !== 2) {\n throw new Error('Unexpected Copilot quota branch; re-audit the gh-aw upgrade');\n}\nfs.writeFileSync(harnessPath, harness.replace(quotaBranch, nonBlockingQuotaBranch));\nNODE"
|
||||
|
||||
- name: Download container images
|
||||
run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.28.23@sha256:2c78aaba1c108e130e2d6d01e4f2cca334ea04c53e6f258913ac34173fe7e3b2 ghcr.io/github/gh-aw-firewall/api-proxy:0.28.23@sha256:c15c3d1208df10c5b588a3657be53742aa982ae0909d1eb1812525268794ca64 ghcr.io/github/gh-aw-firewall/squid:0.28.23@sha256:02ffc56dd40158223064ef03a78c2d9717473c93723b4e403d455ea6f0b09ae0 ghcr.io/github/gh-aw-mcpg:v0.4.25@sha256:9be0a86220e807a0ecc89e53d7453468f7a53fbc6b3d1efd2299025ffe01d086 ghcr.io/github/gh-aw-node@sha256:bac2192f6374d6262116399b34fc5e143d576f82719e90a18261cae7480f4d4e ghcr.io/github/github-mcp-server:v1.12.2@sha256:508a0857ec762b1ab1cece29193345b501fab1dd9d1228a7b617062954cecac6
|
||||
|
||||
@@ -41,13 +41,17 @@ pre-agent-steps:
|
||||
' }',
|
||||
].join('\n');
|
||||
const nonBlockingQuotaBranch = [
|
||||
' let quotaErrorMsg = null;',
|
||||
' if (isQuotaExceeded) {',
|
||||
' log(`attempt ${attempt + 1}: Copilot quota exceeded — not retrying`);',
|
||||
' if (/\\b429\\b|Too Many Requests/i.test(result.output)) {',
|
||||
' log(`attempt ${attempt + 1}: Copilot quota unavailable — exiting 0`);',
|
||||
' return { action: "stop", exitCode: 0 };',
|
||||
' }',
|
||||
' return { action: "stop" };',
|
||||
' quotaErrorMsg = { action: "stop" };',
|
||||
' }',
|
||||
' if (/\\b429\\b|Too Many Requests/i.test(result.output)) {',
|
||||
' log(`attempt ${attempt + 1}: Copilot quota unavailable — exiting 0`);',
|
||||
' quotaErrorMsg = { action: "stop", exitCode: 0 };',
|
||||
' }',
|
||||
' if (quotaErrorMsg) {',
|
||||
' return quotaErrorMsg;',
|
||||
' }',
|
||||
].join('\n');
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
name: SignPath Test
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
|
||||
env:
|
||||
CARGO_INCREMENTAL: 0
|
||||
HUSKY: 0
|
||||
|
||||
jobs:
|
||||
sign-windows:
|
||||
runs-on: windows-latest
|
||||
timeout-minutes: 90
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- name: Install Rust
|
||||
uses: dtolnay/rust-toolchain@master
|
||||
with:
|
||||
toolchain: '1.99.0'
|
||||
targets: x86_64-pc-windows-msvc
|
||||
|
||||
- name: Install Node
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: '24.21.0'
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v6
|
||||
with:
|
||||
run_install: false
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Prepare build resources
|
||||
run: pnpm run prebuild x86_64-pc-windows-msvc
|
||||
|
||||
- name: Build test installer
|
||||
shell: pwsh
|
||||
env:
|
||||
NODE_OPTIONS: '--max-old-space-size=4096'
|
||||
run: |
|
||||
$configPath = Join-Path $env:RUNNER_TEMP 'signpath-test.json'
|
||||
'{"bundle":{"createUpdaterArtifacts":false}}' |
|
||||
Set-Content -LiteralPath $configPath -Encoding utf8
|
||||
pnpm exec tauri build --target x86_64-pc-windows-msvc --bundles nsis --config $configPath
|
||||
|
||||
- name: Upload unsigned installer
|
||||
id: unsigned
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: windows-x64-unsigned
|
||||
path: target/x86_64-pc-windows-msvc/release/bundle/nsis/*-setup.exe
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Sign with SignPath test certificate
|
||||
uses: signpath/github-action-submit-signing-request@v3
|
||||
with:
|
||||
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
|
||||
organization-id: '5b298f4d-010d-4bae-b665-70551a58839c'
|
||||
project-slug: 'clash-verge-rev'
|
||||
signing-policy-slug: 'test-signing'
|
||||
artifact-configuration-slug: 'initial'
|
||||
github-artifact-id: ${{ steps.unsigned.outputs.artifact-id }}
|
||||
wait-for-completion: true
|
||||
output-artifact-directory: signed
|
||||
|
||||
- name: Inspect installer signature
|
||||
shell: pwsh
|
||||
run: |
|
||||
Get-ChildItem -Path signed/*-setup.exe | ForEach-Object {
|
||||
$signature = Get-AuthenticodeSignature -LiteralPath $_.FullName
|
||||
if (-not $signature.SignerCertificate) {
|
||||
throw "No Authenticode signer certificate found for $($_.Name)"
|
||||
}
|
||||
$signature | Format-List Path, Status, StatusMessage, SignerCertificate
|
||||
}
|
||||
|
||||
- name: Upload signed test installer
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: windows-x64-test-signed
|
||||
path: signed/*-setup.exe
|
||||
if-no-files-found: error
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
nodejs 24.21.0
|
||||
pnpm 12.10.0
|
||||
pnpm 12.11.2
|
||||
rust 1.99.0
|
||||
|
||||
Generated
+7
-11
@@ -1083,7 +1083,7 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
|
||||
|
||||
[[package]]
|
||||
name = "clash-verge"
|
||||
version = "2.5.8"
|
||||
version = "2.5.9"
|
||||
dependencies = [
|
||||
"aes-gcm",
|
||||
"anyhow",
|
||||
@@ -1166,7 +1166,7 @@ dependencies = [
|
||||
"windows-service",
|
||||
"windows-sys 0.61.2",
|
||||
"winreg 0.56.0",
|
||||
"zip 8.6.0",
|
||||
"zip 9.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4038,9 +4038,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
|
||||
|
||||
[[package]]
|
||||
name = "lzma-rust2"
|
||||
version = "0.16.5"
|
||||
version = "0.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ca93e534d1142d1d0dcca6d25fe302508a5dfb40b302802904577725ea0b695b"
|
||||
checksum = "fde178a3caf126c440fa15628147772d8ee590a39477d711353fbe2e58a73a5b"
|
||||
dependencies = [
|
||||
"sha2 0.11.0",
|
||||
]
|
||||
@@ -10055,9 +10055,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zip"
|
||||
version = "8.6.0"
|
||||
version = "9.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b"
|
||||
checksum = "e49ade69c4434c55dd651d36fe05f38e0578db948b773cbc01c48c4b5e560692"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"bzip2",
|
||||
@@ -10070,6 +10070,7 @@ dependencies = [
|
||||
"indexmap 2.14.0",
|
||||
"lzma-rust2",
|
||||
"memchr",
|
||||
"nix",
|
||||
"pbkdf2",
|
||||
"ppmd-rust",
|
||||
"sha1 0.11.0",
|
||||
@@ -10187,8 +10188,3 @@ dependencies = [
|
||||
"syn 3.0.5",
|
||||
"winnow 1.0.4",
|
||||
]
|
||||
|
||||
[[patch.unused]]
|
||||
name = "tray-icon"
|
||||
version = "0.24.1"
|
||||
source = "git+https://github.com/Tunglies/tray-icon.git?branch=fix%2Fmacos-27-click-reentrancy#5750c67d02d32f2af100e120ad665959d4268cef"
|
||||
|
||||
@@ -50,11 +50,6 @@ split-debuginfo = "unpacked"
|
||||
# Backport Windows menu command ID recycling on the muda 0.20 compatibility branch.
|
||||
muda = { git = "https://github.com/wonfen/muda.git", rev = "547de49352791653fbdfa785f20f3c7ece8468e2" }
|
||||
|
||||
# macOS Golden Gate fix for tray-icon click reentrancy issue
|
||||
# Remove the following patch once the fix is merged upstream(tauri)
|
||||
# https://github.com/tauri-apps/tray-icon/pull/365
|
||||
tray-icon = { git = "https://github.com/Tunglies/tray-icon.git", branch = "fix/macos-27-click-reentrancy" }
|
||||
|
||||
[workspace.dependencies]
|
||||
clash-verge-draft = { path = "crates/clash-verge-draft" }
|
||||
clash-verge-media-unlock = { path = "crates/clash-verge-media-unlock" }
|
||||
|
||||
+3
-30
@@ -1,51 +1,24 @@
|
||||
## v2.5.8
|
||||
## v2.5.9
|
||||
|
||||
<details>
|
||||
<summary><strong> 🐞 修复问题 </strong></summary>
|
||||
|
||||
- 修复系统托盘代理组行不显示延迟、超时项与未测过项无法区分的问题
|
||||
- 修复不同订阅源的同名节点测速和延迟显示指向错误节点的问题
|
||||
- 修复端口设置混淆保存值与运行值、输入无效时缺少提示的问题
|
||||
- 修复已有内核进程阻止启动时缺少多语言说明和处理建议的问题
|
||||
- 修复从开始菜单再次打开应用后,窗口反复弹出并提示启动失败的问题
|
||||
- 修复多个代理集合包含同名节点时,代理组中的节点变灰并显示 ambiguous、无法选择的问题
|
||||
- 修复手动更新时重复下载后台已下载的安装包、启动时选「稍后」后每次启动都重新下载的问题
|
||||
- 修复下载更新时镜像缓慢或卡住不会切换下载地址、点击「取消」无法中止下载的问题
|
||||
- 修复关闭「自动检查更新」后,启动时仍弹出已下载更新的安装提示的问题
|
||||
- 修复从 Dock 退出、注销或关机时,应用可能长时间卡住无法退出的问题
|
||||
- 修复宽窗口下「订阅」页每行显示过多卡片,导致配置名称被截断的问题
|
||||
|
||||
**🖥️ Windows**
|
||||
|
||||
- 修复 Windows 升级后因文件权限异常无法启动、需要手动清理配置的问题
|
||||
- 修复 Windows 服务启动类型被改为手动后,软件启动卡住约两分钟的问题,并提供一键修复
|
||||
- 修复 Windows 长时间运行后,托盘菜单点击无响应的问题
|
||||
|
||||
**🍎 macOS**
|
||||
|
||||
- 修复 macOS 关闭 TUN 或退出后,系统 DNS 仍停留在 `114.114.114.114` 导致无法解析域名的问题
|
||||
|
||||
**🖥️/🍎 Windows/macOS**
|
||||
|
||||
- 修复 Windows/macOS 打开系统托盘菜单时,节点延迟与自动选择状态未刷新的问题
|
||||
- 修复通过 URL 导入订阅时,即使导入的订阅并非当前使用的订阅,也会重新加载当前配置的问题
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong> ✨ 新增功能 </strong></summary>
|
||||
|
||||
- 新增系统托盘代理组中的「测试延迟」菜单项
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong> 🚀 优化改进 </strong></summary>
|
||||
|
||||
- 优化端口设置窗口的实现,精简重复代码
|
||||
- 优化侧边栏流量图表的 CPU 占用
|
||||
|
||||
**🖥️ Windows**
|
||||
|
||||
- 优化 Windows 服务安全检查未通过时的提示:启动、安装或修复服务时说明原因与内核占用,并提供处理方法
|
||||
- Windows 系统代理默认绕过 `*.local` 域名,访问局域网设备的 `.local` 主机名时不再经过代理
|
||||
|
||||
</details>
|
||||
|
||||
@@ -70,6 +70,8 @@ tray:
|
||||
global: Global
|
||||
profiles: Perfis
|
||||
proxies: Proxies
|
||||
testLatency: Test Latency
|
||||
testingLatency: Testing latency…
|
||||
systemProxy: Proxy do sistema
|
||||
tunMode: Modo TUN
|
||||
closeAllConnections: Fechar todas as conexões
|
||||
|
||||
@@ -1,3 +1,55 @@
|
||||
## v2.5.8
|
||||
|
||||
<details>
|
||||
<summary><strong> 🐞 修复问题 </strong></summary>
|
||||
|
||||
- 修复系统托盘代理组行不显示延迟、超时项与未测过项无法区分的问题
|
||||
- 修复不同订阅源的同名节点测速和延迟显示指向错误节点的问题
|
||||
- 修复端口设置混淆保存值与运行值、输入无效时缺少提示的问题
|
||||
- 修复已有内核进程阻止启动时缺少多语言说明和处理建议的问题
|
||||
- 修复从开始菜单再次打开应用后,窗口反复弹出并提示启动失败的问题
|
||||
- 修复多个代理集合包含同名节点时,代理组中的节点变灰并显示 ambiguous、无法选择的问题
|
||||
- 修复手动更新时重复下载后台已下载的安装包、启动时选「稍后」后每次启动都重新下载的问题
|
||||
- 修复下载更新时镜像缓慢或卡住不会切换下载地址、点击「取消」无法中止下载的问题
|
||||
- 修复关闭「自动检查更新」后,启动时仍弹出已下载更新的安装提示的问题
|
||||
- 修复从 Dock 退出、注销或关机时,应用可能长时间卡住无法退出的问题
|
||||
- 修复宽窗口下「订阅」页每行显示过多卡片,导致配置名称被截断的问题
|
||||
|
||||
**🖥️ Windows**
|
||||
|
||||
- 修复 Windows 升级后因文件权限异常无法启动、需要手动清理配置的问题
|
||||
- 修复 Windows 服务启动类型被改为手动后,软件启动卡住约两分钟的问题,并提供一键修复
|
||||
- 修复 Windows 长时间运行后,托盘菜单点击无响应的问题
|
||||
|
||||
**🍎 macOS**
|
||||
|
||||
- 修复 macOS 关闭 TUN 或退出后,系统 DNS 仍停留在 `114.114.114.114` 导致无法解析域名的问题
|
||||
|
||||
**🖥️/🍎 Windows/macOS**
|
||||
|
||||
- 修复 Windows/macOS 打开系统托盘菜单时,节点延迟与自动选择状态未刷新的问题
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong> ✨ 新增功能 </strong></summary>
|
||||
|
||||
- 新增系统托盘代理组中的「测试延迟」菜单项
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong> 🚀 优化改进 </strong></summary>
|
||||
|
||||
- 优化端口设置窗口的实现,精简重复代码
|
||||
- 优化侧边栏流量图表的 CPU 占用
|
||||
|
||||
**🖥️ Windows**
|
||||
|
||||
- 优化 Windows 服务安全检查未通过时的提示:启动、安装或修复服务时说明原因与内核占用,并提供处理方法
|
||||
|
||||
</details>
|
||||
|
||||
## v2.5.7
|
||||
|
||||
<details>
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "clash-verge",
|
||||
"version": "2.5.8",
|
||||
"version": "2.5.9",
|
||||
"license": "GPL-3.0-only",
|
||||
"scripts": {
|
||||
"prepare": "husky || true",
|
||||
@@ -146,5 +146,5 @@
|
||||
]
|
||||
},
|
||||
"type": "module",
|
||||
"packageManager": "pnpm@12.10.0"
|
||||
"packageManager": "pnpm@12.11.2"
|
||||
}
|
||||
|
||||
Generated
+61
-61
@@ -7,153 +7,153 @@ importers:
|
||||
configDependencies: {}
|
||||
packageManagerDependencies:
|
||||
pnpm:
|
||||
specifier: 12.10.0
|
||||
version: 12.10.0
|
||||
specifier: 12.11.2
|
||||
version: 12.11.2
|
||||
|
||||
packages:
|
||||
|
||||
'@pnpm/exe.android-arm64@12.10.0':
|
||||
resolution: {integrity: sha512-QMMRzOI/7CU4xLbKY6O2BZn3VI4+a8LLyim18H7it8llBWuBPMqDqUURE8045k+7lI8/lI2/tElhyKptEviKDQ==}
|
||||
'@pnpm/exe.android-arm64@12.11.2':
|
||||
resolution: {integrity: sha512-owLw13OfPkEoY+hLBNeeG+dCFhywr7q2d/EHPz4mNL2RhKnv8gNwMARkjkiDQu234aItVwFNDeGnmQXm+ikkAg==}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@pnpm/exe.android-x64@12.10.0':
|
||||
resolution: {integrity: sha512-41zwlROW+t523Nfqo4rWp8IPiSK5vnAWrnCey26Je45rX1SMNc4ABY7OFmPw41/t+Y0CE+4tjTj+0s9YGqPM5w==}
|
||||
'@pnpm/exe.android-x64@12.11.2':
|
||||
resolution: {integrity: sha512-GYPkVebl4iokOA/4MPSpGoUVfFlsth7uqOCe1XiaiM23LAdvUOMJBObqHJijr89ZqjwHm9pO6vO45GRwJ2U2qA==}
|
||||
cpu: [x64]
|
||||
os: [android]
|
||||
|
||||
'@pnpm/exe.darwin-arm64@12.10.0':
|
||||
resolution: {integrity: sha512-L+r7AD8Fjf8Vcc4ZRJl+Pjzc27CIeQ/FiRwPmOluFO2UcXubmGHdW+OuMUxrU0vkoXiGR61Ft0RtaPwTRY4W/g==}
|
||||
'@pnpm/exe.darwin-arm64@12.11.2':
|
||||
resolution: {integrity: sha512-n9M4On66y8FDxUAKgMO1FXt0qihyG4e+56p3/F0uo8Bx9KplW8BwKVnXigzCJ8aNM6sVVPkOE6M9XXbeVIxnZA==}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@pnpm/exe.darwin-x64@12.10.0':
|
||||
resolution: {integrity: sha512-/TCF1K6E+4PnbkLgqGS1Iqlf5bHp6FDzuXgu6++PMMAFkF7Yk5EF3BcfG1gYYjpkvlJBccvVMsRBnWFbSyqu1w==}
|
||||
'@pnpm/exe.darwin-x64@12.11.2':
|
||||
resolution: {integrity: sha512-oSW7n3sBT0c0cyk4kj10T2Y6Mpm+OFEiCAWozgX039tdoI6yqJF1uaFD3sw7ugLdu6VV3+uY0pa1TUZIPdxDWA==}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@pnpm/exe.freebsd-x64@12.10.0':
|
||||
resolution: {integrity: sha512-k7/WFA91E2qhnR/2EOEv402U8bjP758y2pybbdiB5Hrd4KhgviVOJp5cFrXpKgd8HZJs/RZN7cdmMvU2Q2BVgg==}
|
||||
'@pnpm/exe.freebsd-x64@12.11.2':
|
||||
resolution: {integrity: sha512-qbzc3KoDpa/Lkf8vs3jnDe6dUUbso+6eLIyssYFMiliLpYNxn8dirk11YoNnOQcdHVB50v5RFls1Yid6ttT5pg==}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@pnpm/exe.linux-arm64-musl@12.10.0':
|
||||
resolution: {integrity: sha512-ChD8bN0lRCRaL+CMOaMUgZQ4WHzEkDXmDHrZgXgdoo6yymQKKzr66Ic7Sl/D7Ky1cVUcFEzHjlq4fGDJwt6Lqg==}
|
||||
'@pnpm/exe.linux-arm64-musl@12.11.2':
|
||||
resolution: {integrity: sha512-uMEYDwKRktGwANubQ+kYCwmhNwg3Ik6qK89ahsbQ5cP30R/5FVJb/T99vr9XRUBC/A7mZI6eeT92oyVas9ACyg==}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@pnpm/exe.linux-arm64@12.10.0':
|
||||
resolution: {integrity: sha512-egl5RUSQFh7kETBdmMhaTuaQKP1pjH6Cxq370zgpFFKJXF+GGkIzK+jLNazrjX9pKIWF3iqn7kUeyP6yKxzBoA==}
|
||||
'@pnpm/exe.linux-arm64@12.11.2':
|
||||
resolution: {integrity: sha512-6e8ZAQUwFXAWHHHv5FesWqf/kEK04wuitBv5f/gxzkC0DiBfaixr+f+6JQede8SF4Ji5LcMwVFJbzAtffpWxEg==}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@pnpm/exe.linux-ppc64@12.10.0':
|
||||
resolution: {integrity: sha512-YJ6bEZ+stPpv71CGfGQQeyIpMx/zSMEcAXQzG+rjBtzVfyNsxYciRevhJ+PE9b2qKqN78Mh/1tOMmx9ly4VXGw==}
|
||||
'@pnpm/exe.linux-ppc64@12.11.2':
|
||||
resolution: {integrity: sha512-Ui8A4nepkVupx2VpuFfysEluMvWK6gTB5rgVts7Ss/+8dj0RD28x3F/seNeH/zSypgC6yKdV6qsKVQh/uffTuQ==}
|
||||
cpu: [ppc64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@pnpm/exe.linux-riscv64@12.10.0':
|
||||
resolution: {integrity: sha512-njfd4euctC1zH1nVBbm6+r1c+0y/TtgqN523rk/KMSxqItpV5QAVa9Yz48Rt5DOIKmuLq7xXOhsQodBlbTk3pw==}
|
||||
'@pnpm/exe.linux-riscv64@12.11.2':
|
||||
resolution: {integrity: sha512-i1yLdQ5bu+wjQ+srtFoJAaY2gN/+oXHFdjul4llCeoDxHE0rTIG3R41NhHfCjyFPW4+CpbBT58933CL9sMOCnA==}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@pnpm/exe.linux-s390x@12.10.0':
|
||||
resolution: {integrity: sha512-4JI2F8pYGMcsG6ny61OiBSvZeDozc64TbPozbTU2X5uCsaFCsCvcpr/WwyypwCv+/mNjcIhaKhlxpwJYsnteIg==}
|
||||
'@pnpm/exe.linux-s390x@12.11.2':
|
||||
resolution: {integrity: sha512-YS1/lhPjjTsN4QL50VaFZKRa3Uc/bDnhE8eKbJMFvuX06UuFS5YaiDg04APoZdfVSGqTfX27QAg7rfLMSWaqxA==}
|
||||
cpu: [s390x]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@pnpm/exe.linux-x64-musl@12.10.0':
|
||||
resolution: {integrity: sha512-xayd2iG8ugdvjlGeOvsfm+iSe0bFu9RTX3/8HWOLAQmHdbLKi4hPbxP0S4c9tj8pNej/IxVBQLJksRXFlhNjPw==}
|
||||
'@pnpm/exe.linux-x64-musl@12.11.2':
|
||||
resolution: {integrity: sha512-7eIxQR05fvJxCujUSKp5KTtehJ7QqrgqP/HD1+BcB/SaV2Be4XI1PEHiOgA1zxsiMIeMvTF6E4G4dYHrFjeXRg==}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@pnpm/exe.linux-x64@12.10.0':
|
||||
resolution: {integrity: sha512-PFkzWEghFLKuocxMHtn57mlJ59f5aBbqjX6FCUtiunEHqxTxOibSduQPs3Llm6VWbAXBjD3VrX29Z+bjU1Dpyw==}
|
||||
'@pnpm/exe.linux-x64@12.11.2':
|
||||
resolution: {integrity: sha512-FK7QKe24AYgppJwO3mpooYptduuvIGqKJPi5ac7MdnWkjUy46JBfYhCW0grnkWKC8YOf0x+vGviuQqJEj3SpQQ==}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@pnpm/exe.win32-arm64@12.10.0':
|
||||
resolution: {integrity: sha512-0HtTS+TLONWd/dNSczyOkK0UeZ36cbdhC/2ljZ61DPhvc4jTb7ur0yU47On0in7Im3yXwzTY4vtF8ykrDwc+NQ==}
|
||||
'@pnpm/exe.win32-arm64@12.11.2':
|
||||
resolution: {integrity: sha512-PCTjVDdJb6VvraZxrEeFv6EqEA0hhIsAySx28e95J2Tqpi88hLpgOXgNqV0vpxq9A+b8GLQfyk/D+1UlJPv/YQ==}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@pnpm/exe.win32-x64@12.10.0':
|
||||
resolution: {integrity: sha512-IcW3rehTGzJ7YnmHEWnbnJakjbBmnH0r29qiajK9+6b9psMF9IjocFr0dyitRVSfXxyW/FI5PIK3mOswGoyFTg==}
|
||||
'@pnpm/exe.win32-x64@12.11.2':
|
||||
resolution: {integrity: sha512-8sgX86OvRjJ3yZs/TvGR2L31wH9ScPZ+f+geKI3ikuB0RRiK3i4LlTRO8OXN6pdRqj8epMde4312MCjj7JsJdA==}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
pnpm@12.10.0:
|
||||
resolution: {integrity: sha512-Eip7bd+dQCaLwNsal4CJm5Xk+out/Ke9RQYVrYz3wmWfX1acIO18U4hrx7CNDVClT0rVBwaEf1aC7GxQSEFlOQ==}
|
||||
pnpm@12.11.2:
|
||||
resolution: {integrity: sha512-JaUWUqGWeFr18ovabf6NxYLr76SsHRgCIc4TkCMcX7dmN4IupLbkYzznSs3LCnf3Ja8RutOBd/3t2u6BipVcuQ==}
|
||||
engines: {node: '>=18.*'}
|
||||
hasBin: true
|
||||
|
||||
snapshots:
|
||||
|
||||
'@pnpm/exe.android-arm64@12.10.0':
|
||||
'@pnpm/exe.android-arm64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.android-x64@12.10.0':
|
||||
'@pnpm/exe.android-x64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.darwin-arm64@12.10.0':
|
||||
'@pnpm/exe.darwin-arm64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.darwin-x64@12.10.0':
|
||||
'@pnpm/exe.darwin-x64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.freebsd-x64@12.10.0':
|
||||
'@pnpm/exe.freebsd-x64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-arm64-musl@12.10.0':
|
||||
'@pnpm/exe.linux-arm64-musl@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-arm64@12.10.0':
|
||||
'@pnpm/exe.linux-arm64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-ppc64@12.10.0':
|
||||
'@pnpm/exe.linux-ppc64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-riscv64@12.10.0':
|
||||
'@pnpm/exe.linux-riscv64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-s390x@12.10.0':
|
||||
'@pnpm/exe.linux-s390x@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-x64-musl@12.10.0':
|
||||
'@pnpm/exe.linux-x64-musl@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.linux-x64@12.10.0':
|
||||
'@pnpm/exe.linux-x64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.win32-arm64@12.10.0':
|
||||
'@pnpm/exe.win32-arm64@12.11.2':
|
||||
optional: true
|
||||
|
||||
'@pnpm/exe.win32-x64@12.10.0':
|
||||
'@pnpm/exe.win32-x64@12.11.2':
|
||||
optional: true
|
||||
|
||||
pnpm@12.10.0:
|
||||
pnpm@12.11.2:
|
||||
optionalDependencies:
|
||||
'@pnpm/exe.android-arm64': 12.10.0
|
||||
'@pnpm/exe.android-x64': 12.10.0
|
||||
'@pnpm/exe.darwin-arm64': 12.10.0
|
||||
'@pnpm/exe.darwin-x64': 12.10.0
|
||||
'@pnpm/exe.freebsd-x64': 12.10.0
|
||||
'@pnpm/exe.linux-arm64': 12.10.0
|
||||
'@pnpm/exe.linux-arm64-musl': 12.10.0
|
||||
'@pnpm/exe.linux-ppc64': 12.10.0
|
||||
'@pnpm/exe.linux-riscv64': 12.10.0
|
||||
'@pnpm/exe.linux-s390x': 12.10.0
|
||||
'@pnpm/exe.linux-x64': 12.10.0
|
||||
'@pnpm/exe.linux-x64-musl': 12.10.0
|
||||
'@pnpm/exe.win32-arm64': 12.10.0
|
||||
'@pnpm/exe.win32-x64': 12.10.0
|
||||
'@pnpm/exe.android-arm64': 12.11.2
|
||||
'@pnpm/exe.android-x64': 12.11.2
|
||||
'@pnpm/exe.darwin-arm64': 12.11.2
|
||||
'@pnpm/exe.darwin-x64': 12.11.2
|
||||
'@pnpm/exe.freebsd-x64': 12.11.2
|
||||
'@pnpm/exe.linux-arm64': 12.11.2
|
||||
'@pnpm/exe.linux-arm64-musl': 12.11.2
|
||||
'@pnpm/exe.linux-ppc64': 12.11.2
|
||||
'@pnpm/exe.linux-riscv64': 12.11.2
|
||||
'@pnpm/exe.linux-s390x': 12.11.2
|
||||
'@pnpm/exe.linux-x64': 12.11.2
|
||||
'@pnpm/exe.linux-x64-musl': 12.11.2
|
||||
'@pnpm/exe.win32-arm64': 12.11.2
|
||||
'@pnpm/exe.win32-x64': 12.11.2
|
||||
|
||||
---
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "clash-verge"
|
||||
version = "2.5.8"
|
||||
version = "2.5.9"
|
||||
description = "clash verge"
|
||||
authors = ["zzzgydi", "Tunglies", "wonfen", "MystiPanda"]
|
||||
license = "GPL-3.0-only"
|
||||
@@ -80,7 +80,7 @@ tauri-plugin-fs = "2.6.0"
|
||||
tauri-plugin-process = "2.4.0"
|
||||
tauri-plugin-deep-link = "2.6.1"
|
||||
tauri-plugin-window-state = "2.5.0"
|
||||
zip = "8.6.0"
|
||||
zip = "9.0.1"
|
||||
flate2 = "1.1.10"
|
||||
reqwest_dav = "0.3.3"
|
||||
aes-gcm = { version = "0.11.1" }
|
||||
|
||||
@@ -261,7 +261,7 @@ impl Default for Sysopt {
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
static DEFAULT_BYPASS: &str = "localhost;127.*;192.168.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;<local>";
|
||||
static DEFAULT_BYPASS: &str = "localhost;127.*;192.168.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;*.local;<local>";
|
||||
#[cfg(target_os = "windows")]
|
||||
static BYPASS_SEPARATOR: &str = ";";
|
||||
#[cfg(target_os = "linux")]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "2.5.8",
|
||||
"version": "2.5.9",
|
||||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||
"bundle": {
|
||||
"active": true,
|
||||
|
||||
@@ -684,6 +684,9 @@ export const RulesEditorViewer = (props: Props) => {
|
||||
ruleType.name !== 'SUB-RULE' && (
|
||||
<TextField
|
||||
autoComplete="new-password"
|
||||
autoCorrect="off"
|
||||
autoCapitalize="off"
|
||||
spellCheck="false"
|
||||
size="small"
|
||||
sx={{ minWidth: '240px' }}
|
||||
slotProps={{
|
||||
|
||||
@@ -138,7 +138,7 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
|
||||
|
||||
const defaultBypass = () => {
|
||||
if (isWindows) {
|
||||
return 'localhost;127.*;192.168.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;<local>'
|
||||
return 'localhost;127.*;192.168.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;*.local;<local>'
|
||||
}
|
||||
if (systemName === 'linux') {
|
||||
return 'localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,::1'
|
||||
|
||||
+12
-6
@@ -212,10 +212,12 @@ const ProfilePage = () => {
|
||||
}
|
||||
setLoading(true)
|
||||
|
||||
const prevCurrent = profiles.current
|
||||
|
||||
const handleImportSuccess = async (noticeKey: string) => {
|
||||
showNotice.success(noticeKey)
|
||||
setUrl('')
|
||||
await performRobustRefresh()
|
||||
await performRobustRefresh(prevCurrent)
|
||||
}
|
||||
try {
|
||||
await mutate(() => importProfile(url), {
|
||||
@@ -261,7 +263,7 @@ const ProfilePage = () => {
|
||||
}
|
||||
|
||||
// `useProfiles` already retries three times; add only one business-level retry.
|
||||
const performRobustRefresh = async () => {
|
||||
const performRobustRefresh = async (prevCurrent?: string) => {
|
||||
let retryCount = 0
|
||||
const maxRetries = 1
|
||||
const baseDelay = 200
|
||||
@@ -270,13 +272,15 @@ const ProfilePage = () => {
|
||||
try {
|
||||
debugLog(`[导入刷新] 第${retryCount + 1}次尝试刷新配置数据`)
|
||||
|
||||
await mutateProfiles()
|
||||
const fresh = await fetchProfilesIntoCache()
|
||||
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, baseDelay * (retryCount + 1)),
|
||||
)
|
||||
|
||||
await onEnhance(false)
|
||||
if (fresh?.current !== prevCurrent) {
|
||||
await onEnhance(false)
|
||||
}
|
||||
return
|
||||
} catch (error) {
|
||||
console.error(`[导入刷新] 第${retryCount + 1}次刷新失败:`, error)
|
||||
@@ -289,8 +293,10 @@ const ProfilePage = () => {
|
||||
|
||||
console.warn(`[导入刷新] 常规刷新失败,尝试清除缓存重新获取`)
|
||||
try {
|
||||
await fetchProfilesIntoCache()
|
||||
await onEnhance(false)
|
||||
const fresh = await fetchProfilesIntoCache()
|
||||
if (fresh?.current !== prevCurrent) {
|
||||
await onEnhance(false)
|
||||
}
|
||||
showNotice.error(
|
||||
'profiles.page.feedback.notifications.importNeedsRefresh',
|
||||
3000,
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
} from '@/services/cmds'
|
||||
import { mutate } from '@/services/mutate'
|
||||
|
||||
export function readLegacyTestUrls(uid: string): Record<string, string> {
|
||||
function readLegacyTestUrls(uid: string): Record<string, string> {
|
||||
try {
|
||||
const states = JSON.parse(localStorage.getItem('proxy-head-state') || '{}')[
|
||||
uid
|
||||
|
||||
Reference in New Issue
Block a user