import type { WorkerRecord, WorkerStatus } from '../domain/worker'; export const MAX_AVAILABLE_WORKER_PAGE_SIZE = 64; export interface RegisterWorkerSessionCommand { workerId: string; sessionId: string; capabilitiesJson: string; capabilitiesHash: string; maxConcurrentRuns: number; availableSlots: number; registeredAtMs: number; leaseExpiresAtMs: number; } export interface RegisterWorkerSessionResult { worker: WorkerRecord; replacedSession: boolean; } export interface HeartbeatWorkerSessionCommand { workerId: string; sessionId: string; generation: number; expectedVersion: number; availableSlots: number; heartbeatAtMs: number; leaseExpiresAtMs: number; } export interface TransitionWorkerSessionCommand { workerId: string; sessionId: string; generation: number; expectedVersion: number; status: Extract; transitionedAtMs: number; } export interface AvailableWorkerPage { workers: readonly WorkerRecord[]; truncated: boolean; nextCursor?: string; } export interface WorkerRegistryRepository { findById(workerId: string): Promise; register( command: RegisterWorkerSessionCommand, ): Promise; heartbeat(command: HeartbeatWorkerSessionCommand): Promise; transition(command: TransitionWorkerSessionCommand): Promise; listAvailable(options: { observedAtMs: number; afterWorkerId?: string; limit?: number; }): Promise; }