Commit Graph
4387 Commits
Author SHA1 Message Date
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
wonfen 2828782e4c chore: update sysproxy-rs 2026-06-07 23:44:17 +08:00
Tunglies ca325f1cb8 feat: remove global-client-fingerprint
Ref: https://github.com/MetaCubeX/mihomo/commit/bd72c65b5e93c0790abb09b95d519aaf644c4b81
2026-06-07 14:36:18 +08: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
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> ee9d5126d3 chore(deps): update cargo dependencies (#7213)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-05 14:02:27 +00: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
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 462d9f536d chore(deps): update cargo dependencies (#7141)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-02 13:46:05 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> b5b41956e2 chore(deps): update dependency commander to v15 (#7156)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-02 13:22:26 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> f1df8afb76 chore(deps): lock file maintenance (#7170)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-02 13:22:09 +00:00
Tunglies 595f28d428 ci: harden AI slop review heuristics 2026-06-02 21:19:30 +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 9c639bfcc5 fix: run exit cleanup before app shutdown
Close #7158
2026-05-30 16:01:25 +08:00
Tunglies 232be33754 fix(draft): serialize async updates 2026-05-30 13:31:10 +08:00
Tunglies 3444d594ac perf(profile): optimize profile batch update and worker config 2026-05-29 20:18:40 +08:00
Tunglies 6e6c537e6b refactor service manager locking 2026-05-28 23:22:56 +08:00
Tunglies 08fd2ce68b fix(core): serialize runtime config updates 2026-05-28 17:41:39 +08:00
wonfen 43843f1eca chore: change texts 2026-05-28 13:04:33 +08:00
Tunglies dc094033b8 Revert "refactor: remove subscription TLS roots fallback"
This reverts commit 746279fa03.
2026-05-28 02:42:13 +08:00
Li Yangandliyang f916711717 fix(tray): use an app-specific tray id (#6772)
Co-authored-by: liyang <liyang25@pku.edu.cn>
2026-05-26 13:34:39 +00:00
Tunglies 761209bbbc refactor: backend (#7102)
* refactor(tray): move tray log opening to utils helper

* refactor(enhance): move owned config through pipeline

* refactor(enhance): move sequence values in use_seq

* refactor(enhance): move values while sorting fields

* refactor(enhance): move values when lowercasing owned config

* refactor(backend): move owned config values in utilities

* refactor(tray): borrow hotkey accelerators

* refactor(core): borrow proxy config strings

* fix(backend): preserve config patch semantics

* refactor(enhance): clarify config transform names
2026-05-26 10:47:03 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> a287d13b4d chore(deps): update github/gh-aw-actions action to v0.76.1 (#7098)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-26 08:47:35 +00: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
Tunglies f9ffe0af8e chore: update pr-ai-slop-review 2026-05-26 16:46:44 +08:00
Tunglies c371f95815 chore: fix minumReleaaseAgeExclude 2026-05-26 16:34:11 +08:00
Tunglies 2e0c783e66 chore: update Makefile 2026-05-26 14:34:40 +08: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
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 28139706d2 chore(deps): update npm dependencies (#7121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-26 06:14:49 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 8752130f75 chore(deps): update cargo dependencies (#7109)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-26 06:14:38 +00:00
Tunglies 32ed10c25d chore: remove node-fetch dependency from package.json and related scripts 2026-05-26 14:03:59 +08:00
Tunglies c7cdc62512 chore: bump dependencies
Bump tauri-plugin-mihomo to 0.5.0 and update frontend dependency locks.

Adapt the traffic websocket stream parser to the new raw text byte callback API.
2026-05-26 13:30:37 +08:00
Tunglies 435d611114 chore: update pnpm peers 2026-05-26 12:47:59 +08:00
Tunglies 29fc8c9f4c chore: bump pnpm to 11 (#7125) 2026-05-26 12:24:47 +08:00
Tunglies 746279fa03 refactor: remove subscription TLS roots fallback 2026-05-26 00:23:55 +08:00
Tunglies e2d14a5ea7 fix: support empty basic auth passwords 2026-05-25 23:12:44 +08:00
Tunglies d75c4cf59e fix: enable gzip subscription responses
docs: update changelog for gzip subscriptions
2026-05-25 22:59:11 +08:00
Tunglies ec9ef0f85e fix: report legacy TLS subscription failures 2026-05-25 22:22:24 +08:00
Tunglies 8ccb0b9abd perf: reduce tokio runtime thread limits
The Tauri backend is primarily the control plane for IPC, config generation, tray/window events, and mihomo API calls. The proxy data plane runs in the mihomo sidecar/service process, so allowing up to 16 runtime workers adds scheduling headroom without clear startup benefit.

Setup benchmark used isolated HOME/XDG dirs, isolated mihomo IPC sockets, sidecar mode, disabled TUN/system proxy defaults, and graceful shutdown after setup on an 18-thread host.

| limit | workers | blocking | setup async avg/max | avg threads |
| --- | ---: | ---: | ---: | ---: |
| old | 16 | 64 | 742.2ms / 1163.4ms | 34.5 |
| old | 8 | 32 | 650.8ms / 680.9ms | 27.0 |
| old | 4 | 16 | 681.5ms / 708.1ms | 23.8 |
| new | 16 | 32 | 682.8ms / 747.0ms | 35.3 |
| new | 8 | 16 | 650.1ms / 662.4ms | 26.0 |
| new | 4 | 8 | 639.3ms / 645.5ms | 22.1 |

The 2x blocking pool reduced tail latency across the tested limits. Capping workers at 8 keeps enough concurrency for normal control-plane work while avoiding the 16-worker tail-latency outlier and reducing blocking-pool headroom from 64 to 16 on this host.
2026-05-25 17:24:06 +08:00
Tunglies 2a397d7ef6 fix(settings): load network interfaces in allow LAN dialog 2026-05-24 15:41:15 +08:00
wonfen aa478bfe1a docs: remove Promotion 2026-05-24 13:14:59 +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 d3bb018ab7 fix: ai-slop setup 2026-05-23 12:50:15 +08:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> 95be5aa816 chore(deps): update github/gh-aw-actions action to v0.75.1 (#7096)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-23 12:46:25 +08:00
Tunglies 32029af0f9 refactor: improve tray speed rendering logic and attributes handling 2026-05-22 21:47:59 +08:00
Tunglies d2f09211dd chore: reoder clippy rules 2026-05-22 21:32:44 +08:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> bdb5807d17 chore(deps): update github actions (#7064)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-22 11:17:51 +00:00
renovate[bot]andrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com> e25732eb9d chore(deps): update rust crate serde_json to 1.0.150 (#7084)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-22 11:04:24 +00:00
Tunglies 2c7877a574 fix: add condition to prevent bot-triggered PR AI slop review 2026-05-22 19:08:40 +08:00
Tunglies e48e24bb7e fix: enhance PR AI slop review criteria for clearer evaluation 2026-05-22 19:00:42 +08:00