ab58f3ffcb
Drives /api/library/sync against drift: - reads cursor from SyncMetadata (default 0 = full snapshot) - 204 → just bump lastSyncAt, return zeroes - 410 → wipe all cached entities + retry from cursor=0 - 200 → apply upserts + deletes per entity type, advance cursor Handles all 8 entity types (artist/album/track + like_track/like_album/ like_artist + playlist/playlist_track) for both upsert and delete paths. Composite-key entities use the "<a>:<b>" string format the server emits. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>