- 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.
Backend:
- Move resolve_done() from sync setup() to async task after futures::join!
so Timer waits for actual init completion instead of firing immediately
- Replace std::thread::sleep(50ms) with tokio::time::sleep in async context
- Remove duplicate refresh_tray_menu in tray_init (keep post-join call only)
- Delete dead code reset_resolve_done (process restarts, static is destroyed)
- Rename create_window(is_show) → create_window(should_create) for clarity
Frontend:
- Remove duplicate verge://refresh-clash-config listener from AppDataProvider
(useLayoutEvents handles it via invalidateQueries — single consumer path)
- Stabilize useEffect deps with useRef for TQ refetch references
- Simplify AppDataProvider event listener setup (profile-changed + proxy only)
- 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.)
* refactor(signal): migrate signal to handling async in windows and remove signal-hook dependency
* refactor(signal): enhance Windows signal handling with improved cleanup logic
* refactor(signal): improve exit handling in run function for async compatibility
* fix(ui): prevent light flash on dark startup
* fix(window): apply initial dark/light theme to prevent white flash
* refactor(boot): optimize config fetch and theme fallback
* fix: system theme detection
* fix(window): remove black flash before loader by aligning initial paint with theme
* fix: receive shutdown signal failed on windows
* docs: update Changelog.md
* chore: update
* fix: use tokio runtime to handle shutdown signal
* docs: update Changelog.md
* fix: move tauri dependency to the correct section in Cargo.toml
* fix: remove unused exit handling code in run function
* fix(clash-verge-signal): use global runtime to avoid tokio runtime panic on unix
* chore: update tauri-plugin-mihomo deps
* fix: handle macOS exit event to ensure proper application termination
---------
Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
* feat(logging): introduce clash-verge-logging crate for management
- Added a new crate `clash-verge-logging` with dependencies on `log`, `tokio`, `compact_str`, and `flexi_logger`.
- Implemented logging types and macros for structured logging across the application.
- Replaced existing logging imports with the new `clash_verge_logging` crate in various modules.
- Updated logging functionality to support different logging types and error handling.
- Refactored code to improve logging consistency and maintainability.
* fix(logging): update import paths for clash_verge_logging in linux.rs and dns.rs
* fix(logging): update import statement for clash_verge_logging in windows.rs
* Refactor proxy management: Remove EventDrivenProxyManager and async_proxy_query
- Removed the EventDrivenProxyManager and its related event-driven proxy management logic.
- Replaced usages of AsyncProxyQuery with direct calls to sysproxy for fetching system and auto proxy configurations.
- Cleaned up constants by removing unused default proxy host.
- Updated sysopt to eliminate calls to the removed EventDrivenProxyManager.
- Adjusted logging and proxy state management to reflect the removal of event-driven architecture.
- Simplified the core module structure by removing unnecessary module imports.
* refactor: remove bypass module for cleaner network configuration
* feat: update sysproxy to version 0.4.0 and add guard feature; refactor sysopt for improved proxy management
* feat(windows/sysproxy): unify guard-type handling and auto-restore drift
* refactor(config): remove commented-out code for SysProxy update flag
---------
Co-authored-by: Slinetrac <realakayuki@gmail.com>