e16ade4725
The periodic sync walked the vault, read files and ran synchronous database deletes on the event loop, freezing active chat streams while it ran. Those blocking steps now run in threads. Deletes use JSONB containment, which the cmetadata GIN index (jsonb_path_ops) supports, and are batched into one transaction per pass. Deleted files leave the index cache only after their chunks are deleted, so a failed delete is retried on the next sync. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>