Commit Graph
1588 Commits
Author SHA1 Message Date
oomeow c2ddb5c111 refactor: activate selected proxies (#7285)
* feat(profiles): add automatic node activation after profile switch

* refactor(use-profiles): simplify patchCurrent logic by always mutating profiles

* refactor(use-profiles): remove unused activateSelected function and related imports

* refactor: rename worker handle to activate selected task

* fix: clippy

* refactor(config): replace log statements with structured logging

* refactor(config): fix incorrect retry logic in profile activation

* feat(profiles): update proxy cache when switching profiles

* docs: update changelog with bug fixes and logic improvements

* refactor(profiles): remove unused imports and redundant cache update
2026-07-01 12:47:03 +00:00
Tunglies 9a2f4ff8fb fix: warm lazy navigation routes after startup 2026-06-30 21:34:32 +08:00
Tunglies fa712b59c9 fix: reuse preloaded verge config 2026-06-29 16:55:25 +08:00
Tunglies 520746428c fix: dedupe initial websocket subscriptions 2026-06-29 11:54:05 +08:00
wonfen 3b52fceca1 fix: DNS overrides could not be edited in advanced mode 2026-06-29 11:31:57 +08:00
Tunglies 3ce228ff7a fix: lazy load i18n sections 2026-06-29 11:11:57 +08:00
Tunglies 2442634b2a fix: lazy load non-home routes 2026-06-29 06:30:54 +08:00
Tunglies 4ec3a9bf4c fix: defer provider queries on startup 2026-06-29 06:03:51 +08:00
Tunglies 3a4cd2c361 Revert "fix: update js-yaml imports for v5"
This reverts commit 250198d547.

Revert "chore(deps): update dependency js-yaml to v5 (#7331)"

This reverts commit b44f671fc2.
2026-06-29 05:17:04 +08:00
Tunglies 250198d547 fix: update js-yaml imports for v5 2026-06-29 03:28:46 +08:00
Tunglies 55060d422a fix: include url-test groups in proxy selectors 2026-06-29 03:14:03 +08:00
Tunglies b9da0875cd refactor: optimize swr data refresh paths 2026-06-28 19:42:21 +08:00
Tunglies e71e701fd0 refactor: migrate query cache to swr 2026-06-28 19:39:15 +08:00
wonfen 294955cb8c feat: add fake-ip-range6 2026-06-28 13:08:55 +08:00
wonfen 5a96fdd9a2 fix: harden home clash-mode card against /configs read failures
Recover from controller read/switch failures on the mode card instead of
showing a bare "communication error":

- fall back to the tolerant get_clash_mode command (then runtime config)
  when the live /configs mode is unavailable,
- optimistically reflect the clicked mode and write it through to the
  getClashConfig cache so a failed refetch can't flash back the old value,
- surface patch failures via showNotice on both the home card and the
  proxies page (patchClashMode can now reject), and
- revalidate getClashMode/getRuntimeConfig on refresh-clash-config so a
  once-empty fallback can recover.
2026-06-27 15:30:20 +08:00
oomeow 1026ba88bb chore: update biome config and ignore zed settings dir (#7364)
* chore: update biome config and ignore zed settings dir

* chore: remove trailing slash from .vfox directory in .gitignore
2026-06-26 12:46:45 +00:00
Bruce Gorman a00df6c93d fix: refresh rules data when clash config is reloaded (#7299) 2026-06-22 11:12:36 +00:00
wonfen a44173e3c7 chore: add Friendly reminder 2026-06-19 00:14:11 +08:00
Tunglies 4ee63b6cf2 perf(proxies): optimize virtual list scrolling 2026-06-18 20:53:22 +08:00
Tunglies fd8c852698 fix: update mihomo plugin log handling 2026-06-18 19:18:10 +08:00
sijie-Z 42c9e19465 fix: crash on malformed ss:// URI with invalid v2ray-plugin data (#7253)
* fix: wrap v2ray-plugin JSON.parse in try-catch to prevent crash on malformed URIs

A malformed ss:// URI with invalid base64-encoded v2ray-plugin query
parameter causes an unhandled JSON.parse exception that crashes the
profile import flow. This matches the error handling pattern already
used in vless.ts and vmess.ts.

* fix: format JSON.parse and sort callback to satisfy biome
2026-06-18 10:33:35 +00:00
StarsSail e5c1c852d7 fix(logs): simplify scroll reference by removing length tracking (#7270) 2026-06-18 10:31:38 +00:00
wonfen 7e233efd10 feat: add reset button to Global script 2026-06-18 15:13:38 +08:00
sijie-Z 4105dc7479 fix: improve type safety and remove redundant type casts (#7252)
* fix: improve type safety and remove redundant type casts

- Fix @@ts-expect-error typo (double @) in traffic-diagnostics.ts
- Replace (e.target as any) with (e.target as HTMLElement) in setting-clash.tsx
- Remove redundant (onFormat as any) cast in guard-state.tsx

* fix: format api.ts sort callback to satisfy biome

* fix: remove as any, let @ts-expect-error suppress the non-standard API error

* fix: remove invalid @@ts-expect-error comment, keep as any for non-standard API
2026-06-17 12:47:31 +00:00
Tunglies 658312fe7b fix: keep home current proxy in sync 2026-06-13 21:20:52 +08:00
Tunglies f763fcb244 fix: fallback clash mode from runtime config 2026-06-13 14:47:29 +08:00
Tunglies 1e57f41190 fix: use mihomo traffic totals 2026-06-13 14:03:44 +08:00
Tunglies e1380b9bab fix: frontend build after bump version for tauri-plugin-mihomo 2026-06-10 20:01:19 +08:00
sijie-ZandTunglies b79e3a0569 fix: replace toSorted with slice().sort() for macOS 12 compatibility (#7247)
* fix: replace toSorted with slice().sort() for macOS 12 compatibility

Array.prototype.toSorted() is ES2023 and not supported in WebKit < 16
(bundled with macOS 12 Monterey). Using slice().sort() is functionally
identical and works on all platforms.

Fixes #7216

* chore: update Changelog

---------

Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
2026-06-09 05:11:58 +00:00
Tunglies 45afb1c15a fix(frontend): reduce long-running memory pressure in connections (#7227)
* fix(connections): stabilize table memory usage

Render the connections table and list from stable row view models, and replace the TanStack row/cell instantiation path with a lightweight virtualized table body.

The leak was isolated to the frontend table render path: websocket data without the table stayed flat, while the normal table path kept producing large per-snapshot object graphs under active/closed churn.

Introduced-by: bf06cbc87d (introduced the TanStack table path)

Related-hot-path: 068678135 (made default ordering/filtering hot enough for long-running /connections sessions to amplify retained heap/RSS)

Related-retention-path: 7fc238c27b (moved Home stats to the full connection websocket subscription, so Home could keep connection snapshots alive for totals/count)

Keep UI behavior intact: column visibility, column order, resizing, sorting, connection details, the closed-connection cap, and the 500ms refresh cadence remain.

* fix(connections): lazily release connection snapshots

Keep the full active/closed connection snapshot scoped to /connections by using a short React Query gcTime for the full subscription.

Home now subscribes to a lightweight connection summary for totals and active count, so leaving /connections no longer keeps the full active/closed arrays and closed history alive for the dashboard.

Only the selected Active or Closed mode feeds filtering, sorting, row-view derivation, and table/list rendering. Switching modes remounts the row subtree and closes detail/column-manager state without changing the capped closed-history behavior.

* fix(connections): decouple collection from rendering

Move the high-frequency connection websocket path out of React Query and into a module-level external store consumed with useSyncExternalStore.

The store keeps one normalized active snapshot plus the capped closed history, continues collecting across route changes, and only notifies mounted subscribers. Home reads the same store through a lightweight summary snapshot, so leaving /connections no longer renders the table/list while connection history is still preserved.

This replaces the short-gc release behavior that made Active/Closed history disappear after navigating away, and bounds retained data to current active connections plus the closed cap instead of React Query cache objects.

* fix(connections): keep collection store authoritative

Remove the temporary per-subscription gcTime override added for /connections. The connection monitor now owns active/closed retention outside React Query, so route changes should stop rendering without clearing collected history.

This leaves the shared Mihomo websocket hook on its original 30s cache behavior for logs, traffic, and memory while /connections uses the external store introduced in the previous commit.

* perf(connections): coalesce snapshots before parsing

Keep only the latest raw websocket message during the 500ms throttle window and parse it when the store flushes. High-churn connection bursts no longer allocate parsed object graphs for snapshots that will be overwritten before React can observe them.

Also compare incoming metadata through the same normalization used for retained records, so optional undefined fields do not prevent metadata reference reuse.

* perf(connections): trim render allocations

Reuse existing row view objects before formatting derived strings when the retained connection object reference is unchanged. Stable closed-history rows no longer allocate throwaway display strings on every snapshot.

Measure the table scroll viewport on mount and resize instead of assuming a 1200px body, so virtual rendering starts from the real visible row count. Keep table state across Active/Closed switches and share the relative-time cell between table and list rows.

* perf(connections): tighten shared time updates

Refresh the shared relative-time clock before the first subscriber render and switch the listener registry back to a Set, avoiding stale labels after returning to /connections and keeping subscriber churn O(1).

Also sort table time rows by the existing numeric startTime field, drop the redundant row-view startTime equality check, and remove one unnecessary table prop guard.

* perf(connections): skip table-wide row projection

Stop materializing ConnectionRowView objects for the whole filtered dataset in table layout. The page now keeps raw connection records for the table path and only formats visible cells inside the virtualized table body, while list layout keeps the cached row-view path.

This removes the steady 500ms allocation pass that was still walking every filtered connection before table rendering. Detail lookup now reads the current filtered raw record directly, and the table clamps scroll state when switching between datasets of different lengths.

* perf(connections): skip unnecessary filter clone when table not searching

In table mode, avoid creating a filtered copy when search is empty: only apply search/sort work for non-empty query while retaining the same default order behavior. Also replace  parsing in order comparators with numeric startTime to avoid per-tick Date object churn and use SearchBox state to detect an empty search.

In table layout without search input, use upstream connection snapshot directly for rendering instead of cloning/sorting every interval tick. This removes a persistent per-update array allocation path while keeping list-mode sort/search behavior unchanged.

* perf(connections): bound closed merge without full transient arrays

Cap closed-history promotion while iterating previous active set without building a temporary large closed array. This preserves the 500-item limit while avoiding 100k-scale transient allocations when many connections close between snapshots.

* fix(changelog): address memory leak caused by frontend

* perf(connections): cache visible table cell snapshots

Add a bounded row snapshot cache for the virtualized table so repeated paints and optional column sorting reuse stable formatted strings instead of rebuilding host/source/rule/chains/traffic text on every refresh. The cache is capped to avoid retaining large active sets.

Also skip full connection-data snapshot merging when only summary listeners are mounted, keeping Home on the summary-only path without changing Connections history while the page is subscribed.

* chore: update Changelog

* chore: update Changelog
2026-06-07 13:08:15 +08:00
Tunglies 66d104593b fix(logs): avoid forced scroll-to-bottom on refresh
Closes #7188
2026-06-04 12:33:27 +08:00
Tunglies bc2149c66d fix(logs): stop always keeping logs route mounted 2026-06-03 21:56:33 +08:00
Tunglies fa27d3eae5 Revert "feat(cvd): add device-bound subscription protocol"
This reverts commit 2cb9c13ab6.
2026-06-02 21:02:19 +08:00
wonfen 2cb9c13ab6 feat(cvd): add device-bound subscription protocol 2026-06-02 13:43:54 +08:00
Tunglies 3444d594ac perf(profile): optimize profile batch update and worker config 2026-05-29 20:18:40 +08:00
wonfen 43843f1eca chore: change texts 2026-05-28 13:04:33 +08:00
Siyuan LiangandTunglies 22c516f550 feat(sysinfo): return structured system info (#7122)
* feat(sysinfo): return structured system info

* refactor: simplify SystemInfo conversion and enhance Platform struct

---------

Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
2026-05-26 08:40:42 +00:00
StarsSail 512efe7d41 fix: node selection for remembered profiles during switch (#6865)
* fix: node selection for remembered profiles during switch

* remove redundant comments
2026-05-26 06:20:02 +00:00
Tunglies ec9ef0f85e fix: report legacy TLS subscription failures 2026-05-25 22:22:24 +08:00
Tunglies 2a397d7ef6 fix(settings): load network interfaces in allow LAN dialog 2026-05-24 15:41:15 +08:00
Tunglies c18c23963d refactor: frontend (#7097)
* refactor: remove unused window show/hide event listeners

* refactor: deduplicate profile-changed event handling

* refactor: remove unused setupCloseListener from use-listen

* refactor: remove unused removeAllListeners from use-listen

* fix(backend): dedupe profile changed notification on import

* fix: avoid duplicate timer update completed event

* refactor(frontend): simplify proxy switch fallback path
2026-05-23 12:52:52 +08:00
Tunglies 21878ea936 Refactor timer management and remove delay_timer dependency (#7075)
* Refactor timer management and remove delay_timer dependency

The delay_timer spawned tokio threads of cores, which not controled by expected.

* refactor: improve logging messages in Timer implementation

* fix(timer): prevent potential panic by using saturating_mul for interval calculations

* refactor timer scheduler

* chore: translate timer logs to english

* fix timer clippy warnings

* fix profile auto update refresh

* fix duplicate profile update notification

* fix: prevent potential panic in lightweight timer setup

* fix profile update listener cleanup

* Revert "fix duplicate profile update notification"

This reverts commit 4aafa94d3e.
2026-05-22 04:30:48 +00:00
Tunglies 54d130a0c4 fix lint violations 2026-05-21 18:49:12 +08:00
wonfen 15de400f2f fix: align backup dialogs with in-app modal behavior 2026-05-20 10:24:11 +08:00
wonfen e11b74206d feat: add warning tooltip for proxy chain 2026-05-18 07:53:29 +08:00
Tunglies fc2ff69bdb fix(proxy): stabilize proxy group sticky scroll #6982
Close #6982
2026-05-16 02:48:51 +08:00
Tunglies 662dd20be1 fix(linux): show window after page load #7002 2026-05-14 21:52:03 +08:00
Tunglies a60ef75061 perf: lazy load monaco editor 2026-05-14 02:31:20 +08:00
mocxda1andmocxda1 d58b054d93 fix(hotkey): parse key 'OS' as 'CMD' instead of keeping 'OS' clash-verge-rev#6899 (#6967)
Co-authored-by: mocxda1 <mocxda1@imashr.com>
2026-05-10 09:07:39 +00:00
Tunglies 243594c5d1 fix: isolate titlebar drag region #6968 2026-05-10 16:16:11 +08:00