- Replace boolean/string validation results with structured ValidationOutcome values across config validation, profile switching, DNS validation, and script validation. Callers can now distinguish valid, invalid, skipped, and busy states, with invalid results carrying an error kind and message.
- Route core config updates through structured outcomes and checked forced updates. Generation and validation failures now discard runtime drafts and surface validation failures instead of relying on empty success messages.
- Preserve existing frontend ergonomics by keeping boolean service wrappers where callers only need success, while direct DNS and script validation consumers receive ValidationOutcome. Failed profile editor saves reload the backend-restored file content and synchronize Monaco models so reopened editors show the restored state.
- Extract shared delay state logic from ProxyItem and ProxyItemMini
into `useProxyDelayState` hook (src/hooks/use-proxy-delay-state.ts);
JSX display thresholds preserved per-component.
- Deduplicate rAF/setTimeout/Promise scheduling in DelayManager via
a private `scheduleOnNextFrame` helper.
- Drop no-op `useMemo(() => MODES, [])` in proxies page.
- Replace `any` on `setClashLog` prev params and layout-traffic sx
objects with proper types (`pre!`, `Pick<BoxProps|...>`).
- Remove Rust-side `eval(INITIAL_LOADING_OVERLAY)` that prematurely
dismissed the overlay before React/MUI theme was ready
- Defer `window.show()` from Rust `activate_window` to an inline
`<script>` in index.html, executed after the themed overlay is in DOM
- Remove `useAppInitialization` hook (duplicate of `useLoadingOverlay`
with no themeReady gate)
- Simplify overlay to pure theme-colored background — no spinner or
loading text — so fast startup feels instant
- Simplify `hideInitialOverlay` API and reduce overlay fade to 0.2s
- Clean up unused CSS variables (spinner-track, spinner-top, etc.)
- Dispose Monaco editor instances on dialog close to prevent cycle leak
- Replace gcTime: Infinity with finite TTLs and evict orphaned subscription queryKeys
- Add missing useEffect cleanup for timers, move setTimeout out of useMemo
- Add 10s startup grace period before TUN auto-disable logic activates;
service IPC may not be ready when the frontend first queries, causing
a transient isServiceOk=false that incorrectly persists
- Replace placeholderData (which set isLoading=false with stale data)
with a proper isStartingUp guard; query now polls every 2s during
startup to catch service readiness quickly
- Add 'getSystemState' to refresh-verge-config invalidation keys to
fix key mismatch that prevented event-driven refetches from working
Replace swr with @tanstack/react-query v5 across all hooks, providers,
and components. Introduce singleton QueryClient, WS subscription pattern
via useQuery+useEffect, and enforce component-layer cache access contract.
Preserve SWR cache in onConnected to avoid replacing accumulated logs
with kernel buffer on reconnect. Add KeepAlive for the logs page so
its DOM stays mounted across route changes, removing the visible blank
window when navigating back.
* fix: displays rule lineNo instead of index in rule page (#6230)
* fix(rules): derive line numbers in view model without mutating shared rules
* doc: update changelog
---------
Co-authored-by: Slinetrac <realakayuki@gmail.com>
* refactor: replace handle::Handle::get_window() with WindowManager::get_main_window() in multiple files
* refactor: enhance WindowManager to return window state alongside the main window instance
* refactor: update useProfiles and ProfilePage to support profile overrides and improve patchProfilesConfig return type
* refactor: enhance handle_success to check main window existence before notifying profile changes
* refactor: simplify get_main_window_with_state by using pattern matching and improve window state handling
* refactor: fix window activation by removing unnecessary reference in activate_existing_main_window
* refactor: remove redundant macOS conditional for window_manager import
* feat(connections): enable persistent column visibility and ordering
fix(connections): smooth column manager access in table view
fix(connections): integrate column manager into column menu
- Move the Connections column manager trigger into the DataGrid column menu, reusing existing i18n strings
- Clean up the page toolbar by removing the standalone button and lifting dialog state to the parent page
fix(connections): unify column order handling and resolve lint warnings
fix(connections): unify column order handling and enforce 0 ESLint warnings
- extract reconcileColumnOrder helper and reuse it across:
- initial normalization (useEffect)
- manager drag order handler (handleManagerOrderChange)
- derive columnOptions directly from the computed, sorted columns to keep a single source of truth and prevent dialog/grid drift
- connections.tsx: remove direct setState in useEffect; gate dialog open with `isTableLayout && isColumnManagerOpen`; clean up unused imports
- connection-column-manager.tsx: replace deprecated `primaryTypographyProps` with `slotProps`
- run full lint; project now has 0 warnings on main configuration
* feat(connection-table): safeguard column visibility
---------
Co-authored-by: Slinetrac <realakayuki@gmail.com>