export type WorkKind = 'memory.explicit_commit' | 'memory.explicit_enrichment' | 'memory.turn_capture' | 'memory.turn_distill' | 'memory.vector_backfill' | 'knowledge.ingest' | 'knowledge.index_refresh' | 'context.prefetch' | 'verification.policy' | 'learning.analyze_session' | 'workflow.worker_start' | 'workflow.worker_monitor' | 'workflow.worker_verify' | 'workflow.worker_merge' | 'workflow.worker_cleanup' | 'session.bootstrap' | 'session.finalize' | 'telemetry.reconcile'; export type WorkState = 'pending' | 'leased' | 'completed' | 'failed' | 'dead_letter' | 'cancelled'; export interface WorkError { category: string; message: string; } export interface WorkItemRecord { id: string; idempotencyKey: string; kind: WorkKind; projectRoot: string; sessionId?: string; turnId?: string; sourceHash?: string; taskSpecHash?: string; payload: unknown; state: WorkState; attempts: number; maxAttempts: number; leaseOwner?: string; leaseExpiresAt?: number; nextAttemptAt: number; errorCategory?: string; errorMessage?: string; createdAt: number; updatedAt: number; completedAt?: number; cancelledAt?: number; cancellationReason?: string; replayOfId?: string; replayCount: number; } export interface EnqueueWorkInput { idempotencyKey: string; kind: WorkKind; projectRoot: string; sessionId?: string; turnId?: string; sourceHash?: string; taskSpecHash?: string; payload: unknown; maxAttempts?: number; nextAttemptAt?: number; } export interface ProjectMutationLeaseRecord { projectRoot: string; mutationKind: string; owner: string; leaseExpiresAt: number; sourceHash?: string; updatedAt: number; } export interface LeaseWorkInput { projectRoot: string; owner: string; kinds?: WorkKind[]; workItemIds?: string[]; limit: number; leaseMs: number; now?: number; } export interface WorkQueueHealth { projectRoot: string; queueDepth: number; pending: number; leased: number; failed: number; expiredLeases: number; deadLetters: number; oldestPendingAgeMs: number; lastSuccessfulDrainAt?: number; } export type SessionClosureState = 'active' | 'closing' | 'closed' | 'closed_with_pending_work'; export interface SessionClosureRecord { sessionId: string; projectRoot: string; state: SessionClosureState; receiptId: string; workItemId?: string; pendingWorkCount: number; requestedAt: number; updatedAt: number; closedAt?: number; } export interface RequestSessionClosureInput { sessionId: string; projectRoot: string; receiptId: string; payload: unknown; maxAttempts?: number; }