/** * Server-only account-data lifecycle contract. * * `actorUserId` is deliberately both the actor and the subject in 0.3.2. A * trusted actor deleting another account requires a future, explicit * `subjectUserId` contract; callers must not silently overload this field. */ export type LifecycleOperationKind = "export" | "purge"; export type LifecycleOperationStatus = "pending" | "running" | "retryable" | "completed" | "rejected"; export type LifecycleReason = "account_deletion" | "privacy_request"; export type ExportUserDataContext = Readonly<{ actorUserId: string; requestId: string; idempotencyKey: string; reason: LifecycleReason; signal?: AbortSignal; }>; export type PurgeUserDataContext = Readonly<{ actorUserId: string; requestId: string; idempotencyKey: string; reason: LifecycleReason; signal?: AbortSignal; }>; export type UserDataExportRecord = Readonly<{ type: "manifest"; schemaVersion: 1; exportId: string; actorUserId: string; generatedAt: string; }> | Readonly<{ type: "data"; domain: string; resourceType: string; resourceId: string | null; workspaceId: string | null; payload: unknown; }> | Readonly<{ type: "attachment"; attachmentId: string; workspaceId: string | null; filename: string; contentType: string; size: number; sha256: string | null; }> | Readonly<{ type: "complete"; recordCount: number; checksum: string; }>; export type PurgeUserDataResult = Readonly<{ status: "completed" | "already_completed"; operationId: string; deletedByDomain: Readonly>; }>; export type AssertPurgeAllowed = (ctx: PurgeUserDataContext) => Promise>; export type LifecycleHostStep = Readonly<{ id: string; order: number; export?: (ctx: ExportUserDataContext) => AsyncIterable; purge?: (ctx: PurgeUserDataContext) => Promise>; }>; export interface UserDataLifecycleAdapter { exportUserData(ctx: ExportUserDataContext): AsyncIterable; purgeUserData(ctx: PurgeUserDataContext, gate: Readonly<{ fenceToken: string; }>): Promise; } export interface UserDataLifecycle { exportUserData(ctx: ExportUserDataContext): AsyncIterable; purgeUserData(ctx: PurgeUserDataContext): Promise; } /** Install a server-only implementation during the host application's bootstrap. */ export declare function configureUserDataLifecycle(lifecycle: UserDataLifecycle): void; export declare function exportUserData(ctx: ExportUserDataContext): AsyncIterable; export declare function purgeUserData(ctx: PurgeUserDataContext): Promise; /** Construct a lifecycle facade around a durable host-owned implementation. */ export declare function createUserDataLifecycle(adapter: UserDataLifecycleAdapter, assertPurgeAllowed: AssertPurgeAllowed): UserDataLifecycle; /** Validate and deterministically order registered host steps. */ export declare function orderLifecycleHostSteps(steps: readonly LifecycleHostStep[]): readonly LifecycleHostStep[]; /** * Encode the typed stream as canonical NDJSON. The producer is authoritative * for the terminal checksum, while the encoder verifies record sequencing so * a partial or malformed stream is never presented as a valid export. */ export declare function encodeUserDataExportNdjson(records: AsyncIterable): ReadableStream;