What's Changed
This release hardens the engine recovery pipeline, resolves critical data-loss race conditions in the updater, and delivers a comprehensive overhaul of the download history model to fully support multi-file and multi-mirror tasks.
✨ New Features
- Task lifecycle service — New composable for monitoring task completion, errors, and BT seeding state
- Engine recovery during updates — Rust emits engine lifecycle events; frontend reconnects Aria2 client with exponential backoff
- Copy buttons in Advanced Preferences — One-click copy for RPC Secret, RPC Listen Port, and all readonly file paths (engine config, session, log)
🛠 Improvements
- Complete history snapshots —
metaJSON now stores full per-file snapshots including all mirror URIs, enabling correct restart, delete, and stale cleanup for multi-file and multi-mirror tasks - Restart mirror semantics — Restart now submits grouped mirror URIs per file via
addUriAtomic, preserving multi-source download capabilities - Version-pinned update caching — Downloaded update packages are cached with their version, preventing channel drift between download and install
- Updater sequence hardened — Reordered check() →
take()to prevent data loss on retry; cross-platform path parsing now handles mixed separators
🐛 Bug Fixes
- Fixed updater race condition where a stale download could be paired with a newer update manifest
- Fixed single-file multi-mirror tasks losing mirror URIs in history persistence
- Fixed purge path using lossy
files[0]extraction instead of unifieddeleteTaskFiles() - Fixed stale cleanup marking multi-file records as stale when only some files were missing
- Fixed
cargo fmtviolations in config.rs and updater.rs
📦 Downloads
| Platform | Architecture | File |
|---|---|---|
| macOS | Apple Silicon · Intel | .dmg
|
| Windows | x64 · ARM64 | -setup.exe
|
| Linux | x64 · ARM64 | .AppImage .deb
|