Commit Graph
2289 Commits
Author SHA1 Message Date
Tunglies 0d3f141f20 test: remove redundant backend coverage 2026-08-22 08:53:42 +08:00
Tungliesandwonfen 629c00dc4a fix(port): handle stale macOS wildcard guards
Co-authored-by: wonfen <eiwonfen@gmail.com>
2026-08-22 04:17:15 +08:00
Tunglies 2717aaadad fix: media unlock checking behavior (#7778)
* fix: Gemini test

* naming unlock

* test type

* refactor: deduplicate media unlock checks

* fix: run media unlock checks individually

* fix(media-unlock): satisfy clippy const lint

* fix: stream media unlock test results

* fix: streamline media unlock checks

* fix: force HTTP/1 for media unlock checks

* fix: limit concurrent media unlock checks

* feat: allow concurrent media unlock item checks
2026-08-21 21:27:27 +08:00
wonfen 19401b096d fix(core): clean up the displaced core after a failed upgrade restart
Windows publishes the core by moving the running binary aside, and only the
success path could delete it afterwards. A failed restart left it on disk,
and the uninstaller did not know about it either.
2026-08-21 19:32:15 +08:00
TungliesandTheodore b1e953e495 chore(macos): update liquid glass icon
Co-authored-by: Theodore <57642656+AlwaysExtraordinary@users.noreply.github.com>
2026-08-21 18:34:01 +08:00
wonfen 1b75ea34f9 fix(core): upgrade mihomo atomically instead of letting it self-update
mihomo's updater truncates its own running executable in place; macOS kills
that under Hardened Runtime and leaves a 0-byte core. Verge now downloads the
release, verifies a staged copy next to the target, and renames it into place,
which never touches the inode the running core executes from.

Closes #6834
2026-08-21 14:41:57 +08:00
oomeow e71cf0ec68 feat: watch linux theme changed (#7781)
* feat: add Linux theme change notifications and update dark-light dependency

* fix: remove unused tauri Emitter import

* update changelog

* fix: clippy

* fix: pnpm format
2026-08-20 16:09:16 +00:00
Tunglies 332097bc9f chore: bump clash-verge-service-ipc to v2.6.4 2026-08-20 22:30:13 +08:00
Tunglies 927d794285 chore: bump version to 2.5.4 2026-08-20 17:31:23 +08:00
wonfen 12c85162d6 fix(port): skip unsupported Windows transparent listeners 2026-08-20 08:57:09 +08:00
wonfen b80bca01da fix: unblock pre-push checks 2026-08-20 08:13:02 +08:00
349c635de0 fix(sysproxy): use platform-specific bypass separator (#7559)
* fix(sysproxy): use platform bypass separator

* refactor: squash conditional compilation logic

- Share a single `BYPASS_SEPERATOR` definition between both Linux and macOS

---------

Co-authored-by: Ayanami <ay@nami.ltd>
Co-authored-by: ❤是纱雾酱哟~ <49941141+Dragon1573@users.noreply.github.com>
Co-authored-by: oomeow <oomeow@outlook.com>
2026-08-19 13:55:40 +00:00
wonfen 9b9feb9a39 fix: handle proxy cleanup failures during app exit 2026-08-19 20:04:21 +08:00
Tunglies fc5fdbfea6 perf(proxy): reuse group order names 2026-08-19 15:49:03 +08:00
wonfen e15ddab542 test: trim redundant test coverage 2026-08-19 10:24:37 +08:00
wonfen 807f9a206d chore: trim excessive comments 2026-08-19 07:27:43 +08:00
oomeow daadb126e0 feat: allow manually unfixing proxy nodes (#7756)
* feat(proxy): add ability to clear persisted node selection for groups

* feat(hooks): make proxy selection operations asynchronous

* chore: update tauri-plugin-mihomo deps

* refactor: rename clear_selected_node to forget_selected_node

* refactor(hooks): rename isFixed to isFixedProxy in useProxySelection

* docs: update changelog with manual node cancellation support

* chore(layout): remove dev-only mihomo websocket debugging interval
2026-08-18 12:16:42 +00:00
wonfen 9fa0e91e25 fix(tun): fall back to sidecar when service is absent 2026-08-18 11:05:53 +08:00
wonfen 4c1804baf4 fix: improve validation termination guidance 2026-08-18 09:11:04 +08:00
wonfen 747a68ef2f fix(port): stop the mixed port climbing on every restart
The startup fallback persisted its replacement, so a port blocked once was never
asked for again. It now overrides the Runtime Config for the session only.

Most of those conflicts were not real: SO_REUSEADDR cannot reuse a TIME_WAIT
socket owned by another user, and a service-managed core runs as root while the
app does not. A refused bind is now confirmed by asking whether anything answers.

Also restores the borrowed port when saving proxy ports fails.
2026-08-17 23:30:21 +08:00
wonfen 906ec5e63a fix: serialize concurrent configuration updates 2026-08-17 19:19:54 +08:00
wonfen ec6241b30a feat(profile): raise auto-update intervals below 24h
Each auto-update reloads the core, which drops every connection running through a
`proxy-providers` entry. Existing profiles are corrected once at startup; the form
warns about shorter intervals but still saves them.
2026-08-17 12:14:24 +08:00
wonfen 73d986369c fix(timer): count the first update delay from the last update
The queue got a full interval from now while the UI counted from `updated`, so a
restart pushed every deadline back and the countdown could read "update failed".
Retiring a task disabled mid-update also keeps its state, so re-enabling it no
longer starts a second run alongside the first.
2026-08-17 12:14:20 +08:00
wonfen 4869e362e3 fix: report fatal singleton startup errors 2026-08-17 07:18:34 +08:00
Tunglies 3618ee1e05 fix(clippy): remove redundant formatting borrow 2026-08-17 00:42:59 +08:00
Tunglies 1feba6f073 perf(tray): skip proxy data when menu groups are disabled 2026-08-17 00:42:59 +08:00
wonfen ac37945ee4 chore: bump service version to 2.6.2 2026-08-16 21:31:54 +08:00
雨落 def7a9ce98 fix(enhance): use a lenient timeout for ipc service invoking. (#7558)
Signed-off-by: 秋雨落 <i@rain.cx>
2026-08-16 02:41:49 +00:00
ChenXiangandTunglies c51dd535c1 fix polkit (#7360)
Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
2026-08-16 02:26:24 +00:00
Tunglies 49f638414b refactor: clean up unused backend code 2026-08-15 00:07:48 +08:00
wonfen 22947632c0 refactor: Rewrite and improve sysproxy logic (#7744)
* fix(cmd): preserve anyhow context in coded errors

Use alternate error formatting so coded failures retain the full anyhow context chain without changing their wire format.

* fix(macos): skip redundant proxy disable writes

When both proxy modes are off, read macOS state first and skip networksetup if the OS is already clean. Update the guard target only after a successful write.

* feat(proxy): classify system proxy failures

Attach stable, actionable proxy failure codes to anyhow chains while preserving the original diagnostic causes.

* feat(cmd): return structured command failures

Replace encoded error strings with serializable code and detail fields, and update frontend notice consumers to handle the structured shape.

* fix(scripts): use the js-yaml namespace import

Import js-yaml through its ESM namespace so the i18n cleanup script can access load and dump.

* feat(proxy): localize classified proxy failures

Map privilege and direct-fallback codes to localized explanations, and let mapped causes outrank generic operation keys in notices.

* fix(ui): bound notice text and render failure details

Limit resolved notice text without truncating clipboard content, and normalize structured failures embedded in translation parameters.

* feat(proxy): persist unseen proxy failures

Store unresolved classified failures by code, notify the frontend when the table changes, and show each failure sequence once when a visible window can receive it.

* feat(proxy): report tray and hotkey toggle failures

Record classified failures from tray and hotkey proxy toggles so they appear when a visible window is available.

* fix(ui): restore the proxy switch after failed toggles

Refresh frontend proxy state after a failed toggle so the switch reflects the rolled-back configuration.

* feat(proxy): stop the guard after repeated failures

Report guard outcomes, stop after the failure threshold, and persist the classified failure for the frontend.

* fix(macos): preserve proxy during service handoff

Stop a sidecar being handed to the service without clearing proxy state that the new owner must inherit.

* feat(macos): classify misplaced sidecar state

Distinguish a refused sidecar proxy write from a machine that still needs the privileged service installed.

* feat(ui): recover misplaced sidecar notices

Offer a restart action for macOS proxy failures caused by a ready service while the core still runs as a sidecar.

* feat(ui): install the service from proxy notices

Let privilege notices install the macOS service, restart the core, and report the runtime mode that was actually reached.

* feat(cmd): attach requested proxy operations

Carry the requested proxy direction with structured command failures when the originating command knows it.

* feat(sysproxy): drain guards before OS access

Wait for the local proxy guard to stop before OS reads, service handoff, or final writes, and refuse transitions when it does not drain.

* feat(sysproxy): recover partial proxy writes

Use write progress to choose whether to restore the old guard or compensate with a disabled proxy state, while preserving actionable errors.

* feat(sysproxy): skip already-applied proxy writes

Compare macOS proxy snapshots with global, PAC, and disabled targets so matching state avoids redundant privileged writes.

* feat(proxy): report background proxy failures

Persist and surface classified proxy failures from lifecycle paths that have no direct caller awaiting the result.

* feat(ui): move proxy recovery into a dialog

Guide users through installing or switching to the service after a refused proxy write, and suppress duplicate toast reports.

* fix(ui): close proxy dialog after service recovery

Dismiss the recovery dialog once the core reaches service mode, even when the original proxy request remains pending.

* feat(ui): retry proxy request after service recovery

Replay the requested proxy direction after the core reaches service mode, while leaving incidental restores unchanged.

* fix(proxy): refresh state after successful apply

Publish the proxy refresh from the shared apply path after releasing the lifecycle lock, and remove the tray-specific duplicate.

* feat(ui): show proxy recovery progress

Display installation, restart, and proxy-apply stages while keeping the primary action spinner visible during recovery.

* feat(ui): route unavailable TUN through service recovery

Let the TUN switch request service recovery and restore its requested state after the core restarts in service mode.

* fix(ui): avoid duplicate TUN recovery errors

Roll back deferred TUN toggles without reporting an error, and publish configuration refreshes from the transaction commit path.

* chore: update changelog & pinlock

* fix(core): resolve platform-specific clippy warnings

* fix(core): detect Windows wildcard TCP conflicts

Windows permits a specific exclusive bind beside an existing non-exclusive wildcard listener. Consult the system TCP listener table so the probe reports that overlap as a conflict.
2026-08-14 23:52:37 +08:00
wonfen 0844ed30a8 fix(core): only fail the macOS listener guard on real bind conflicts
Guard addresses can vanish or fail to bind for reasons unrelated to the
port, and probe_claims turned that into a persisted mixed-port fallback.
2026-08-14 22:01:21 +08:00
eviaaaaaandwonfen eb29c18246 fix(core): avoid false mixed-port fallback after quickly relaunching Clash (#7732)
* fix: ignore stale TCP state in port probe

* fix: preserve macOS listener conflict detection

---------

Co-authored-by: wonfen <eiwonfen@gmail.com>
2026-08-14 19:49:31 +08:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 00ca5c170c chore(deps): update rust crate futures to 0.3.34 (#7728)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-11 16:15:01 +00:00
Tunglies c11791137f perf(tray): avoid cloning runtime config 2026-08-10 22:13:33 +08:00
Tunglies eb769b44ab fix(macos): precompile liquid glass icon (ref #7682) 2026-08-09 16:05:03 +08:00
StarsSailandwonfen df7e52f25c fix: remove unnecessary allow_auto_update default value (#7697)
* fix: remove unnecessary allow_auto_update default value

* fix: normalize missing profile auto-update state

---------

Co-authored-by: wonfen <eiwonfen@gmail.com>
2026-08-09 06:29:01 +00:00
❤是纱雾酱哟~andTheodore c34781e167 preferences(icon): adds liquid glass icon support (#7682)
- Includes a liquid glass icon asset and updates the Tauri configuration to package it with the application bundle

Co-authored-by: Theodore <57642656+AlwaysExtraordinary@users.noreply.github.com>
2026-08-08 17:38:56 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 3df3ef89ee chore(deps): update rust crate async-trait to 0.1.92 (#7703)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-08 15:21:45 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> b138eb848d chore(deps): update rust crate open to 5.4.1 (#7690)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-06 00:24:04 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 859afee337 chore(deps): update rust crate base64 to 0.23.1 (#7680)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-04 21:27:26 +00:00
Tunglies a8275b20b7 refactor: extract media unlock checker crate 2026-08-04 11:37:54 +08:00
Tunglies c5b641e421 fix: make profile deletion rollback-safe 2026-08-03 20:00:01 +08:00
Tunglies 1599ca0e09 fix: add context to file-not-found errors (#7665) 2026-08-02 00:39:10 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> d60ded5b3f chore(deps): update rust crate rustls to 0.23.43 (#7629)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-01 16:50:53 +00:00
oomeow 49257a026c fix: app freeze when emit refresh proxy config event (#7662) 2026-08-01 15:19:26 +00:00
oomeow 8ef6f0cc23 chore: update tauri-plugin-mihomo deps (#7647)
* chore: update tauri-plugin-mihomo deps

* clippy
2026-07-31 14:02:20 +00:00
7d8f98e183 fix(macos): keep DNS state outside app bundle (#7544)
* fix(macos): keep DNS state outside app bundle

* fix(macos): restore legacy DNS state

---------

Co-authored-by: Arcanum <260421450+ArcanePivot@users.noreply.github.com>
Co-authored-by: wonfen <eiwonfen@gmail.com>
2026-07-31 09:44:56 +08:00
ef179fcf61 fix(home): manual update check not working when auto_check_update disabled (#7585)
* fix(config): prevent cleanup_orphaned_files from deleting active profiles

When IProfiles::new() fails to parse profiles.yaml (e.g., corrupt file), it
returns Self::default() with items: None. The subsequent
cleanup_orphaned_files() call then sees no active files and deletes all
profile files in the profiles/ directory except the two hardcoded protected
files (Merge.yaml and Script.js).

Guard cleanup_orphaned_files() against this by checking if items is None
or empty before proceeding. When items is unavailable, skip the cleanup
and log a warning instead of blindly deleting user data.

Fixes #7577

* fix(home): manual update check not working when auto_check_update disabled

When auto_check_update is false, useUpdate() sets enabled=false for the
SWR query, which sets the SWR key to null. Calling swr.mutate() on a null
key does not execute the queryFn, returning undefined instead.

This caused the home page's "last check time" click to instantly show
"already up to date" without actually checking for updates.

Fix: use revalidateQuery() for the manual checkUpdate function, which
uses the global SWR mutate with the actual query key, bypassing the
enabled: false state and always triggering a real network request.

Fixes #7584

* fix: preserve manual update and profile data

---------

Co-authored-by: Evan Gong <evan@users.noreply.github.com>
Co-authored-by: wonfen <96291150+wonfen@users.noreply.github.com>
Co-authored-by: wonfen <eiwonfen@gmail.com>
2026-07-31 06:52:10 +08:00
oomeow 10dbe60671 fix(proxy): fix inline providers being filtered after Mihomo API change (#7640)
* feat(proxy): add Inline vehicle type support

* docs: add fix for Mihomo API proxy-provider filtering to changelog
2026-07-30 14:49:38 +00:00