export type MemberRoleGrantDeliveryState = "delivered" | "retry_pending" | "review_required"; export interface MemberRoleGrantSourceIdentity { guildId: string; memberUserId: string; roleId: string; sourceModuleId: string; sourceId: string; } export interface MemberRoleGrantMutationInput extends MemberRoleGrantSourceIdentity { operationKey: string; sourceScopeId?: string; occurredAt: Date; reason: string; } export type MemberRoleGrantMutationResult = { outcome: "committed"; replayed: boolean; sourceState: "active" | "released"; activeOwnerCount: number; desiredRolePresent: boolean; deliveryState: MemberRoleGrantDeliveryState; deliveryAttemptCount: number; /** The exact Discord role mutation performed by this delivery attempt. */ roleChange?: "added" | "removed"; safeCode?: string; } | { outcome: "rejected"; code: "operation_key_conflict" | "invalid_input"; }; export type MemberRoleGrantOwnedSelector = { kind: "guild"; guildId: string; } | { kind: "subject"; memberUserId: string; } | { kind: "scope"; guildId: string; sourceScopeId: string; }; export interface MemberRoleGrantOwnershipService { claim(input: MemberRoleGrantMutationInput): Promise; release(input: MemberRoleGrantMutationInput): Promise; releaseOwned(input: { sourceModuleId: string; selector: MemberRoleGrantOwnedSelector; batchKey: string; occurredAt: Date; reason: string; limit: number; cursor?: string; }): Promise<{ processed: number; retryPending: number; reviewRequired: number; nextCursor?: string; }>; reconcile(input: { maximum: number; now: Date; }): Promise<{ processed: number; retryPending: number; reviewRequired: number; }>; captureOwned(input: { sourceModuleId: string; memberUserId: string; cutoff: Date; limit: number; cursor?: string; }): Promise<{ items: readonly { guildId: string; memberUserId: string; roleId: string; sourceId: string; sourceScopeId: string | null; sourceState: "active" | "released"; deliveryState: "pending" | "processing" | "delivered" | "failed" | "review"; desiredRolePresent: boolean; safeCode: string | null; updatedAt: string; }[]; nextCursor?: string; }>; eraseReleasedOwned(input: { sourceModuleId: string; memberUserId: string; cutoff: Date; limit: number; }): Promise<{ deletedSources: number; deletedDeliveries: number; residualSources: number; reviewRequired: boolean; }>; }