Multipart is now the only upload transport, so drop the legacy
`app.bsky.video.uploadVideo` request and everything that existed to
choose between the two:
- `MultipartFallbackError` is gone. A `startUpload` failure (a service
without multipart support, or with the kill switch active) now
propagates as the `MultipartUploadError` the API layer already built,
and `abortThenRethrowOrResolve` rethrows the failure that forced the
abort instead of a fallback signal - which keeps the real error class
for retry classification and telemetry.
- `getUploadErrorMessage` matches on `MultipartUploadError` where it
matched on `ServerError`, so video-service messages (upload disabled,
daily limits, oversized file) still map to their user-facing copy.
`ServerError` had no other thrower and is removed.
- With the legacy branch gone, `upload.ts` and `upload.web.ts` were
identical, so the platform split collapses into one `upload.ts`. The
web chunk reader already fetches the uri when `bytes` is missing, so
nothing depended on the legacy path's buffer fetch.
- The `did` parameter only seeded the legacy endpoint URL; it is dropped
from `uploadVideo` and `processVideo`.
- Transport reporting only existed to distinguish multipart from legacy,
so `VideoUploadTransport`, `telemetry.uploadTransport`, the
`video.upload.transport` span attribute, and the `transport` field on
the uploadCompleted/uploadFailed events are removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mn8DoxP5wQk6NbPmapWs9A
Ship both video upload features unconditionally:
- Multipart upload is now always attempted. The MultipartFallbackError
path to the legacy single-request upload is unchanged, so a video
service without multipart support still works. This makes the plain
'legacy' upload transport unreachable, so drop it from
VideoUploadTransport and default the telemetry value to 'multipart'.
- The 10-minute duration cap now applies to everyone.
VIDEO_10_MINUTE_MAX_DURATION_MS is folded into VIDEO_MAX_DURATION_MS,
and the composer's duration error message no longer branches on the
gate.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mn8DoxP5wQk6NbPmapWs9A