/** * Live ComfyUI job telemetry: a per-job WebSocket subscription to ComfyUI's * /ws endpoint, reduced to a small snapshot the workbench can poll, plus the * latest latent preview frame and cancellation. * * Progress is strictly best-effort: an unreachable socket, an old server, or a * proxy that rejects the upgrade must never fail the generation itself. */ export type ComfyUIJobPhase = 'queued' | 'running' | 'done' | 'error' | 'cancelled'; export interface ComfyUIJobSnapshot { jobId: string; promptId?: string | undefined; phase: ComfyUIJobPhase; queueRemaining?: number | undefined; nodeId?: string | undefined; nodeLabel?: string | undefined; /** Step progress of the executing node (0 when unknown). */ value: number; max: number; elapsedMs: number; queueAhead?: number; startedAt: number; finishedAt?: number | undefined; error?: string | undefined; previewVersion: number; /** Whether the live WebSocket is connected; false means timing-only. */ live: boolean; } export interface ComfyUIPreview { data: Uint8Array; version: number; } /** Structural WebSocket face; Node's global WebSocket satisfies it. */ interface SocketLike { readyState: number; onopen: (() => void) | null; onmessage: ((event: { data: unknown; }) => void) | null; onerror: ((event: unknown) => void) | null; onclose: (() => void) | null; close(): void; } type SocketFactory = (url: string) => SocketLike; export declare class ComfyUIProgressRegistry { private readonly jobs; private readonly now; private readonly socketFactory; constructor(options?: { now?: () => number; socketFactory?: SocketFactory; }); /** Start or refresh one job. Returns undefined for an unusable job id. */ ensure(jobId: string, options: { baseURL: string; headers?: Record; workflowJson?: string; queueAhead?: number; }): ComfyUIJobSnapshot | undefined; /** Mark the job terminal; the snapshot stays readable briefly for late polls. */ finish(jobId: string, phase?: 'done' | 'error' | 'cancelled', error?: string): void; setQueueAhead(jobId: string, queueAhead: number): void; snapshot(jobId: string): ComfyUIJobSnapshot | undefined; subscribe(jobId: string, listener: () => void): () => void; preview(jobId: string): ComfyUIPreview | undefined; /** Remove a queued/running prompt, then mark the job cancelled. */ cancel(jobId: string): Promise; private connect; private onMessage; private onEvent; private notify; private closeSocket; private webSocketURL; private post; } /** Process-wide registry shared by the Studio route and the progress route. */ export declare const comfyProgress: ComfyUIProgressRegistry; export {};