ffc2acc010
Closes #37. The Hidden tab was fetch-on-visit (spinner every open); now it paints instantly from the cached_quarantine_mine Room table and SWR-refreshes underneath. Mirrors Flutter's MyQuarantineController (drift watch + transaction full-replace + optimistic flag/unflag). The Room table + DAO already existed (CachedQuarantineEntity / CachedQuarantineDao with observeAll + insert/delete) — they were just never wired up. This commit connects them: * DatabaseModule: provideCachedQuarantineDao (was missing from the graph — same gap as AudioCacheIndexDao). * CachedQuarantineDao: atomic replaceAll(rows) (@Transaction clear+upsertAll, no flicker). * QuarantineRepository: observeMine() Flow + refresh() full-replace; flag(track) / unflag(id) now mutate the cache optimistically (Flow re-emits instantly) then call the server, enqueueing on failure (intent persists, no rollback — matches Flutter). flag() takes a TrackRef to build the optimistic row; TrackActionsViewModel updated. listMine() kept for the TrackActions hidden-check. * HiddenTabViewModel: uiState = combine(observeMine, refreshError), cache-first; SWR on init + on quarantine.* SSE; unflag via repo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>