export interface PresignPutInput { key: string; contentType: string; contentLength?: number; expiresInSec?: number; } export interface PresignPutResult { url: string; method: 'PUT'; headers: Record; } export interface InitMultipartInput { key: string; contentType: string; partCount: number; expiresInSec?: number; } export interface InitMultipartResult { uploadId: string; partSize: number; partUrls: string[]; } export interface CompleteMultipartInput { key: string; uploadId: string; parts: { partNumber: number; etag: string }[]; } export interface ObjectMeta { contentType: string; contentLength: number; etag: string; } export interface StorageProvider { presignPut(input: PresignPutInput): Promise; initMultipart(input: InitMultipartInput): Promise; completeMultipart(input: CompleteMultipartInput): Promise; abortMultipart(input: { key: string; uploadId: string }): Promise; publicUrl(key: string): string; presignGet(key: string, expiresInSec?: number): Promise; exists(key: string): Promise; delete(key: string): Promise; head(key: string): Promise; }