import { CandidateUploader, type CandidateFetch, type CandidateTransportAuthorization } from "./candidate-uploader.js"; import { DurableAttemptSpool, MultipartUploader } from "./multipart-uploader.js"; export type MutationOperation = "upsert" | "delete"; export type MutationStatusName = "prepared" | "uploading" | "candidate-ready" | "ready" | "applying" | "committed" | "conflict" | "rejected" | "blocked"; export interface MutationSource { kind: "regular" | "symlink"; mode: number; sha256: `sha256:${string}`; size: number; } /** Exact V2 prepare body; unknown fields are rejected by both client and API. */ export interface MutationRequest { contractVersion: 2; deviceId: string; clientMutationId: string; canonicalPath: string; operation: MutationOperation; baseVersionId: string | null; generation: number; membershipRevision: string; scopeRevision: string; source?: MutationSource; } export type MutationStatus = { status: "prepared" | "uploading" | "candidate-ready" | "ready" | "applying"; attemptId: string; } | { status: "committed"; attemptId: string; versionId: string | null; deltaId: string; } | { status: "conflict"; attemptId: string; code: "MUTATION_CONFLICT" | "CASE_COLLISION"; } | { status: "rejected" | "blocked"; attemptId: string; code: string; }; export type MutationAuthorization = CandidateTransportAuthorization; export interface MutationClientOptions { apiUrl: string; fetchImpl?: CandidateFetch; now?: () => number; authorizationTimeoutMs?: number; candidateUploader?: Pick; multipartUploader?: Pick; } export interface SubmitMutationInput { authorization: MutationAuthorization; request: MutationRequest; /** Required for upserts and is the immutable bytes referenced by `source`. */ bytes?: Uint8Array; /** Required only when an upsert is larger than the single-candidate limit. */ spool?: DurableAttemptSpool; /** Private local directory for an attempt-ID-named spool created after prepare. */ spoolDirectory?: string; /** Lets a caller detect source edits before multipart transfer. */ sourceChecksum?: () => Promise<`sha256:${string}`>; /** Persist the server-assigned attempt before bytes or a delete commit run. */ onPrepared?: (attemptId: string) => void | Promise; } export interface MutationSubmission { requestDigest: string; status: MutationStatus; } /** Shared digest algorithm with protocol-v2: RFC8785 key ordering + SHA-256. */ export declare function mutationRequestDigest(request: MutationRequest): string; export declare class MutationClient { private readonly apiUrl; private readonly fetchImpl; private readonly now; private readonly timeoutMs; private readonly candidate; private readonly multipart; constructor(options: MutationClientOptions); submit(input: SubmitMutationInput): Promise; /** The sole recovery action after timeout/5xx/lost commit response. */ recover(authorization: MutationAuthorization, attemptId: string): Promise; private prepare; private createAttemptSpool; private commit; private control; private assertAuthorization; } //# sourceMappingURL=mutation-client.d.ts.map