mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-08 23:54:39 +00:00
The File Sync / Import flow (and the mirror-on-upload fan-out) copy blobs across the user's Blossom servers with BUD-04 `PUT /mirror`, but not every server implements that endpoint. Blossom has no capability-discovery mechanism, so a target without /mirror just answered 404/405/501 and the whole copy was silently counted as failed. Detect the "endpoint absent" statuses (404/405/501) as a typed BlossomMirrorUnsupportedException — distinct from a mirror the server understood but rejected (400/403/413/…) — and add BlossomClient.mirrorOrUpload, which falls back to downloading the blob and re-uploading it (PUT /upload) when mirror is unsupported. The downloaded bytes are verified against the expected sha256 before re-upload, since a Blossom server is untrusted and could substitute content, and the same t=upload auth is reused. Wire every mirror path through mirrorOrUpload: the app-level BlossomMirrorQueue (sync-all + import sweep), the blob manager's per-blob mirror (including the paid-mirror retry), and UploadOrchestrator's mirror-on-upload. Task now carries the descriptor content-type so the fallback upload preserves the MIME. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0168TWLTgrMxUR6yjjCCiBLS