Import flow (6 fixes):
- Use LinkParser.parse() instead of inline regex (was creating empty outbound)
- Show errors in ImportSheet (were swallowed silently)
- Add "No URIs detected" feedback
- Auto-select imported node group
- Add hysteria2/hy2/tuic to KNOWN_SCHEMES
- Clear error on sheet open/close
Update system (4 fixes):
- Add update commands to privctl CLI (were missing from commands map)
- Fix version response key mismatch (daemon vs APK)
- Fix boolean parsing: use .booleanOrNull not .content.toBoolean
- Fix logs response unwrapping (object with "lines" key, not bare array)
Self-update resilience (7 fixes):
- Atomic binary copy (write temp + rename, not truncate in-place)
- Rollback on failure (backup binaries before update)
- Verify new binary before switching (run --version, check signals)
- Schedule old daemon self-exit after IPC response
- Wait for new daemon to start (10s socket check)
- Handle old privctl "unknown command" gracefully → MODULE_TOO_OLD
- Fallback "Open GitHub Releases" button when module too old
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>