@ewhauser/world-celld 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["RETRYABLE_STATUSES","delayMs"],"sources":["../src/config.ts","../src/remote/errors.ts","../src/remote/rpc-client.ts","../src/remote/stream-client.ts","../src/remote/namespaces.ts","../src/vendor/shared/debug.ts","../src/util.ts","../src/queue.ts","../src/storage.ts","../src/streamer.ts","../src/index.ts"],"sourcesContent":["import type { WorkflowRunDONamespace } from './storage.js';\nimport type { StreamDONamespace } from './streamer.js';\nimport type { CelldQueueProducer } from './queue.js';\nimport { MAX_STREAM_LONG_POLL_MS } from './stream-protocol.js';\nimport type { WorkflowIndex } from './indexes.js';\nimport { MAX_FLEET_RPC_TIMEOUT_MS } from './lifecycle.js';\nimport { boundedIntegerOption, strictIntegerSetting } from './validation.js';\n\n/** Public alias retained for custom in-process environments. */\nexport type IndexNamespace = WorkflowIndex;\n\nexport interface HookTokenOwner {\n runId: string;\n hookId: string;\n}\n\nexport interface CelldWorldEnv {\n WORKFLOW_DB: WorkflowRunDONamespace;\n WORKFLOW_INDEX: IndexNamespace;\n WORKFLOW_QUEUE: CelldQueueProducer;\n WORKFLOW_STREAMS: StreamDONamespace;\n}\n\nexport interface CelldWorldConfig {\n /**\n * Base URL of any celld fleet node's public listener (e.g.\n * `http://fleet.internal:8080`). Requests are routed to the deployed\n * world-celld worker, which forwards them to the owning cells.\n * Default: process.env.CELLD_FLEET_URL\n */\n fleetUrl?: string;\n /**\n * Bearer secret shared with the worker (its WORLD_SECRET var).\n * Default: process.env.CELLD_WORLD_SECRET\n */\n secret?: string;\n /**\n * Pre-built namespaces (used by tests and the in-process harness). When\n * provided, fleetUrl/secret are not used.\n */\n env?: CelldWorldEnv;\n /** Default: process.env.CELLD_DEPLOYMENT_ID || 'celld-default' */\n deploymentId?: string;\n /**\n * Base URL the app's workflow endpoints are mounted on; the native Queue\n * consumer delivers to `${baseUrl}/.well-known/workflow/v1/flow`.\n * Default: process.env.WORKFLOW_BASE_URL || `http://localhost:${PORT ?? 3000}`\n */\n baseUrl?: string;\n /**\n * Keep terminal run payloads for this many milliseconds before replacing\n * them with metadata-only tombstones. Zero disables automatic cleanup.\n * Default: process.env.CELLD_RUN_RETENTION_MS || 0\n */\n runRetentionMs?: number;\n /** Duration of one bounded idle stream read. Default: 20000 */\n streamLongPollMs?: number;\n /** Runtime stream batching delay. Default: 0 */\n streamFlushIntervalMs?: number;\n /** Per-attempt fleet RPC deadline in milliseconds. Default: 30000 */\n rpcTimeoutMs?: number;\n}\n\nexport interface ResolvedCelldConfig {\n fleetUrl?: string;\n secret?: string;\n env?: CelldWorldEnv;\n deploymentId: string;\n baseUrl?: string;\n runRetentionMs: number;\n streamLongPollMs: number;\n streamFlushIntervalMs: number;\n rpcTimeoutMs: number;\n}\n\nexport function resolveConfig(config?: CelldWorldConfig): ResolvedCelldConfig {\n const runRetentionMs =\n config?.runRetentionMs !== undefined\n ? boundedIntegerOption('world-celld: runRetentionMs', config.runRetentionMs, 0, 0)\n : strictIntegerSetting(\n 'world-celld: runRetentionMs',\n process.env.CELLD_RUN_RETENTION_MS,\n 0,\n 0,\n );\n\n const rpcTimeoutMs = config?.rpcTimeoutMs ?? 30_000;\n if (\n !Number.isSafeInteger(rpcTimeoutMs) ||\n rpcTimeoutMs < 1 ||\n rpcTimeoutMs > MAX_FLEET_RPC_TIMEOUT_MS\n ) {\n throw new Error(`world-celld: rpcTimeoutMs must be between 1 and ${MAX_FLEET_RPC_TIMEOUT_MS}`);\n }\n const streamLongPollMs =\n config?.streamLongPollMs ??\n Math.min(MAX_STREAM_LONG_POLL_MS, Math.max(1, rpcTimeoutMs - 1_000));\n if (\n !Number.isSafeInteger(streamLongPollMs) ||\n streamLongPollMs < 1 ||\n streamLongPollMs > MAX_STREAM_LONG_POLL_MS\n ) {\n throw new Error(\n `world-celld: streamLongPollMs must be between 1 and ${MAX_STREAM_LONG_POLL_MS}`,\n );\n }\n if (streamLongPollMs >= rpcTimeoutMs) {\n throw new Error('world-celld: streamLongPollMs must be less than rpcTimeoutMs');\n }\n const streamFlushIntervalMs = config?.streamFlushIntervalMs ?? 0;\n if (!Number.isSafeInteger(streamFlushIntervalMs) || streamFlushIntervalMs < 0) {\n throw new Error('world-celld: streamFlushIntervalMs must be a non-negative safe integer');\n }\n\n return {\n fleetUrl: config?.fleetUrl ?? process.env.CELLD_FLEET_URL,\n secret: config?.secret ?? process.env.CELLD_WORLD_SECRET,\n env: config?.env,\n deploymentId: config?.deploymentId ?? process.env.CELLD_DEPLOYMENT_ID ?? 'celld-default',\n baseUrl: config?.baseUrl,\n runRetentionMs,\n streamLongPollMs,\n streamFlushIntervalMs,\n rpcTimeoutMs,\n };\n}\n","import { WorkflowWorldError } from '@workflow/errors';\n\nexport interface WireError {\n name?: string;\n message?: string;\n status?: number;\n}\n\n/**\n * Reconstruct a typed error from a router error payload. `@workflow/errors`\n * matches with name-based `.is()` checks, so a WorkflowWorldError with the\n * original name (and status) restored behaves identically to the source\n * error for every consumer in the workflow runtime.\n */\nexport function reconstructError(wire: WireError | undefined, httpStatus: number): Error {\n const message = wire?.message ?? `world-celld rpc failed with HTTP ${httpStatus}`;\n const error = new WorkflowWorldError(message, {\n status: wire?.status ?? httpStatus,\n });\n if (wire?.name) {\n error.name = wire.name;\n }\n return error;\n}\n\n/** Transport-level failure (fleet unreachable, malformed response). */\nexport class FleetTransportError extends Error {\n constructor(\n message: string,\n readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'FleetTransportError';\n }\n}\n","import { rpcParse, rpcStringify } from '../codec.js';\nimport { FleetTransportError, reconstructError, type WireError } from './errors.js';\nimport { FLEET_IDEMPOTENT_ATTEMPTS, MAX_FLEET_RPC_TIMEOUT_MS } from '../lifecycle.js';\n\nexport interface RpcTransport {\n fleetUrl: string;\n secret: string;\n /** Per-attempt request deadline. Default: 30 seconds. */\n timeoutMs?: number;\n /** Injectable for tests. Default: globalThis.fetch */\n fetchImpl?: typeof fetch;\n}\n\n/** Statuses that mean \"the fleet couldn't take the request\" (safe to retry reads). */\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction delayMs(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function resolveFleetTimeoutMs(transport: RpcTransport): number {\n const timeoutMs = transport.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_FLEET_RPC_TIMEOUT_MS) {\n throw new Error(\n `world-celld: fleet RPC timeout must be between 1 and ${MAX_FLEET_RPC_TIMEOUT_MS}`,\n );\n }\n return timeoutMs;\n}\n\n/**\n * Invoke one DO method through the worker router.\n *\n * Mutating calls run exactly once from the client's perspective: a blind\n * retry of e.g. applyEvent would turn commit-then-network-fail into a\n * spurious ENTITY_CONFLICT. The workflow runtime already gets at-least-once\n * via queue redelivery. Read-only calls retry on transport failures.\n */\nexport async function callDO<T>(\n transport: RpcTransport,\n binding: string,\n name: string,\n method: string,\n args: unknown[],\n opts?: { idempotent?: boolean },\n): Promise<T> {\n return await callFleetRoute(\n transport,\n `/v1/rpc/${binding}/${encodeURIComponent(name)}/${method}`,\n args,\n opts,\n );\n}\n\n/** Invoke a fixed authenticated worker route using the generic RPC codec. */\nexport async function callFleetRoute<T>(\n transport: RpcTransport,\n path: string,\n args: unknown[],\n opts?: { idempotent?: boolean },\n): Promise<T> {\n const doFetch = transport.fetchImpl ?? fetch;\n const url = `${transport.fleetUrl.replace(/\\/$/, '')}${path}`;\n const attempts = opts?.idempotent ? FLEET_IDEMPOTENT_ATTEMPTS : 1;\n const timeoutMs = resolveFleetTimeoutMs(transport);\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n if (attempt > 1) {\n await delayMs(100 * attempt + Math.random() * 200);\n }\n let response: Response;\n try {\n response = await doFetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${transport.secret}`,\n },\n body: rpcStringify(args),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n lastError = new FleetTransportError(`world-celld: fleet unreachable at ${url}`, error);\n continue;\n }\n\n if (response.ok) {\n try {\n return rpcParse<T>(await response.text());\n } catch (error) {\n lastError = new FleetTransportError(\n `world-celld: malformed successful response from ${url}`,\n error,\n );\n if (attempt < attempts) continue;\n throw lastError;\n }\n }\n\n const text = await response.text();\n let wire: WireError | undefined;\n try {\n wire = (JSON.parse(text) as { error?: WireError }).error;\n } catch {\n wire = { message: text || `HTTP ${response.status}` };\n }\n\n if (RETRYABLE_STATUSES.has(response.status) && attempt < attempts) {\n lastError = reconstructError(wire, response.status);\n continue;\n }\n\n throw reconstructError(wire, response.status);\n }\n\n throw lastError instanceof Error\n ? lastError\n : new FleetTransportError('world-celld: rpc failed', lastError);\n}\n","import {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n MAX_STREAM_WRITE_CHUNKS,\n NEGOTIATED_STREAM_CHUNKS,\n STREAM_BATCH_CONTENT_TYPE,\n STREAM_CHUNK_LIMIT_HEADER,\n isChunkLimitRejection,\n decodeStreamReadResult,\n decodeStreamWriteResult,\n encodeStreamWriteBatch,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamWriteResult,\n} from '../stream-protocol.js';\nimport { FleetTransportError, reconstructError, type WireError } from './errors.js';\nimport { resolveFleetTimeoutMs, type RpcTransport } from './rpc-client.js';\n\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\nconst READ_ATTEMPTS = 3;\nconst MAX_WRITE_RESPONSE_BYTES = 64;\nconst MAX_READ_RESPONSE_BYTES = MAX_STREAM_READ_BYTES + 64 * 1024;\nconst MAX_ERROR_RESPONSE_BYTES = 64 * 1024;\n\n/**\n * Per-request chunk limit the fleet has advertised, per transport. Absent\n * until a worker advertises one, so a client never sends an older worker more\n * than the baseline it accepts; a response without the header drops back.\n */\nconst advertisedChunkLimits = new WeakMap<RpcTransport, number>();\n\nexport function streamChunkLimit(transport: RpcTransport): number {\n return advertisedChunkLimits.get(transport) ?? MAX_STREAM_WRITE_CHUNKS;\n}\n\nexport function resetStreamChunkLimit(transport: RpcTransport): void {\n advertisedChunkLimits.delete(transport);\n}\n\nfunction recordStreamChunkLimit(transport: RpcTransport, response: Response): void {\n const advertised = Number(response.headers.get(STREAM_CHUNK_LIMIT_HEADER));\n if (Number.isSafeInteger(advertised) && advertised > MAX_STREAM_WRITE_CHUNKS) {\n advertisedChunkLimits.set(transport, Math.min(advertised, NEGOTIATED_STREAM_CHUNKS));\n } else {\n advertisedChunkLimits.delete(transport);\n }\n}\n\nfunction delayMs(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));\n if (signal.aborted) return Promise.reject(aborted(signal));\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n reject(aborted(signal));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction requestSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(timeoutMs);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction aborted(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');\n}\n\nasync function readBoundedResponse(response: Response, maxBytes: number): Promise<Uint8Array> {\n const contentLength = Number(response.headers.get('content-length') ?? '0');\n if (contentLength > maxBytes) {\n await response.body?.cancel('stream response exceeds configured limit').catch(() => undefined);\n throw new FleetTransportError(`world-celld: stream response exceeds ${maxBytes} bytes`);\n }\n if (!response.body) return new Uint8Array();\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel('stream response exceeds configured limit').catch(() => undefined);\n throw new FleetTransportError(`world-celld: stream response exceeds ${maxBytes} bytes`);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nasync function errorFromResponse(response: Response): Promise<Error> {\n const text = new TextDecoder().decode(\n await readBoundedResponse(response, MAX_ERROR_RESPONSE_BYTES),\n );\n let wire: WireError | undefined;\n try {\n wire = (JSON.parse(text) as { error?: WireError }).error;\n } catch {\n wire = { message: text || `HTTP ${response.status}` };\n }\n return reconstructError(wire, response.status);\n}\n\nfunction streamUrl(transport: RpcTransport, name: string): string {\n return `${transport.fleetUrl.replace(/\\/$/, '')}/v1/streams/${encodeURIComponent(name)}/chunks`;\n}\n\nexport async function writeStreamChunks(\n transport: RpcTransport,\n name: string,\n runId: string,\n chunks: Uint8Array[],\n): Promise<StreamWriteResult> {\n const timeoutMs = resolveFleetTimeoutMs(transport);\n const body = encodeStreamWriteBatch(chunks);\n if (body.byteLength > MAX_STREAM_BATCH_BYTES + 4 * NEGOTIATED_STREAM_CHUNKS + 1024) {\n throw new Error('world-celld: encoded stream batch exceeds configured limit');\n }\n const url = new URL(streamUrl(transport, name));\n url.searchParams.set('runId', runId);\n const doFetch = transport.fetchImpl ?? fetch;\n\n let response: Response;\n try {\n response = await doFetch(url, {\n method: 'POST',\n headers: {\n 'content-type': STREAM_BATCH_CONTENT_TYPE,\n authorization: `Bearer ${transport.secret}`,\n },\n body,\n signal: requestSignal(timeoutMs),\n });\n } catch (error) {\n throw new FleetTransportError(`world-celld: fleet unreachable at ${url.href}`, error);\n }\n\n if (!response.ok) throw await errorFromResponse(response);\n recordStreamChunkLimit(transport, response);\n try {\n return decodeStreamWriteResult(await readBoundedResponse(response, MAX_WRITE_RESPONSE_BYTES));\n } catch (error) {\n if (error instanceof FleetTransportError) throw error;\n throw new FleetTransportError(`world-celld: malformed stream response from ${url.href}`, error);\n }\n}\n\nexport async function readStreamChunks(\n transport: RpcTransport,\n name: string,\n request: StreamReadRequest,\n signal?: AbortSignal,\n): Promise<StreamReadResult> {\n const timeoutMs = resolveFleetTimeoutMs(transport);\n const url = new URL(streamUrl(transport, name));\n url.searchParams.set('runId', request.runId);\n url.searchParams.set('startIndex', String(request.startIndex));\n url.searchParams.set('maxChunks', String(request.maxChunks));\n url.searchParams.set('maxBytes', String(request.maxBytes));\n url.searchParams.set('waitMs', String(request.waitMs));\n const doFetch = transport.fetchImpl ?? fetch;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= READ_ATTEMPTS; attempt++) {\n if (signal?.aborted) throw aborted(signal);\n if (attempt > 1) await delayMs(100 * attempt + Math.random() * 200, signal);\n let response: Response;\n try {\n response = await doFetch(url, {\n method: 'GET',\n headers: { authorization: `Bearer ${transport.secret}` },\n signal: requestSignal(timeoutMs, signal),\n });\n } catch (error) {\n if (signal?.aborted) throw aborted(signal);\n lastError = new FleetTransportError(`world-celld: fleet unreachable at ${url.href}`, error);\n continue;\n }\n\n if (signal?.aborted) {\n await response.body?.cancel(aborted(signal)).catch(() => undefined);\n throw aborted(signal);\n }\n\n if (response.ok) {\n recordStreamChunkLimit(transport, response);\n try {\n return decodeStreamReadResult(await readBoundedResponse(response, MAX_READ_RESPONSE_BYTES));\n } catch (error) {\n if (signal?.aborted) throw aborted(signal);\n lastError =\n error instanceof FleetTransportError\n ? error\n : new FleetTransportError(\n `world-celld: malformed stream response from ${url.href}`,\n error,\n );\n if (attempt < READ_ATTEMPTS) continue;\n throw lastError;\n }\n }\n\n let error: Error;\n try {\n error = await errorFromResponse(response);\n } catch (cause) {\n if (signal?.aborted) throw aborted(signal);\n error =\n cause instanceof FleetTransportError\n ? cause\n : new FleetTransportError(\n `world-celld: malformed stream error response from ${url.href}`,\n cause,\n );\n }\n if (RETRYABLE_STATUSES.has(response.status) && attempt < READ_ATTEMPTS) {\n lastError = error;\n continue;\n }\n if (\n request.maxChunks > MAX_STREAM_READ_CHUNKS &&\n isChunkLimitRejection(error) &&\n attempt < READ_ATTEMPTS\n ) {\n // An older worker behind the same fleet URL; reads are safe to repeat.\n resetStreamChunkLimit(transport);\n url.searchParams.set('maxChunks', String(MAX_STREAM_READ_CHUNKS));\n lastError = error;\n continue;\n }\n throw error;\n }\n\n throw lastError instanceof Error\n ? lastError\n : new FleetTransportError('world-celld: stream read failed', lastError);\n}\n","/**\n * HTTP-backed implementations of the structural namespace interfaces the\n * vendored storage/streamer/queue layers consume. `get(id)` returns a stub\n * whose method calls become `POST /v1/rpc/{binding}/{name}/{method}` against\n * the fleet — the celld stand-in for Cloudflare's `env` bindings.\n */\nimport type { CelldWorldEnv } from '../config.js';\nimport {\n createWorkflowIndex,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport type { CelldQueueProducer } from '../queue.js';\nimport type { NativeQueueSendResult } from '../queue-protocol.js';\nimport type { WorkflowRunDOStub } from '../storage.js';\nimport type { StreamDOStub } from '../streamer.js';\nimport type { RunListPage, RunListRequest } from '../run-list.js';\nimport { callDO, callFleetRoute, type RpcTransport } from './rpc-client.js';\nimport {\n readStreamChunks,\n resetStreamChunkLimit,\n streamChunkLimit,\n writeStreamChunks,\n} from './stream-client.js';\n\ninterface MethodSpec {\n methods: readonly string[];\n mutating: ReadonlySet<string>;\n}\n\nconst RUNS: MethodSpec = {\n methods: [\n 'applyEvent',\n 'getLifecycleStatus',\n 'getRun',\n 'getStep',\n 'getEvent',\n 'listEvents',\n 'listSteps',\n 'listHooks',\n 'getCleanupStatus',\n 'scheduleCleanup',\n 'cleanupNow',\n 'rearmCleanup',\n 'resolveHookTokenClaim',\n ],\n mutating: new Set([\n 'applyEvent',\n 'scheduleCleanup',\n 'cleanupNow',\n 'rearmCleanup',\n 'resolveHookTokenClaim',\n ]),\n};\n\nconst STREAMS: MethodSpec = {\n methods: [\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'listStreams',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ],\n mutating: new Set([\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ]),\n};\n\nfunction makeStreamNamespace(transport: RpcTransport) {\n return {\n idFromName(name: string) {\n return { toString: () => name };\n },\n get(id: { toString(): string }): StreamDOStub {\n const name = id.toString();\n const control = makeStub<StreamDOStub>(transport, 'streams', name, STREAMS);\n control.writeChunks = (runId, chunks) => writeStreamChunks(transport, name, runId, chunks);\n control.readChunks = (request, signal) => readStreamChunks(transport, name, request, signal);\n control.streamChunkLimit = () => streamChunkLimit(transport);\n control.resetStreamChunkLimit = () => resetStreamChunkLimit(transport);\n return control;\n },\n };\n}\n\nfunction makeStub<T>(transport: RpcTransport, binding: string, name: string, spec: MethodSpec): T {\n const stub: Record<string, (...args: unknown[]) => Promise<unknown>> = {};\n for (const method of spec.methods) {\n stub[method] = (...args: unknown[]) =>\n callDO(transport, binding, name, method, args, {\n idempotent: !spec.mutating.has(method),\n });\n }\n return stub as T;\n}\n\nfunction makeNamespace<T>(transport: RpcTransport, binding: string, spec: MethodSpec) {\n return {\n idFromName(name: string) {\n return { toString: () => name };\n },\n get(id: { toString(): string }): T {\n return makeStub<T>(transport, binding, id.toString(), spec);\n },\n };\n}\n\nconst RUN_CATALOG: MethodSpec = {\n methods: ['upsertRun', 'list', 'expireRun'],\n // Every method is idempotent; transport retries cannot duplicate effects.\n mutating: new Set(),\n};\n\nconst HOOK_TOKENS: MethodSpec = {\n methods: ['get', 'reserve', 'finalize', 'releaseClaim', 'releaseBatch'],\n mutating: new Set(),\n};\n\nconst HOOK_IDS: MethodSpec = {\n methods: ['get', 'reserve', 'publish', 'releaseClaim', 'releaseBatch'],\n mutating: new Set(),\n};\n\n/** Transports whose worker answered the fleet-side run listing with 404. */\nconst legacyRunListing = new WeakSet<RpcTransport>();\n\nasync function listResolvedRuns(\n transport: RpcTransport,\n request: RunListRequest,\n): Promise<RunListPage | null> {\n if (legacyRunListing.has(transport)) return null;\n try {\n return await callFleetRoute<RunListPage>(transport, '/v1/index/runs/list-resolved', [request], {\n idempotent: true,\n });\n } catch (error) {\n // A worker that predates the route: list from the client instead.\n if ((error as { status?: unknown }).status === 404) {\n legacyRunListing.add(transport);\n return null;\n }\n throw error;\n }\n}\n\nexport function createRemoteEnv(transport: RpcTransport): CelldWorldEnv {\n const runCatalog = makeNamespace<RunCatalogShardStub>(transport, 'run-catalog', RUN_CATALOG);\n const hookTokens = makeNamespace<HookTokenShardStub>(transport, 'hook-tokens', HOOK_TOKENS);\n const hookIds = makeNamespace<HookIdShardStub>(transport, 'hook-ids', HOOK_IDS);\n const workflowIndex = createWorkflowIndex({ runCatalog, hookTokens, hookIds });\n return {\n WORKFLOW_DB: makeNamespace<WorkflowRunDOStub>(transport, 'runs', RUNS),\n WORKFLOW_STREAMS: makeStreamNamespace(transport),\n WORKFLOW_INDEX: {\n ...workflowIndex,\n commitRun: (run, serializedMetadata, publicationExpiresAt) =>\n callFleetRoute(\n transport,\n '/v1/index/runs/commit',\n [run, serializedMetadata, publicationExpiresAt],\n {\n idempotent: true,\n },\n ),\n listRuns: (options) =>\n callFleetRoute(transport, '/v1/index/runs/list', [options], { idempotent: true }),\n listResolvedRuns: (request) => listResolvedRuns(transport, request),\n expireRun: (request) =>\n callFleetRoute(transport, '/v1/index/runs/expire', [request], { idempotent: true }),\n reserveHook: (token, owner) =>\n callFleetRoute(transport, '/v1/index/hooks/reserve', [token, owner], {\n idempotent: true,\n }),\n finalizeHookIndexes: (token, hookId, serializedHook, owner, reservation) =>\n callFleetRoute(\n transport,\n '/v1/index/hooks/finalize',\n [token, hookId, serializedHook, owner, reservation],\n { idempotent: true },\n ),\n releaseHookReservation: (token, owner, reservation) =>\n callFleetRoute(\n transport,\n '/v1/index/hooks/release-reservation',\n [token, owner, reservation],\n { idempotent: true },\n ),\n releaseHookIndexes: (request) =>\n callFleetRoute(transport, '/v1/index/hooks/release', [request], { idempotent: true }),\n },\n WORKFLOW_QUEUE: {\n send: (envelope, options) =>\n callFleetRoute<NativeQueueSendResult>(transport, '/v1/queue/send', [envelope, options], {\n // A lost response leaves Queue publication ambiguous. The broker and\n // consumer are at-least-once; do not add a blind transport retry.\n idempotent: false,\n }),\n } satisfies CelldQueueProducer,\n };\n}\n","/**\n * Creates a namespaced debug logger.\n * Logs to stderr to avoid corrupting CLI JSON output on stdout.\n *\n * Control via WORKFLOW_DEBUG environment variable:\n * WORKFLOW_DEBUG=1 // Enable all\n * WORKFLOW_DEBUG=mysql-world // Specific namespace\n * WORKFLOW_DEBUG=mysql-world,redis-world // Multiple namespaces\n *\n * Vendored from vinnymac/worlds packages/shared, modified: guarded for\n * non-Node runtimes (celld/workerd), where `process` may be absent or\n * stubbed — falls back to console.error.\n */\nexport function createDebugLogger(namespace: string) {\n return (...args: unknown[]) => {\n const debug = typeof process === 'undefined' ? undefined : process.env?.WORKFLOW_DEBUG;\n if (!debug) return;\n\n const enabled =\n debug === '1' ||\n debug === 'true' ||\n debug === '*' ||\n debug.split(',').some((ns: string) => ns.trim() === namespace);\n\n if (!enabled) return;\n\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${namespace}]`;\n const message = args\n .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\n .join(' ');\n\n if (typeof process.stderr?.write === 'function') {\n process.stderr.write(`${prefix} ${message}\\n`);\n } else {\n console.error(`${prefix} ${message}`);\n }\n };\n}\n","import { createDebugLogger } from './vendor/shared/index.js';\n\nexport { compact } from './vendor/shared/index.js';\nexport const debug = createDebugLogger('celld-world');\n","/**\n * Queue implementation for the celld world.\n *\n * Vendored from vinnymac/worlds packages/world-cloudflare/src/queue.ts\n * (Apache-2.0, see NOTICE), modified for celld:\n *\n * - Production publishes a small pointer through celld v0.6.0 native Queues.\n * The deployed Queue consumer forwards deliveries to the same HTTP handler\n * used by the in-process test pump.\n * - Run-bearing message bodies live in the fleet object store. This preserves\n * the World's larger payload contract and lets run retention delete payload\n * bytes independently of the broker's fixed retention window.\n * - `createQueueHandler` has ONE dialect — the x-vqs wire format the test\n * pump has always used — extended so permanent errors surface as their\n * HTTP statuses. Native Queue deliveries and the in-process test pump hit the\n * exact same handler path.\n */\nimport { WorkflowWorldError } from '@workflow/errors';\nimport {\n MessageId,\n parseQueueName,\n QueuePayloadSchema,\n type Queue,\n type QueuePayload,\n type ValidQueueName,\n} from '@workflow/world';\nimport { parse, stringify } from './vendor/shared/index.js';\nimport { monotonicFactory } from 'ulid';\nimport { debug } from './util.js';\nimport {\n nativeQueueDelaySeconds,\n type NativeQueueEnvelope,\n type NativeQueueSendOptions,\n type NativeQueueSendResult,\n} from './queue-protocol.js';\nimport {\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n} from './lifecycle.js';\nimport {\n boundedIntegerOption,\n checkedQueueTimestampAdd,\n queueDelayDeadline,\n strictIntegerSetting,\n} from './validation.js';\n\nconst MAX_TIMER_DELAY_MS = 0x7fffffff;\nconst MAX_TEST_PUMP_BACKOFF_MS = 60_000;\n\nfunction delay(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\nasync function delayFor(milliseconds: number): Promise<void> {\n let remaining = milliseconds;\n while (remaining > MAX_TIMER_DELAY_MS) {\n await delay(MAX_TIMER_DELAY_MS);\n remaining -= MAX_TIMER_DELAY_MS;\n }\n await delay(remaining);\n}\n\n/**\n * HTTP status codes that indicate permanent (non-retryable) failures.\n * Deliveries with these statuses are dropped immediately instead of retried.\n *\n * - 404: Resource not found (e.g., run was deleted)\n * - 409: Conflict (e.g., duplicate event that can't be replayed)\n * - 410: Gone (e.g., run was already terminal)\n * - 422: Unprocessable entity (e.g., invalid payload structure)\n */\nexport const PERMANENT_ERROR_STATUSES = new Set([404, 409, 410, 422]);\n\nfunction isPermanentError(err: unknown): err is WorkflowWorldError {\n if (err instanceof WorkflowWorldError && err.status !== undefined) {\n return PERMANENT_ERROR_STATUSES.has(err.status);\n }\n return false;\n}\n\n/** Caps at 60 seconds. */\nexport function computeBackoff(attempt: number): number {\n return Math.min(60, 2 ** attempt);\n}\n\ntype Pathname = 'flow';\n\nconst QUEUE_PATHNAME: Pathname = 'flow';\n\nfunction isTestMode(): boolean {\n // Explicit override: force the production native-Queue path even under a test\n // runner (used by the conformance suite to exercise the live native queue —\n // the world-testing server inherits VITEST from the vitest parent).\n if (process.env.CELLD_QUEUE_MODE === 'native') return false;\n return process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';\n}\n\nexport interface CelldQueueProducer {\n send(\n envelope: NativeQueueEnvelope,\n options?: NativeQueueSendOptions,\n ): Promise<NativeQueueSendResult>;\n}\n\nexport interface CelldQueueConfig {\n env: {\n WORKFLOW_QUEUE: CelldQueueProducer;\n };\n deploymentId: string;\n /**\n * Base URL the app's workflow endpoints are mounted on. The native Queue\n * consumer delivers to `${baseUrl}/.well-known/workflow/v1/flow`; the test\n * pump uses the same value.\n * Default: process.env.WORKFLOW_BASE_URL || `http://localhost:${process.env.PORT ?? 3000}`\n */\n baseUrl?: string;\n /** Per-job HTTP request timeout (ms) for the test pump. Default/max: 300_000 */\n httpTimeoutMs?: number;\n /** Maximum retry attempts in the test pump before dropping a job. Default: 5 */\n maxAttempts?: number;\n /** Base backoff delay (ms) for test pump retries. Default: 1000; maximum: 60_000 */\n backoffDelayMs?: number;\n}\n\ninterface PumpEnvelope {\n messageId: string;\n queueName: ValidQueueName;\n attempt: number;\n message: QueuePayload;\n idempotencyKey?: string;\n}\n\nfunction resolveBaseUrl(config: CelldQueueConfig): string {\n if (config.baseUrl) return config.baseUrl;\n if (process.env.WORKFLOW_BASE_URL) return process.env.WORKFLOW_BASE_URL;\n const port = process.env.PORT ?? '3000';\n return `http://localhost:${port}`;\n}\n\n/**\n * In-process test pump. Holds an in-memory FIFO and HTTP-dispatches envelopes\n * to the user's server at `${baseUrl}/.well-known/workflow/v1/flow`.\n *\n * Mirrors world-local's idempotency semantics: messages are deduplicated on\n * `idempotencyKey` while a message with the same key is in flight, and the\n * key is released only when the message is fully handled (success or drop).\n *\n * Modified vs upstream: permanent-error statuses (404/409/410/422) from the\n * handler drop the message immediately instead of burning retry budget —\n * matching the native Queue consumer's production semantics.\n */\nfunction createTestPump(config: CelldQueueConfig) {\n const httpTimeoutMs = boundedIntegerOption(\n 'world-celld test pump httpTimeoutMs',\n config.httpTimeoutMs,\n 300_000,\n 1,\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n );\n const maxAttempts = boundedIntegerOption(\n 'world-celld test pump maxAttempts',\n config.maxAttempts,\n 5,\n 1,\n );\n const baseBackoffMs = boundedIntegerOption(\n 'world-celld test pump backoffDelayMs',\n config.backoffDelayMs,\n 1000,\n 0,\n MAX_TEST_PUMP_BACKOFF_MS,\n );\n\n const queues: Record<Pathname, PumpEnvelope[]> = { flow: [] };\n const wakers: Record<Pathname, Array<() => void>> = { flow: [] };\n /** Inflight messageIds by idempotencyKey (world-local queue.js semantics). */\n const inflightMessages = new Map<string, MessageId>();\n let running = false;\n\n function release(envelope: PumpEnvelope) {\n if (envelope.idempotencyKey) {\n inflightMessages.delete(envelope.idempotencyKey);\n }\n }\n\n function enqueue(pathname: Pathname, envelope: PumpEnvelope) {\n queues[pathname].push(envelope);\n wakers[pathname].shift()?.();\n }\n\n async function take(pathname: Pathname): Promise<PumpEnvelope | null> {\n const existing = queues[pathname].shift();\n if (existing) return existing;\n return new Promise((resolve) => {\n wakers[pathname].push(() => resolve(queues[pathname].shift() ?? null));\n });\n }\n\n async function dispatch(envelope: PumpEnvelope, pathname: Pathname): Promise<void> {\n const url = `${resolveBaseUrl(config)}/.well-known/workflow/v1/${pathname}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-vqs-queue-name': envelope.queueName,\n 'x-vqs-message-id': envelope.messageId,\n 'x-vqs-message-attempt': String(envelope.attempt),\n },\n body: stringify(envelope.message),\n signal: AbortSignal.timeout(httpTimeoutMs),\n });\n\n if (response.ok) {\n try {\n await response.body?.cancel();\n } catch {\n // The status already determines the queue outcome. Do not turn an ack\n // into a retry solely because releasing an unused body failed.\n }\n release(envelope);\n return;\n }\n\n const text = await response.text();\n\n if (response.status === 503) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = null;\n }\n const timeoutSeconds = (parsed as { timeoutSeconds?: number } | null)?.timeoutSeconds;\n const now = Date.now();\n const redeliveryAt = queueDelayDeadline(\n now,\n timeoutSeconds,\n 1,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n );\n if (redeliveryAt !== null) {\n // Same message re-delivered later: the idempotency key stays claimed.\n void delayFor(redeliveryAt - now).then(() => enqueue(pathname, envelope));\n return;\n }\n }\n\n if (PERMANENT_ERROR_STATUSES.has(response.status)) {\n release(envelope);\n debug(\n `[world-celld test pump] dropping ${envelope.messageId}: permanent HTTP ${response.status}: ${text}`,\n );\n return;\n }\n\n if (envelope.attempt < maxAttempts) {\n const next: PumpEnvelope = { ...envelope, attempt: envelope.attempt + 1 };\n const backoff = Math.min(\n MAX_TEST_PUMP_BACKOFF_MS,\n baseBackoffMs * 2 ** Math.min(next.attempt - 1, 30),\n );\n if (\n checkedQueueTimestampAdd(Date.now(), backoff, MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS) ===\n null\n ) {\n release(envelope);\n console.error(\n `[world-celld test pump] dropping ${envelope.messageId}: retry deadline exceeds the queue timestamp horizon`,\n );\n return;\n }\n void delayFor(backoff).then(() => enqueue(pathname, next));\n } else {\n release(envelope);\n console.error(\n `[world-celld test pump] dropping ${envelope.messageId} after ${envelope.attempt} attempts: HTTP ${response.status}: ${text}`,\n );\n }\n }\n\n async function loop(pathname: Pathname) {\n while (true) {\n if (!running) return;\n const envelope = await take(pathname);\n if (!envelope) continue;\n try {\n await dispatch(envelope, pathname);\n } catch (err) {\n release(envelope);\n console.error(`[world-celld test pump] dispatch error on ${pathname}:`, err);\n }\n }\n }\n\n return {\n /** Returns the inflight messageId when the key is already claimed. */\n inflight(idempotencyKey: string | undefined): MessageId | undefined {\n return idempotencyKey ? inflightMessages.get(idempotencyKey) : undefined;\n },\n push(pathname: Pathname, envelope: PumpEnvelope, delaySeconds?: number) {\n if (\n queueDelayDeadline(\n Date.now(),\n delaySeconds ?? 0,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) === null\n ) {\n throw new Error('world-celld queue delaySeconds lacks required delivery headroom');\n }\n if (envelope.idempotencyKey) {\n inflightMessages.set(envelope.idempotencyKey, MessageId.parse(envelope.messageId));\n }\n if (delaySeconds && delaySeconds > 0) {\n void delayFor(delaySeconds * 1000).then(() => enqueue(pathname, envelope));\n } else {\n enqueue(pathname, envelope);\n }\n },\n async start() {\n if (running) return;\n running = true;\n void loop('flow');\n },\n stop() {\n running = false;\n for (const list of Object.values(wakers)) for (const w of list) w();\n },\n };\n}\n\nexport function createQueue(config: CelldQueueConfig): Queue & { start(): Promise<void> } {\n const { env, deploymentId } = config;\n if (!env?.WORKFLOW_QUEUE) {\n throw new Error('world-celld queue missing WORKFLOW_QUEUE binding');\n }\n const generateMessageId = monotonicFactory();\n const testPump = createTestPump(config);\n\n return {\n async queue(queueName, message, opts) {\n parseQueueName(queueName);\n const parsedMessage = QueuePayloadSchema.safeParse(message);\n if (!parsedMessage.success) {\n throw new WorkflowWorldError('world-celld queue payload is invalid', { status: 422 });\n }\n if (\n queueDelayDeadline(\n Date.now(),\n opts?.delaySeconds ?? 0,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) === null\n ) {\n throw new Error('world-celld queue delaySeconds lacks required delivery headroom');\n }\n const runId =\n 'runId' in parsedMessage.data && typeof parsedMessage.data.runId === 'string'\n ? parsedMessage.data.runId\n : undefined;\n\n if (isTestMode()) {\n // Dedup on idempotencyKey while a message with the same key is in\n // flight — core re-enqueues every still-pending step on every replay\n // with idempotencyKey = stepId and relies on queue-level dedup.\n const existing = testPump.inflight(opts?.idempotencyKey);\n if (existing) {\n return { messageId: existing };\n }\n const messageId = MessageId.parse(`msg_${generateMessageId()}`);\n testPump.push(\n QUEUE_PATHNAME,\n {\n messageId,\n queueName,\n attempt: 1,\n message: parsedMessage.data,\n idempotencyKey: opts?.idempotencyKey,\n },\n opts?.delaySeconds,\n );\n return { messageId };\n }\n\n // Production: publish through celld's native Queue. The worker-side send\n // route moves run-bearing payload bytes into object storage before it publishes this\n // envelope, so only a bounded pointer reaches the broker.\n const messageId = MessageId.parse(`msg_${generateMessageId()}`);\n const body = stringify(parsedMessage.data);\n const notBefore =\n opts?.delaySeconds && opts.delaySeconds > 0\n ? (queueDelayDeadline(\n Date.now(),\n opts.delaySeconds,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) ?? undefined)\n : undefined;\n const envelope: NativeQueueEnvelope = {\n version: 1,\n messageId,\n queueName,\n targetBaseUrl: resolveBaseUrl(config),\n runId,\n idempotencyKey: opts?.idempotencyKey,\n body,\n notBefore,\n };\n const published = await env.WORKFLOW_QUEUE.send(envelope, {\n delaySeconds: nativeQueueDelaySeconds(notBefore, Date.now()),\n });\n return { messageId: MessageId.parse(published.messageId) };\n },\n\n createQueueHandler(queueNamePrefix, handler) {\n // ONE dialect for the pump, native Queue consumer deliveries, and\n // @workflow/world-testing's mounted routes: x-vqs headers + tagged-JSON\n // body. The response taxonomy drives the sender's retry state machine:\n // - 2xx -> ack\n // - 503 + {timeoutSeconds} -> redeliver after N seconds (key stays claimed)\n // - 404/409/410/422 -> permanent, drop without retrying\n // - other non-2xx -> retry with capped backoff\n return async (req: Request) => {\n if (req.method !== 'POST') {\n return Response.json({ error: 'Expected POST' }, { status: 405 });\n }\n if (\n req.headers.get('content-type')?.split(';', 1)[0].trim().toLowerCase() !==\n 'application/json'\n ) {\n return Response.json({ error: 'Expected application/json' }, { status: 415 });\n }\n const reqQueueName = req.headers.get('x-vqs-queue-name');\n const reqMessageId = req.headers.get('x-vqs-message-id') as MessageId | null;\n const attemptStr = req.headers.get('x-vqs-message-attempt');\n\n if (!reqQueueName || !reqMessageId || !attemptStr || !req.body) {\n return Response.json({ error: 'Missing required headers or body' }, { status: 400 });\n }\n if (!reqQueueName.startsWith(queueNamePrefix)) {\n return Response.json({ error: 'Unhandled queue' }, { status: 400 });\n }\n let attempt: number;\n try {\n attempt = strictIntegerSetting('x-vqs-message-attempt', attemptStr, 1, 1);\n } catch {\n return Response.json({ error: 'Invalid x-vqs-message-attempt header' }, { status: 400 });\n }\n try {\n // Tagged-JSON codec: revives Uint8Array payloads (runInput.input).\n let body: unknown;\n try {\n body = parse<unknown>(await req.text());\n } catch {\n return Response.json({ error: 'Malformed tagged JSON body' }, { status: 422 });\n }\n const parsedBody = QueuePayloadSchema.safeParse(body);\n if (!parsedBody.success) {\n return Response.json({ error: 'Invalid queue payload' }, { status: 422 });\n }\n const result = await handler(parsedBody.data, {\n attempt,\n queueName: reqQueueName,\n messageId: reqMessageId,\n });\n if (result && typeof result.timeoutSeconds === 'number') {\n if (\n queueDelayDeadline(\n Date.now(),\n result.timeoutSeconds,\n 1,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) === null\n ) {\n throw new Error('Queue handler timeoutSeconds is out of range');\n }\n return Response.json(\n { timeoutSeconds: result.timeoutSeconds },\n { status: 503, headers: { 'Retry-After': String(result.timeoutSeconds) } },\n );\n }\n return new Response(null, { status: 204 });\n } catch (error) {\n // Permanent vs transient distinction: permanent errors surface as\n // their own status so the sender drops instead of retrying.\n if (isPermanentError(error)) {\n debug('[world-celld queue handler] permanent error:', {\n status: error.status,\n error: String(error),\n });\n return Response.json(\n { error: String(error), permanent: true },\n { status: error.status },\n );\n }\n\n const backoffSeconds = computeBackoff(attempt);\n debug('[world-celld queue handler] transient error, will retry:', {\n error: String(error),\n backoffSeconds,\n });\n return Response.json(\n { error: String(error), retryAfter: backoffSeconds },\n { status: 500, headers: { 'Retry-After': String(backoffSeconds) } },\n );\n }\n };\n },\n\n async getDeploymentId() {\n return deploymentId;\n },\n\n async start() {\n if (isTestMode()) {\n await testPump.start();\n }\n // Production: celld native Queues are push-based, nothing to start.\n },\n };\n}\n","import {\n EntityConflictError,\n HookNotFoundError,\n RunExpiredError,\n RunNotSupportedError,\n TooEarlyError,\n WorkflowRunNotFoundError,\n WorkflowWorldError,\n} from '@workflow/errors';\nimport type {\n CreateEventParams,\n CreateEventRequest,\n Event,\n EventResult,\n GetEventParams,\n GetHookParams,\n GetStepParams,\n GetWorkflowRunParams,\n Hook,\n ListEventsParams,\n ListHooksParams,\n ListWorkflowRunStepsParams,\n ListWorkflowRunsParams,\n PaginatedResponse,\n ResolveData,\n RunCreatedEventRequest,\n Step,\n StepWithoutData,\n Storage,\n WorkflowRun,\n WorkflowRunWithoutData,\n} from '@workflow/world';\nimport {\n CreateEventSchema,\n EventSchema,\n HookSchema,\n SPEC_VERSION_CURRENT,\n StepSchema,\n WaitSchema,\n WorkflowRunSchema,\n} from '@workflow/world';\nimport { parse, stringify } from './vendor/shared/index.js';\nimport { monotonicFactory } from 'ulid';\nimport type {\n ApplyEventErrorCode,\n ApplyEventFailure,\n ApplyEventOutcome,\n ApplyEventRequest,\n ApplyEventSuccess,\n} from './apply-event.js';\nimport type { HookTokenOwner, IndexNamespace } from './config.js';\nimport { type HookReservation, runIndexMetadata } from './indexes.js';\nimport { FleetTransportError } from './remote/errors.js';\nimport { listRunsPage, MAX_RUN_LIST_LIMIT, type RunListRequest } from './run-list.js';\nimport { compact } from './util.js';\nimport type { RunReadOutcome } from './retention.js';\n\n/**\n * RPC surface of WorkflowRunDO used by the storage layer. Declared\n * structurally to avoid a circular type reference on the DO class.\n */\nexport interface WorkflowRunDOStub {\n applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome>;\n resolveHookTokenClaim(request: {\n hookId: string;\n token: string;\n claimId: string;\n }): Promise<{ committed: boolean }>;\n getLifecycleStatus(): Promise<import('./retention.js').RunLifecycleStatus>;\n getRun(): Promise<RunReadOutcome<WorkflowRun | null>>;\n getStep(stepId: string): Promise<RunReadOutcome<Step | null>>;\n getEvent(eventId: string): Promise<RunReadOutcome<Event | null>>;\n listEvents(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Event[]; cursor: string | null; hasMore: boolean }>>;\n listSteps(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Step[]; cursor: string | null; hasMore: boolean }>>;\n listHooks(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Hook[]; cursor: string | null; hasMore: boolean }>>;\n getCleanupStatus(): Promise<import('./retention.js').CleanupRecord | null>;\n scheduleCleanup(\n request: import('./retention.js').ScheduleCleanupRequest,\n ): Promise<import('./retention.js').CleanupRecord | null>;\n cleanupNow(\n request: import('./retention.js').ScheduleCleanupRequest,\n ): Promise<import('./retention.js').CleanupRecord | null>;\n rearmCleanup(): Promise<import('./retention.js').CleanupRecord | null>;\n}\n\nexport interface WorkflowRunDONamespace {\n idFromName(name: string): DurableObjectIdLike;\n get(id: DurableObjectIdLike): WorkflowRunDOStub;\n}\n\nexport interface DurableObjectIdLike {\n toString(): string;\n}\n\nexport interface CloudflareStorageConfig {\n env: {\n WORKFLOW_DB: WorkflowRunDONamespace;\n WORKFLOW_INDEX: IndexNamespace;\n };\n deploymentId: string;\n runRetentionMs?: number;\n}\n\nfunction hookOwner(hook: Pick<Hook, 'runId' | 'hookId'>): HookTokenOwner {\n return { runId: hook.runId, hookId: hook.hookId };\n}\n\nconst APPLY_EVENT_ERROR_CODES = new Set<string>([\n 'RUN_NOT_FOUND',\n 'STEP_NOT_FOUND',\n 'HOOK_NOT_FOUND',\n 'WAIT_NOT_FOUND',\n 'ENTITY_CONFLICT',\n 'HOOK_CLAIM_CANCELLED',\n 'RUN_EXPIRED',\n 'TOO_EARLY',\n 'RUN_NOT_SUPPORTED',\n] satisfies ApplyEventErrorCode[]);\n\ninterface ApplyEventWireFailure {\n ok: false;\n code: string;\n message: string;\n status?: number;\n retryAfter?: number;\n retryAfterMs?: number;\n retryAfterSeconds?: number;\n runSpecVersion?: number;\n worldSpecVersion?: number;\n details?: unknown;\n}\n\ntype ParsedApplyEventOutcome =\n | { kind: 'success'; outcome: ApplyEventSuccess }\n | { kind: 'known-failure'; outcome: ApplyEventFailure & ApplyEventWireFailure }\n | { kind: 'unknown-failure'; outcome: ApplyEventWireFailure };\n\nfunction malformedApplyEventOutcome(reason: string): never {\n throw new FleetTransportError(`world-celld: malformed applyEvent outcome: ${reason}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction validateOptionalNumber(\n outcome: Record<string, unknown>,\n key: 'status' | 'retryAfter' | 'retryAfterSeconds' | 'runSpecVersion' | 'worldSpecVersion',\n integer: boolean,\n): void {\n const value = outcome[key];\n if (\n value !== undefined &&\n (typeof value !== 'number' ||\n !Number.isFinite(value) ||\n (integer && !Number.isSafeInteger(value)))\n ) {\n malformedApplyEventOutcome(`${key} must be ${integer ? 'a safe integer' : 'a finite number'}`);\n }\n}\n\nfunction validateOptionalRetryAfterMs(outcome: Record<string, unknown>): void {\n const value = outcome.retryAfterMs;\n if (\n value !== undefined &&\n (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)\n ) {\n malformedApplyEventOutcome('retryAfterMs must be a non-negative safe integer');\n }\n}\n\nfunction parseSuccessEntity<T>(\n outcome: Record<string, unknown>,\n key: 'event' | 'run' | 'replayRun' | 'step' | 'hook' | 'wait' | 'hookToIndex',\n schema: {\n safeParse(value: unknown): { success: true; data: T } | { success: false };\n },\n): T | undefined {\n const value = outcome[key];\n if (value === undefined) return undefined;\n if (!isRecord(value)) malformedApplyEventOutcome(`${key} is invalid`);\n const result = schema.safeParse(compact(value));\n if (!result.success) malformedApplyEventOutcome(`${key} is invalid`);\n return result.data;\n}\n\n/**\n * Validate the untrusted value decoded from the remote applyEvent RPC.\n * Unknown failure codes are intentionally valid and classified separately so\n * an older client can reconstruct their wire metadata without treating them\n * as success. All fields consumed by the success path are checked before any\n * derivative index operation can run.\n */\nfunction parseApplyEventOutcome(value: unknown): ParsedApplyEventOutcome {\n if (!isRecord(value)) malformedApplyEventOutcome('response must be an object');\n\n if (value.ok === false) {\n if (typeof value.code !== 'string' || value.code.length === 0) {\n malformedApplyEventOutcome('failure code must be a non-empty string');\n }\n if (typeof value.message !== 'string') {\n malformedApplyEventOutcome('failure message must be a string');\n }\n validateOptionalNumber(value, 'status', true);\n validateOptionalNumber(value, 'retryAfter', false);\n validateOptionalRetryAfterMs(value);\n validateOptionalNumber(value, 'retryAfterSeconds', false);\n validateOptionalNumber(value, 'runSpecVersion', true);\n validateOptionalNumber(value, 'worldSpecVersion', true);\n\n const outcome = value as unknown as ApplyEventWireFailure;\n return APPLY_EVENT_ERROR_CODES.has(outcome.code)\n ? {\n kind: 'known-failure',\n outcome: outcome as ApplyEventFailure & ApplyEventWireFailure,\n }\n : { kind: 'unknown-failure', outcome };\n }\n\n if (value.ok !== true) malformedApplyEventOutcome('ok must be true or false');\n if (!Array.isArray(value.releasedHooks)) {\n malformedApplyEventOutcome('releasedHooks must be an array');\n }\n for (const releasedHook of value.releasedHooks) {\n if (\n !isRecord(releasedHook) ||\n typeof releasedHook.hookId !== 'string' ||\n releasedHook.hookId.length === 0 ||\n typeof releasedHook.token !== 'string' ||\n releasedHook.token.length === 0\n ) {\n malformedApplyEventOutcome('releasedHooks entries must contain hookId and token strings');\n }\n }\n\n const event = parseSuccessEntity(value, 'event', EventSchema);\n const run = parseSuccessEntity(value, 'run', WorkflowRunSchema);\n const replayRun = parseSuccessEntity(value, 'replayRun', WorkflowRunSchema);\n const step = parseSuccessEntity(value, 'step', StepSchema);\n const hook = parseSuccessEntity(value, 'hook', HookSchema);\n const wait = parseSuccessEntity(value, 'wait', WaitSchema);\n const hookToIndex = parseSuccessEntity(value, 'hookToIndex', HookSchema);\n\n if (value.stepCreated !== undefined && value.stepCreated !== true) {\n malformedApplyEventOutcome('stepCreated must be true when present');\n }\n if (value.runCreated !== undefined) {\n if (\n !isRecord(value.runCreated) ||\n typeof value.runCreated.workflowName !== 'string' ||\n !(value.runCreated.createdAt instanceof Date) ||\n Number.isNaN(value.runCreated.createdAt.getTime())\n ) {\n malformedApplyEventOutcome('runCreated is invalid');\n }\n }\n let events: Event[] | undefined;\n if (value.events !== undefined) {\n if (!Array.isArray(value.events)) malformedApplyEventOutcome('events must be an array');\n events = value.events.map((candidate) => {\n if (!isRecord(candidate)) malformedApplyEventOutcome('events contains an invalid event');\n const result = EventSchema.safeParse(compact(candidate));\n if (!result.success) {\n malformedApplyEventOutcome('events contains an invalid event');\n }\n return result.data;\n });\n if (value.cursor !== null && typeof value.cursor !== 'string') {\n malformedApplyEventOutcome('cursor is required when events are present');\n }\n if (typeof value.hasMore !== 'boolean') {\n malformedApplyEventOutcome('hasMore is required when events are present');\n }\n }\n if (value.cursor !== undefined && value.cursor !== null && typeof value.cursor !== 'string') {\n malformedApplyEventOutcome('cursor must be a string or null');\n }\n if (value.hasMore !== undefined && typeof value.hasMore !== 'boolean') {\n malformedApplyEventOutcome('hasMore must be a boolean');\n }\n if (\n value.maxEvents !== undefined &&\n (typeof value.maxEvents !== 'number' ||\n !Number.isSafeInteger(value.maxEvents) ||\n value.maxEvents < 0)\n ) {\n malformedApplyEventOutcome('maxEvents must be a non-negative safe integer');\n }\n for (const flag of ['runIndexPublished', 'hookIndexesReleased'] as const) {\n if (value[flag] !== undefined && value[flag] !== true) {\n malformedApplyEventOutcome(`${flag} must be true when present`);\n }\n }\n if (run !== undefined && value.indexPublicationExpiresAt === undefined) {\n malformedApplyEventOutcome('indexPublicationExpiresAt is required when run is present');\n }\n if (\n value.indexPublicationExpiresAt !== undefined &&\n (typeof value.indexPublicationExpiresAt !== 'number' ||\n !Number.isFinite(value.indexPublicationExpiresAt))\n ) {\n malformedApplyEventOutcome('indexPublicationExpiresAt must be a finite number');\n }\n\n return {\n kind: 'success',\n outcome: {\n ...value,\n event,\n run,\n replayRun,\n step,\n hook,\n wait,\n hookToIndex,\n events,\n releasedHooks: value.releasedHooks.map((releasedHook) => ({\n hookId: (releasedHook as Record<string, unknown>).hookId as string,\n token: (releasedHook as Record<string, unknown>).token as string,\n })),\n } as ApplyEventSuccess,\n };\n}\n\n/**\n * Filter data based on ResolveData parameter.\n * When resolveData is 'none', strips specified keys to reduce data transfer.\n */\nfunction filterData<T extends object>(\n data: T,\n resolveData: ResolveData | undefined,\n keysToStrip: (keyof T)[],\n): T {\n if (resolveData === 'none') {\n const newData = { ...data };\n for (const key of keysToStrip) {\n if (key in newData) {\n delete newData[key];\n }\n }\n return newData;\n }\n return data;\n}\n\n/**\n * Filter hook data based on resolveData parameter\n */\nfunction filterHookData(hook: Hook, resolveData: ResolveData): Hook {\n if (resolveData === 'none' && 'metadata' in hook) {\n const { metadata: _, ...rest } = hook;\n return { metadata: undefined, ...rest };\n }\n return hook;\n}\n\n/**\n * Convert a structured applyEvent failure back into the typed error the\n * runtime matches on (via error-name based `.is()` checks). Typed errors\n * cannot cross the DO RPC boundary intact, which is why the DO returns\n * outcome objects instead of throwing.\n */\nfunction throwOutcomeError(\n outcome: ApplyEventWireFailure,\n runId: string,\n data: CreateEventRequest | RunCreatedEventRequest,\n): never {\n const withCode = <T extends Error>(error: T): T => {\n Object.assign(error, { code: outcome.code });\n return error;\n };\n\n switch (outcome.code) {\n case 'RUN_NOT_FOUND':\n throw withCode(new WorkflowRunNotFoundError(runId));\n case 'STEP_NOT_FOUND':\n throw new WorkflowWorldError(outcome.message, { status: 404, code: outcome.code });\n case 'HOOK_NOT_FOUND':\n throw withCode(new HookNotFoundError(data.correlationId ?? runId));\n case 'WAIT_NOT_FOUND':\n throw new WorkflowWorldError(outcome.message, { status: 404, code: outcome.code });\n case 'ENTITY_CONFLICT':\n throw withCode(new EntityConflictError(outcome.message));\n case 'HOOK_CLAIM_CANCELLED':\n throw new WorkflowWorldError(outcome.message, { status: 503, code: outcome.code });\n case 'RUN_EXPIRED':\n throw withCode(new RunExpiredError(outcome.message));\n case 'TOO_EARLY':\n throw withCode(new TooEarlyError(outcome.message, { retryAfter: outcome.retryAfterSeconds }));\n case 'RUN_NOT_SUPPORTED':\n throw withCode(new RunNotSupportedError(outcome.runSpecVersion ?? 0, SPEC_VERSION_CURRENT));\n default: {\n const error = new WorkflowWorldError(outcome.message, {\n status: outcome.status,\n code: outcome.code,\n retryAfter: outcome.retryAfter,\n });\n for (const key of [\n 'retryAfterMs',\n 'retryAfterSeconds',\n 'runSpecVersion',\n 'worldSpecVersion',\n 'details',\n ] as const) {\n if (Object.hasOwn(outcome, key)) Object.assign(error, { [key]: outcome[key] });\n }\n throw error;\n }\n }\n}\n\nconst parseRun = (run: WorkflowRun): WorkflowRun => WorkflowRunSchema.parse(compact(run));\nconst parseStep = (step: Step): Step => StepSchema.parse(compact(step));\nconst parseHook = (hook: Hook): Hook => HookSchema.parse(compact(hook));\nconst parseEvent = (event: Event): Event => EventSchema.parse(compact(event));\n\nfunction unwrapRead<T>(outcome: RunReadOutcome<T>): T {\n if (!outcome.ok) {\n throw new RunExpiredError(outcome.message);\n }\n return outcome.value;\n}\n\nexport function createStorage(config: CloudflareStorageConfig): Storage {\n const { env } = config;\n const cleanup = {\n retentionMs: config.runRetentionMs ?? 0,\n };\n const ulid = monotonicFactory();\n\n // Helper to get or create a DO for a run\n const getRunDO = (runId: string): WorkflowRunDOStub => {\n const id = env.WORKFLOW_DB.idFromName(runId);\n return env.WORKFLOW_DB.get(id);\n };\n\n const runsGet = async (\n runId: string,\n params?: GetWorkflowRunParams,\n ): Promise<WorkflowRun | WorkflowRunWithoutData> => {\n const stub = getRunDO(runId);\n const run = unwrapRead(await stub.getRun());\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return filterData(parseRun(run), params?.resolveData, ['input', 'output']);\n };\n\n return {\n runs: {\n get: runsGet,\n\n async list(\n params?: ListWorkflowRunsParams,\n ): Promise<PaginatedResponse<WorkflowRun | WorkflowRunWithoutData>> {\n const request: RunListRequest = {\n workflowName: params?.workflowName,\n statuses:\n params?.status === undefined\n ? undefined\n : Array.isArray(params.status)\n ? params.status\n : [params.status],\n limit: params?.pagination?.limit ?? 20,\n cursor: params?.pagination?.cursor,\n sortOrder: params?.pagination?.sortOrder,\n resolveData: params?.resolveData,\n };\n\n // One fleet round trip when the worker lists inside the fleet.\n const fleetPage =\n Number.isSafeInteger(request.limit) &&\n request.limit >= 1 &&\n request.limit <= MAX_RUN_LIST_LIMIT\n ? await env.WORKFLOW_INDEX.listResolvedRuns?.(compact(request))\n : undefined;\n if (fleetPage) {\n return {\n data: fleetPage.data.map((run) =>\n filterData(parseRun(run), params?.resolveData, ['input', 'output']),\n ),\n cursor: fleetPage.cursor,\n hasMore: fleetPage.hasMore,\n };\n }\n\n return await listRunsPage(\n {\n listRuns: (options) => env.WORKFLOW_INDEX.listRuns(options),\n readRun: async (runId) => {\n try {\n return (await runsGet(runId)) as WorkflowRun;\n } catch (error) {\n if (WorkflowRunNotFoundError.is(error) || RunExpiredError.is(error)) return null;\n throw error;\n }\n },\n },\n request,\n );\n },\n } as Storage['runs'],\n\n events: {\n async create(\n runId: string | null,\n data: RunCreatedEventRequest | CreateEventRequest,\n params?: CreateEventParams,\n ): Promise<EventResult> {\n // Parse the public runtime value before run routing or hook admission.\n // The canonical Workflow schema strips unknown fields and rejects bad\n // discriminants/missing/wrong-typed fields without any external side\n // effects.\n data = CreateEventSchema.parse(compact(data));\n if (runId !== null && typeof runId !== 'string') {\n throw new WorkflowWorldError('runId must be a string or null', { status: 400 });\n }\n\n // For run_created events, generate a runId server-side if absent.\n let effectiveRunId: string;\n if (data.eventType === 'run_created' && (!runId || runId === '')) {\n effectiveRunId = `wrun_${ulid()}`;\n } else if (!runId) {\n throw new WorkflowWorldError('runId is required for non-run_created events', {\n status: 400,\n });\n } else {\n effectiveRunId = runId;\n }\n\n const stub = getRunDO(effectiveRunId);\n\n let tokenHolder: ApplyEventRequest['tokenHolder'];\n let hookAdmission:\n | { owner: HookTokenOwner; reservation: HookReservation; token: string }\n | undefined;\n if (data.eventType === 'hook_created') {\n const owner = {\n runId: effectiveRunId,\n hookId: data.correlationId,\n };\n const admission = await env.WORKFLOW_INDEX.reserveHook(data.eventData.token, owner);\n if (admission.admitted) {\n tokenHolder = null;\n hookAdmission = {\n owner,\n reservation: admission.reservation,\n token: data.eventData.token,\n };\n } else {\n tokenHolder = admission.holder;\n }\n }\n\n // Guards, event append, and entity mutation run in ONE DO storage\n // transaction (see apply-event.ts). The event is schema-validated\n // before anything is persisted.\n // A thrown RPC is commit-ambiguous. Resolve it inside the authoritative\n // RunDO: that transaction either observes the committed hook or fences\n // this exact reservation before its token/ID claims are released.\n let parsedOutcome: ParsedApplyEventOutcome;\n try {\n const wireOutcome: unknown = await stub.applyEvent({\n runId: effectiveRunId,\n data,\n params,\n tokenHolder,\n hookClaimId: hookAdmission?.reservation.claimId,\n cleanup,\n });\n parsedOutcome = parseApplyEventOutcome(wireOutcome);\n } catch (error) {\n if (hookAdmission) {\n let resolution: { committed: boolean };\n try {\n resolution = await stub.resolveHookTokenClaim({\n hookId: hookAdmission.owner.hookId,\n token: hookAdmission.token,\n claimId: hookAdmission.reservation.claimId,\n });\n } catch {\n // Resolution is itself ambiguous, so fail closed and leave both\n // claims for an exact same-reservation retry.\n throw error;\n }\n if (!resolution.committed) {\n await env.WORKFLOW_INDEX.releaseHookReservation(\n hookAdmission.token,\n hookAdmission.owner,\n hookAdmission.reservation,\n );\n }\n }\n throw error;\n }\n\n if (parsedOutcome.kind !== 'success') {\n if (hookAdmission) {\n await env.WORKFLOW_INDEX.releaseHookReservation(\n hookAdmission.token,\n hookAdmission.owner,\n hookAdmission.reservation,\n );\n }\n throwOutcomeError(parsedOutcome.outcome, effectiveRunId, data);\n }\n const outcome = parsedOutcome.outcome;\n\n // Derived indexes are deliberately rewritten on idempotent replay so\n // a committed run or hook can repair an interrupted index update.\n // The worker router publishes both inside the fleet when it can and\n // says so; otherwise (older workers, or a failed in-fleet write) the\n // client publishes them here.\n if (outcome.run && !outcome.runIndexPublished) {\n if (outcome.indexPublicationExpiresAt === undefined) {\n throw new Error('world-celld: authoritative run mutation omitted its index lease');\n }\n await env.WORKFLOW_INDEX.commitRun(\n outcome.run,\n runIndexMetadata({ ...outcome.run, runId: effectiveRunId }),\n outcome.indexPublicationExpiresAt,\n );\n }\n if (outcome.hookToIndex) {\n const serialized = stringify(outcome.hookToIndex);\n await env.WORKFLOW_INDEX.finalizeHookIndexes(\n outcome.hookToIndex.token,\n outcome.hookToIndex.hookId,\n serialized,\n hookOwner(outcome.hookToIndex),\n hookAdmission?.reservation,\n );\n } else if (hookAdmission) {\n await env.WORKFLOW_INDEX.releaseHookReservation(\n hookAdmission.token,\n hookAdmission.owner,\n hookAdmission.reservation,\n );\n }\n if (outcome.releasedHooks.length > 0 && !outcome.hookIndexesReleased) {\n await env.WORKFLOW_INDEX.releaseHookIndexes({\n runId: effectiveRunId,\n hooks: outcome.releasedHooks,\n });\n }\n\n const eventPage =\n outcome.events === undefined\n ? {}\n : {\n events: outcome.events,\n cursor: outcome.cursor ?? null,\n hasMore: outcome.hasMore ?? false,\n };\n return {\n event: outcome.event,\n // A hook_received replay preload returns the run unchanged, so it\n // is not published to the run catalog above.\n run: outcome.run ?? outcome.replayRun,\n step: outcome.step,\n hook: outcome.hook,\n wait: outcome.wait,\n stepCreated: outcome.stepCreated,\n maxEvents: outcome.maxEvents,\n ...eventPage,\n };\n },\n\n async get(runId: string, eventId: string, _params?: GetEventParams): Promise<Event> {\n const stub = getRunDO(runId);\n const event = unwrapRead(await stub.getEvent(eventId));\n\n if (!event) {\n throw new WorkflowWorldError(`Event not found: ${eventId}`, {\n status: 404,\n });\n }\n\n return parseEvent(event);\n },\n\n async list(params: ListEventsParams): Promise<PaginatedResponse<Event>> {\n const { runId } = params;\n const limit = params?.pagination?.limit ?? 100;\n\n const stub = getRunDO(runId);\n const result = unwrapRead(\n await stub.listEvents({\n limit,\n cursor: params?.pagination?.cursor || undefined,\n sortOrder: params.pagination?.sortOrder || 'asc',\n }),\n );\n\n return {\n data: result.data.map(parseEvent),\n cursor: result.cursor,\n hasMore: result.hasMore,\n };\n },\n\n async listByCorrelationId(params) {\n const limit = params.pagination?.limit ?? 100;\n const stub = getRunDO(params.runId);\n const matches: Event[] = [];\n let scanCursor = params.pagination?.cursor;\n let exhausted = false;\n\n // Workflow 5 scopes correlation IDs to a run. Scan that run's dense\n // event log rather than the global derived index so identical step or\n // wait IDs in different runs can never leak into this result.\n while (matches.length <= limit && !exhausted) {\n const page = unwrapRead(\n await stub.listEvents({\n limit: Math.min(1000, Math.max(50, limit + 1)),\n cursor: scanCursor,\n sortOrder: params.pagination?.sortOrder ?? 'asc',\n }),\n );\n for (const event of page.data) {\n if (event.correlationId === params.correlationId) {\n matches.push(event);\n if (matches.length > limit) break;\n }\n }\n exhausted = !page.hasMore;\n scanCursor = page.cursor ?? page.data.at(-1)?.eventId;\n if (page.data.length === 0) exhausted = true;\n }\n\n const hasMore = matches.length > limit;\n const data = matches.slice(0, limit);\n return {\n data: data.map(parseEvent),\n cursor: hasMore ? (data.at(-1)?.eventId ?? null) : null,\n hasMore,\n };\n },\n },\n\n steps: {\n async get(runId: string | undefined, stepId: string, params?: GetStepParams) {\n if (!runId) {\n throw new WorkflowWorldError('runId is required for Cloudflare step lookup', {\n status: 400,\n });\n }\n const stub = getRunDO(runId);\n const step = unwrapRead(await stub.getStep(stepId));\n\n if (!step) {\n throw new WorkflowWorldError(`Step not found: ${stepId}`, {\n status: 404,\n });\n }\n\n return filterData(parseStep(step), params?.resolveData, ['input', 'output']);\n },\n\n async list(\n params: ListWorkflowRunStepsParams,\n ): Promise<PaginatedResponse<Step | StepWithoutData>> {\n const { runId } = params;\n const limit = params?.pagination?.limit ?? 20;\n\n const stub = getRunDO(runId);\n const result = unwrapRead(\n await stub.listSteps({\n limit,\n cursor: params?.pagination?.cursor || undefined,\n sortOrder: params?.pagination?.sortOrder ?? 'asc',\n }),\n );\n\n return {\n data: result.data.map((s) =>\n filterData(parseStep(s), params?.resolveData, ['input', 'output']),\n ),\n cursor: result.cursor,\n hasMore: result.hasMore,\n };\n },\n } as Storage['steps'],\n\n hooks: {\n async get(hookId: string, params?: GetHookParams) {\n const raw = await env.WORKFLOW_INDEX.getHookById(hookId);\n\n if (!raw) {\n throw new HookNotFoundError(hookId);\n }\n\n const hook = parseHook(parse<Hook>(raw));\n return filterHookData(hook, params?.resolveData ?? 'all');\n },\n\n async getByToken(token: string, params?: GetHookParams) {\n const raw = await env.WORKFLOW_INDEX.getHookByToken(token);\n\n if (!raw) {\n throw new HookNotFoundError(token);\n }\n\n const hook = parseHook(parse<Hook>(raw));\n return filterHookData(hook, params?.resolveData ?? 'all');\n },\n\n async list(params: ListHooksParams): Promise<PaginatedResponse<Hook>> {\n if (!params.runId) {\n throw new WorkflowWorldError('runId is required for listing hooks', {\n status: 400,\n });\n }\n const runId = params.runId;\n const limit = params?.pagination?.limit ?? 100;\n\n const stub = getRunDO(runId);\n const result = unwrapRead(\n await stub.listHooks({\n limit,\n cursor: params?.pagination?.cursor || undefined,\n sortOrder: params?.pagination?.sortOrder ?? 'asc',\n }),\n );\n\n return {\n data: result.data.map((h) => filterHookData(parseHook(h), params?.resolveData ?? 'all')),\n cursor: result.cursor,\n hasMore: result.hasMore,\n };\n },\n },\n };\n}\n","import type {\n GetChunksOptions,\n StreamChunk,\n StreamChunksResponse,\n StreamInfoResponse,\n Streamer,\n} from '@workflow/world';\nimport type {\n ExpireRunStreamsResult,\n ExpireStreamResult,\n FinalizeRunStreamsResult,\n} from './retention.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n MAX_STREAM_WRITE_CHUNKS,\n isChunkLimitRejection,\n normalizeStreamError,\n type StreamErrorData,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamWriteResult,\n} from './stream-protocol.js';\n\nexport interface CelldStreamerConfig {\n env: {\n WORKFLOW_STREAMS: StreamDONamespace;\n };\n /** Duration of one bounded idle read. Default: 20000. */\n streamLongPollMs?: number;\n /** Runtime coalescing delay for streams.writeMulti(). Default: 0. */\n streamFlushIntervalMs?: number;\n}\n\nexport interface CelldStreamer extends Omit<Streamer, 'streams'> {\n streams: Streamer['streams'] & {\n fail(runId: string, name: string, error: StreamErrorData | string): Promise<void>;\n };\n writeToStream(\n name: string,\n runId: string | Promise<string>,\n chunk: string | Uint8Array,\n ): Promise<void>;\n writeChunksToStream(\n name: string,\n runId: string | Promise<string>,\n chunks: readonly (string | Uint8Array)[],\n ): Promise<void>;\n closeStream(name: string, runId: string | Promise<string>): Promise<void>;\n errorStream(\n name: string,\n runId: string | Promise<string>,\n error: StreamErrorData | string,\n ): Promise<void>;\n readFromStream(\n name: string,\n runId: string,\n startIndex?: number,\n ): Promise<ReadableStream<Uint8Array>>;\n listStreamsByRunId(runId: string): Promise<string[]>;\n getStreamChunks(\n name: string,\n runId: string,\n options?: GetChunksOptions,\n ): Promise<StreamChunksResponse>;\n getStreamInfo(name: string, runId: string): Promise<StreamInfoResponse>;\n}\n\n/** Direct StreamDO RPC surface. Remote stubs specialize read/write as binary HTTP. */\nexport interface StreamDOStub {\n /**\n * Remote stubs only: the per-request chunk limit the fleet has advertised.\n * Stubs without it are held to the baseline every worker accepts.\n */\n streamChunkLimit?(): number;\n /** Remote stubs only: drop an advertised limit an older worker rejected. */\n resetStreamChunkLimit?(): void;\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n closeStream(runId: string): Promise<void>;\n failStream(runId: string, error: StreamErrorData | string): Promise<void>;\n registerStream(runId: string, name: string): Promise<void>;\n listStreams(): Promise<string[]>;\n expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult>;\n finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult>;\n expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult>;\n}\n\nexport interface StreamDONamespace {\n idFromName(name: string): StreamDOId;\n get(id: StreamDOId): StreamDOStub;\n}\n\nexport interface StreamDOId {\n toString(): string;\n}\n\nconst DEFAULT_LONG_POLL_MS = MAX_STREAM_LONG_POLL_MS;\nconst DEFAULT_CHUNK_PAGE_SIZE = MAX_STREAM_READ_CHUNKS;\nconst MAX_CHUNK_PAGE_SIZE = MAX_STREAM_READ_CHUNKS;\nconst REGISTERED_STREAM_CACHE_SIZE = 4096;\n\nfunction toBytes(chunk: string | Uint8Array): Uint8Array {\n return typeof chunk === 'string' ? new TextEncoder().encode(chunk) : chunk;\n}\n\nfunction throwTerminal(result: StreamReadResult): void {\n if (result.state === 'expired') throw new Error('Stream has expired');\n if (result.state === 'errored') {\n const error = new Error(result.error?.message ?? 'Stream failed');\n error.name = result.error?.name ?? 'Error';\n throw error;\n }\n}\n\nexport function createStreamer(config: CelldStreamerConfig): CelldStreamer {\n const { env } = config;\n const streamLongPollMs = config.streamLongPollMs ?? DEFAULT_LONG_POLL_MS;\n if (\n !Number.isSafeInteger(streamLongPollMs) ||\n streamLongPollMs < 1 ||\n streamLongPollMs > MAX_STREAM_LONG_POLL_MS\n ) {\n throw new Error(`streamLongPollMs must be between 1 and ${MAX_STREAM_LONG_POLL_MS}`);\n }\n const streamFlushIntervalMs = config.streamFlushIntervalMs ?? 0;\n if (!Number.isSafeInteger(streamFlushIntervalMs) || streamFlushIntervalMs < 0) {\n throw new Error('streamFlushIntervalMs must be a non-negative safe integer');\n }\n\n const getStreamDO = (streamName: string): StreamDOStub => {\n const id = env.WORKFLOW_STREAMS.idFromName(`stream:${streamName}`);\n return env.WORKFLOW_STREAMS.get(id);\n };\n\n const getRunRegistryDO = (runId: string): StreamDOStub => {\n const id = env.WORKFLOW_STREAMS.idFromName(`run-streams:${runId}`);\n return env.WORKFLOW_STREAMS.get(id);\n };\n\n /** Bounded per-isolate cache; eviction only repeats idempotent registration. */\n const registeredStreams = new Set<string>();\n\n async function registerStreamForRun(name: string, runId: string): Promise<void> {\n const cacheKey = `${runId}\\0${name}`;\n if (registeredStreams.has(cacheKey)) return;\n await getRunRegistryDO(runId).registerStream(runId, name);\n if (registeredStreams.size >= REGISTERED_STREAM_CACHE_SIZE) {\n const oldest = registeredStreams.values().next().value;\n if (oldest !== undefined) registeredStreams.delete(oldest);\n }\n registeredStreams.add(cacheKey);\n }\n\n const writeChunksToStream = async (\n name: string,\n runId: string | Promise<string>,\n input: readonly (string | Uint8Array)[],\n ): Promise<void> => {\n if (input.length === 0) return;\n const resolvedRunId = await runId;\n const chunks = input.map(toBytes);\n for (const chunk of chunks) {\n if (chunk.byteLength > MAX_STREAM_CHUNK_BYTES) {\n throw new Error(`Stream chunk exceeds ${MAX_STREAM_CHUNK_BYTES} bytes`);\n }\n }\n await registerStreamForRun(name, resolvedRunId);\n\n const stub = getStreamDO(name);\n let next = 0;\n while (next < chunks.length) {\n // Re-read per batch: the first response may advertise a larger limit.\n const chunkLimit = stub.streamChunkLimit?.() ?? MAX_STREAM_WRITE_CHUNKS;\n let end = next;\n let batchBytes = 0;\n while (\n end < chunks.length &&\n end - next < chunkLimit &&\n (end === next || batchBytes + chunks[end].byteLength <= MAX_STREAM_BATCH_BYTES)\n ) {\n batchBytes += chunks[end].byteLength;\n end++;\n }\n const batch = chunks.slice(next, end);\n try {\n await stub.writeChunks(resolvedRunId, batch);\n } catch (error) {\n // An older worker rejects the batch before writing anything.\n if (batch.length > MAX_STREAM_WRITE_CHUNKS && isChunkLimitRejection(error)) {\n stub.resetStreamChunkLimit?.();\n continue;\n }\n throw error;\n }\n next = end;\n }\n };\n\n const writeToStream = (\n name: string,\n runId: string | Promise<string>,\n chunk: string | Uint8Array,\n ): Promise<void> => writeChunksToStream(name, runId, [chunk]);\n\n const closeStream = async (name: string, runId: string | Promise<string>): Promise<void> => {\n const resolvedRunId = await runId;\n await registerStreamForRun(name, resolvedRunId);\n await getStreamDO(name).closeStream(resolvedRunId);\n };\n\n const errorStream = async (\n name: string,\n runId: string | Promise<string>,\n error: StreamErrorData | string,\n ): Promise<void> => {\n const resolvedRunId = await runId;\n await registerStreamForRun(name, resolvedRunId);\n await getStreamDO(name).failStream(resolvedRunId, normalizeStreamError(error));\n };\n\n const readFromStream = async (\n name: string,\n runId: string,\n startIndex = 0,\n ): Promise<ReadableStream<Uint8Array>> => {\n const stub = getStreamDO(name);\n\n let nextIndex: number;\n if (startIndex < 0) {\n const info = await stub.readChunks({\n runId,\n startIndex: 0,\n maxChunks: 0,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: 0,\n });\n throwTerminal(info);\n nextIndex = Math.max(0, info.tailIndex + 1 + startIndex);\n } else {\n nextIndex = startIndex;\n }\n\n let cancelled = false;\n const abortController = new AbortController();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n for (;;) {\n if (cancelled) return;\n let result: StreamReadResult;\n try {\n result = await stub.readChunks(\n {\n runId,\n startIndex: nextIndex,\n maxChunks: stub.streamChunkLimit?.() ?? MAX_STREAM_READ_CHUNKS,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: streamLongPollMs,\n },\n abortController.signal,\n );\n } catch (error) {\n if (cancelled || abortController.signal.aborted) return;\n throw error;\n }\n\n if (result.chunks.length > 0) {\n for (const chunk of result.chunks) controller.enqueue(chunk);\n nextIndex += result.chunks.length;\n return;\n }\n throwTerminal(result);\n if (result.state === 'closed') {\n controller.close();\n return;\n }\n // A normal long-poll timeout returns no data; keep the pending\n // ReadableStream read attached through the next bounded request.\n }\n },\n\n cancel() {\n cancelled = true;\n abortController.abort(new DOMException('Stream reader cancelled', 'AbortError'));\n },\n });\n };\n\n const listStreamsByRunId = (runId: string): Promise<string[]> =>\n getRunRegistryDO(runId).listStreams();\n\n const getStreamChunks = async (\n name: string,\n runId: string,\n options?: GetChunksOptions,\n ): Promise<StreamChunksResponse> => {\n const requestedLimit = options?.limit ?? DEFAULT_CHUNK_PAGE_SIZE;\n if (!Number.isSafeInteger(requestedLimit) || requestedLimit < 1) {\n throw new Error('Stream chunk limit must be a positive safe integer');\n }\n const stub = getStreamDO(name);\n const limit = Math.min(requestedLimit, stub.streamChunkLimit?.() ?? MAX_CHUNK_PAGE_SIZE);\n const startIndex = options?.cursor ? Number.parseInt(options.cursor, 10) : 0;\n if (Number.isNaN(startIndex) || startIndex < 0) {\n throw new Error(`Invalid stream cursor: ${options?.cursor}`);\n }\n\n const result = await stub.readChunks({\n runId,\n startIndex,\n maxChunks: limit,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: 0,\n });\n throwTerminal(result);\n const data: StreamChunk[] = result.chunks.map((chunk, offset) => ({\n index: startIndex + offset,\n data: chunk,\n }));\n const nextIndex = startIndex + data.length;\n const hasMore = nextIndex <= result.tailIndex;\n\n return {\n data,\n cursor: hasMore ? String(nextIndex) : null,\n hasMore,\n done: result.state === 'closed',\n };\n };\n\n const getStreamInfo = async (name: string, runId: string): Promise<StreamInfoResponse> => {\n const result = await getStreamDO(name).readChunks({\n runId,\n startIndex: 0,\n maxChunks: 0,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: 0,\n });\n throwTerminal(result);\n return { tailIndex: result.tailIndex, done: result.state === 'closed' };\n };\n\n return {\n streamFlushIntervalMs,\n streams: {\n write: (runId, name, chunk) => writeToStream(name, runId, chunk),\n writeMulti: (runId, name, chunks) => writeChunksToStream(name, runId, chunks),\n close: (runId, name) => closeStream(name, runId),\n fail: (runId, name, error) => errorStream(name, runId, error),\n get: (runId, name, startIndex) => readFromStream(name, runId, startIndex),\n list: listStreamsByRunId,\n getChunks: (runId, name, options) => getStreamChunks(name, runId, options),\n getInfo: (runId, name) => getStreamInfo(name, runId),\n },\n writeToStream,\n writeChunksToStream,\n closeStream,\n errorStream,\n readFromStream,\n listStreamsByRunId,\n getStreamChunks,\n getStreamInfo,\n };\n}\n","/**\n * @ewhauser/world-celld — celld World implementation for the Vercel Workflow\n * DevKit. Modeled on vinnymac/worlds packages/world-cloudflare/src/index.ts\n * (Apache-2.0, see NOTICE).\n */\nimport { SPEC_VERSION_CURRENT, type World } from '@workflow/world';\nimport { type CelldWorldConfig, type CelldWorldEnv, resolveConfig } from './config.js';\nimport { createRemoteEnv } from './remote/namespaces.js';\nimport { createQueue } from './queue.js';\nimport { createStorage } from './storage.js';\nimport { createStreamer, type CelldStreamer } from './streamer.js';\nimport type { CleanupRecord } from './retention.js';\n\nexport type { CelldWorldConfig, CelldWorldEnv, IndexNamespace } from './config.js';\nexport type { CelldQueueProducer } from './queue.js';\nexport type {\n NativeQueueEnvelope,\n NativeQueueSendOptions,\n NativeQueueSendResult,\n} from './queue-protocol.js';\nexport type { WorkflowRunDONamespace, WorkflowRunDOStub } from './storage.js';\nexport type { StreamDONamespace, StreamDOStub } from './streamer.js';\nexport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_ERROR_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n MAX_STREAM_WRITE_CHUNKS,\n} from './stream-protocol.js';\nexport type {\n StreamErrorData,\n StreamReadRequest,\n StreamReadResult,\n StreamTerminalState,\n StreamWriteResult,\n} from './stream-protocol.js';\nexport type { CleanupPhase, CleanupRecord, RunTombstone } from './retention.js';\n\nexport interface CelldRetentionAdmin {\n getStatus(runId: string): Promise<CleanupRecord | null>;\n schedule(runId: string): Promise<CleanupRecord | null>;\n cleanupNow(runId: string): Promise<CleanupRecord | null>;\n rearm(runId: string): Promise<CleanupRecord | null>;\n}\n\nexport type CelldWorld = World & CelldStreamer & { retention: CelldRetentionAdmin };\n\nconst REQUIRED_ENV_BINDINGS = [\n 'WORKFLOW_DB',\n 'WORKFLOW_INDEX',\n 'WORKFLOW_QUEUE',\n 'WORKFLOW_STREAMS',\n] as const satisfies readonly (keyof CelldWorldEnv)[];\n\nexport function createCelldWorld(config?: CelldWorldConfig): CelldWorld {\n const resolved = resolveConfig(config);\n\n // Check for global test environment first (for @workflow/world-testing)\n let env = resolved.env;\n if (!env) {\n const globalEnv = (globalThis as { CELLD_ENV?: CelldWorldEnv }).CELLD_ENV;\n if (globalEnv) {\n env = globalEnv;\n }\n }\n\n if (!env) {\n if (resolved.fleetUrl) {\n if (!resolved.secret) {\n throw new Error(\n 'world-celld: config.secret (or CELLD_WORLD_SECRET) is required with fleetUrl',\n );\n }\n env = createRemoteEnv({\n fleetUrl: resolved.fleetUrl,\n secret: resolved.secret,\n timeoutMs: resolved.rpcTimeoutMs,\n });\n }\n }\n\n if (!env) {\n throw new Error(\n 'celld environment not configured. Provide config.fleetUrl + config.secret ' +\n '(or CELLD_FLEET_URL / CELLD_WORLD_SECRET), or pass config.env with ' +\n 'WORKFLOW_DB, WORKFLOW_INDEX, WORKFLOW_QUEUE, WORKFLOW_STREAMS',\n );\n }\n\n for (const binding of REQUIRED_ENV_BINDINGS) {\n if (!env[binding]) {\n throw new Error(`world-celld: config.env is missing required binding ${binding}`);\n }\n }\n\n const storage = createStorage({\n env: {\n WORKFLOW_DB: env.WORKFLOW_DB,\n WORKFLOW_INDEX: env.WORKFLOW_INDEX,\n },\n deploymentId: resolved.deploymentId,\n runRetentionMs: resolved.runRetentionMs,\n });\n\n const queue = createQueue({\n env: {\n WORKFLOW_QUEUE: env.WORKFLOW_QUEUE,\n },\n deploymentId: resolved.deploymentId,\n baseUrl: resolved.baseUrl,\n });\n\n const streamer = createStreamer({\n env: {\n WORKFLOW_STREAMS: env.WORKFLOW_STREAMS,\n },\n streamLongPollMs: resolved.streamLongPollMs,\n streamFlushIntervalMs: resolved.streamFlushIntervalMs,\n });\n\n const runStub = (runId: string) => env.WORKFLOW_DB.get(env.WORKFLOW_DB.idFromName(runId));\n const retention: CelldRetentionAdmin = {\n getStatus: (runId) => runStub(runId).getCleanupStatus(),\n schedule: (runId) => {\n if (resolved.runRetentionMs === 0) {\n throw new Error(\n 'world-celld: runRetentionMs must be greater than zero to schedule cleanup',\n );\n }\n return runStub(runId).scheduleCleanup({\n retentionMs: resolved.runRetentionMs,\n });\n },\n cleanupNow: (runId) =>\n runStub(runId).cleanupNow({\n retentionMs: Math.max(1, resolved.runRetentionMs),\n }),\n rearm: (runId) => runStub(runId).rearmCleanup(),\n };\n\n return {\n ...storage,\n ...queue,\n ...streamer,\n retention,\n // Enables resilient start: runs are created at the current spec version,\n // so the queue message carries runInput and run_started can bootstrap the\n // run when run_created has not landed yet.\n specVersion: SPEC_VERSION_CURRENT,\n };\n}\n\n// Export createWorld as an alias for compatibility with @workflow/world\nexport { createCelldWorld as createWorld };\n"],"mappings":";;;;;AA2EA,SAAgB,cAAc,QAAgD;CAC5E,MAAM,iBACJ,QAAQ,mBAAmB,KAAA,IACvB,qBAAqB,+BAA+B,OAAO,gBAAgB,GAAG,CAAC,IAC/E,qBACE,+BACA,QAAQ,IAAI,wBACZ,GACA,CACF;CAEN,MAAM,eAAe,QAAQ,gBAAgB;CAC7C,IACE,CAAC,OAAO,cAAc,YAAY,KAClC,eAAe,KACf,eAAA,KAEA,MAAM,IAAI,MAAM,mDAAmD,0BAA0B;CAE/F,MAAM,mBACJ,QAAQ,oBACR,KAAK,IAAA,KAA6B,KAAK,IAAI,GAAG,eAAe,GAAK,CAAC;CACrE,IACE,CAAC,OAAO,cAAc,gBAAgB,KACtC,mBAAmB,KACnB,mBAAA,KAEA,MAAM,IAAI,MACR,uDAAuD,yBACzD;CAEF,IAAI,oBAAoB,cACtB,MAAM,IAAI,MAAM,8DAA8D;CAEhF,MAAM,wBAAwB,QAAQ,yBAAyB;CAC/D,IAAI,CAAC,OAAO,cAAc,qBAAqB,KAAK,wBAAwB,GAC1E,MAAM,IAAI,MAAM,wEAAwE;CAG1F,OAAO;EACL,UAAU,QAAQ,YAAY,QAAQ,IAAI;EAC1C,QAAQ,QAAQ,UAAU,QAAQ,IAAI;EACtC,KAAK,QAAQ;EACb,cAAc,QAAQ,gBAAgB,QAAQ,IAAI,uBAAuB;EACzE,SAAS,QAAQ;EACjB;EACA;EACA;EACA;CACF;AACF;;;;;;;;;AC/GA,SAAgB,iBAAiB,MAA6B,YAA2B;CACvF,MAAM,UAAU,MAAM,WAAW,oCAAoC;CACrE,MAAM,QAAQ,IAAI,mBAAmB,SAAS,EAC5C,QAAQ,MAAM,UAAU,WAC1B,CAAC;CACD,IAAI,MAAM,MACR,MAAM,OAAO,KAAK;CAEpB,OAAO;AACT;;AAGA,IAAa,sBAAb,cAAyC,MAAM;CAGlC;CAFX,YACE,SACA,OACA;EACA,MAAM,OAAO;EAFJ,KAAA,QAAA;EAGT,KAAK,OAAO;CACd;AACF;;;;ACpBA,MAAMA,uCAAqB,IAAI,IAAI;CAAC;CAAK;CAAK;AAAG,CAAC;AAClD,MAAM,qBAAqB;AAE3B,SAASC,UAAQ,IAA2B;CAC1C,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAgB,sBAAsB,WAAiC;CACrE,MAAM,YAAY,UAAU,aAAa;CACzC,IAAI,CAAC,OAAO,cAAc,SAAS,KAAK,YAAY,KAAK,YAAA,KACvD,MAAM,IAAI,MACR,wDAAwD,0BAC1D;CAEF,OAAO;AACT;;;;;;;;;AAUA,eAAsB,OACpB,WACA,SACA,MACA,QACA,MACA,MACY;CACZ,OAAO,MAAM,eACX,WACA,WAAW,QAAQ,GAAG,mBAAmB,IAAI,EAAE,GAAG,UAClD,MACA,IACF;AACF;;AAGA,eAAsB,eACpB,WACA,MACA,MACA,MACY;CACZ,MAAM,UAAU,UAAU,aAAa;CACvC,MAAM,MAAM,GAAG,UAAU,SAAS,QAAQ,OAAO,EAAE,IAAI;CACvD,MAAM,WAAW,MAAM,aAAA,IAAyC;CAChE,MAAM,YAAY,sBAAsB,SAAS;CAEjD,IAAI;CACJ,KAAK,IAAI,UAAU,GAAG,WAAW,UAAU,WAAW;EACpD,IAAI,UAAU,GACZ,MAAMA,UAAQ,MAAM,UAAU,KAAK,OAAO,IAAI,GAAG;EAEnD,IAAI;EACJ,IAAI;GACF,WAAW,MAAM,QAAQ,KAAK;IAC5B,QAAQ;IACR,SAAS;KACP,gBAAgB;KAChB,eAAe,UAAU,UAAU;IACrC;IACA,MAAM,aAAa,IAAI;IACvB,QAAQ,YAAY,QAAQ,SAAS;GACvC,CAAC;EACH,SAAS,OAAO;GACd,YAAY,IAAI,oBAAoB,qCAAqC,OAAO,KAAK;GACrF;EACF;EAEA,IAAI,SAAS,IACX,IAAI;GACF,OAAO,SAAY,MAAM,SAAS,KAAK,CAAC;EAC1C,SAAS,OAAO;GACd,YAAY,IAAI,oBACd,mDAAmD,OACnD,KACF;GACA,IAAI,UAAU,UAAU;GACxB,MAAM;EACR;EAGF,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,IAAI;EACJ,IAAI;GACF,OAAQ,KAAK,MAAM,IAAI,CAAC,CAA2B;EACrD,QAAQ;GACN,OAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,SAAS;EACtD;EAEA,IAAID,qBAAmB,IAAI,SAAS,MAAM,KAAK,UAAU,UAAU;GACjE,YAAY,iBAAiB,MAAM,SAAS,MAAM;GAClD;EACF;EAEA,MAAM,iBAAiB,MAAM,SAAS,MAAM;CAC9C;CAEA,MAAM,qBAAqB,QACvB,YACA,IAAI,oBAAoB,2BAA2B,SAAS;AAClE;;;ACrGA,MAAM,qCAAqB,IAAI,IAAI;CAAC;CAAK;CAAK;AAAG,CAAC;AAClD,MAAM,gBAAgB;AACtB,MAAM,2BAA2B;AACjC,MAAM,0BAA0B,wBAAwB;AACxD,MAAM,2BAA2B;;;;;;AAOjC,MAAM,wCAAwB,IAAI,QAA8B;AAEhE,SAAgB,iBAAiB,WAAiC;CAChE,OAAO,sBAAsB,IAAI,SAAS,KAAA;AAC5C;AAEA,SAAgB,sBAAsB,WAA+B;CACnE,sBAAsB,OAAO,SAAS;AACxC;AAEA,SAAS,uBAAuB,WAAyB,UAA0B;CACjF,MAAM,aAAa,OAAO,SAAS,QAAQ,IAAI,yBAAyB,CAAC;CACzE,IAAI,OAAO,cAAc,UAAU,KAAK,aAAA,IACtC,sBAAsB,IAAI,WAAW,KAAK,IAAI,YAAA,GAAoC,CAAC;MAEnF,sBAAsB,OAAO,SAAS;AAE1C;AAEA,SAAS,QAAQ,IAAY,QAAqC;CAChE,IAAI,CAAC,QAAQ,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;CACpE,IAAI,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,MAAM,CAAC;CACzD,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,QAAQ,iBAAiB;GAC7B,OAAO,oBAAoB,SAAS,OAAO;GAC3C,QAAQ;EACV,GAAG,EAAE;EACL,MAAM,gBAAgB;GACpB,aAAa,KAAK;GAClB,OAAO,oBAAoB,SAAS,OAAO;GAC3C,OAAO,QAAQ,MAAM,CAAC;EACxB;EACA,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC1D,CAAC;AACH;AAEA,SAAS,cAAc,WAAmB,QAAmC;CAC3E,MAAM,UAAU,YAAY,QAAQ,SAAS;CAC7C,OAAO,SAAS,YAAY,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI;AACvD;AAEA,SAAS,QAAQ,QAA8B;CAC7C,OAAO,OAAO,UAAU,IAAI,aAAa,6BAA6B,YAAY;AACpF;AAEA,eAAe,oBAAoB,UAAoB,UAAuC;CAE5F,IADsB,OAAO,SAAS,QAAQ,IAAI,gBAAgB,KAAK,GACvD,IAAI,UAAU;EAC5B,MAAM,SAAS,MAAM,OAAO,0CAA0C,CAAC,CAAC,YAAY,KAAA,CAAS;EAC7F,MAAM,IAAI,oBAAoB,wCAAwC,SAAS,OAAO;CACxF;CACA,IAAI,CAAC,SAAS,MAAM,uBAAO,IAAI,WAAW;CAE1C,MAAM,SAAS,SAAS,KAAK,UAAU;CACvC,MAAM,SAAuB,CAAC;CAC9B,IAAI,QAAQ;CACZ,IAAI;EACF,SAAS;GACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,IAAI,MAAM;GACV,SAAS,MAAM;GACf,IAAI,QAAQ,UAAU;IACpB,MAAM,OAAO,OAAO,0CAA0C,CAAC,CAAC,YAAY,KAAA,CAAS;IACrF,MAAM,IAAI,oBAAoB,wCAAwC,SAAS,OAAO;GACxF;GACA,OAAO,KAAK,KAAK;EACnB;CACF,UAAU;EACR,OAAO,YAAY;CACrB;CAEA,MAAM,OAAO,IAAI,WAAW,KAAK;CACjC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC1B,KAAK,IAAI,OAAO,MAAM;EACtB,UAAU,MAAM;CAClB;CACA,OAAO;AACT;AAEA,eAAe,kBAAkB,UAAoC;CACnE,MAAM,OAAO,IAAI,YAAY,CAAC,CAAC,OAC7B,MAAM,oBAAoB,UAAU,wBAAwB,CAC9D;CACA,IAAI;CACJ,IAAI;EACF,OAAQ,KAAK,MAAM,IAAI,CAAC,CAA2B;CACrD,QAAQ;EACN,OAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,SAAS;CACtD;CACA,OAAO,iBAAiB,MAAM,SAAS,MAAM;AAC/C;AAEA,SAAS,UAAU,WAAyB,MAAsB;CAChE,OAAO,GAAG,UAAU,SAAS,QAAQ,OAAO,EAAE,EAAE,cAAc,mBAAmB,IAAI,EAAE;AACzF;AAEA,eAAsB,kBACpB,WACA,MACA,OACA,QAC4B;CAC5B,MAAM,YAAY,sBAAsB,SAAS;CACjD,MAAM,OAAO,uBAAuB,MAAM;CAC1C,IAAI,KAAK,aAAA,SACP,MAAM,IAAI,MAAM,4DAA4D;CAE9E,MAAM,MAAM,IAAI,IAAI,UAAU,WAAW,IAAI,CAAC;CAC9C,IAAI,aAAa,IAAI,SAAS,KAAK;CACnC,MAAM,UAAU,UAAU,aAAa;CAEvC,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,QAAQ,KAAK;GAC5B,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,eAAe,UAAU,UAAU;GACrC;GACA;GACA,QAAQ,cAAc,SAAS;EACjC,CAAC;CACH,SAAS,OAAO;EACd,MAAM,IAAI,oBAAoB,qCAAqC,IAAI,QAAQ,KAAK;CACtF;CAEA,IAAI,CAAC,SAAS,IAAI,MAAM,MAAM,kBAAkB,QAAQ;CACxD,uBAAuB,WAAW,QAAQ;CAC1C,IAAI;EACF,OAAO,wBAAwB,MAAM,oBAAoB,UAAU,wBAAwB,CAAC;CAC9F,SAAS,OAAO;EACd,IAAI,iBAAiB,qBAAqB,MAAM;EAChD,MAAM,IAAI,oBAAoB,+CAA+C,IAAI,QAAQ,KAAK;CAChG;AACF;AAEA,eAAsB,iBACpB,WACA,MACA,SACA,QAC2B;CAC3B,MAAM,YAAY,sBAAsB,SAAS;CACjD,MAAM,MAAM,IAAI,IAAI,UAAU,WAAW,IAAI,CAAC;CAC9C,IAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;CAC3C,IAAI,aAAa,IAAI,cAAc,OAAO,QAAQ,UAAU,CAAC;CAC7D,IAAI,aAAa,IAAI,aAAa,OAAO,QAAQ,SAAS,CAAC;CAC3D,IAAI,aAAa,IAAI,YAAY,OAAO,QAAQ,QAAQ,CAAC;CACzD,IAAI,aAAa,IAAI,UAAU,OAAO,QAAQ,MAAM,CAAC;CACrD,MAAM,UAAU,UAAU,aAAa;CACvC,IAAI;CAEJ,KAAK,IAAI,UAAU,GAAG,WAAW,eAAe,WAAW;EACzD,IAAI,QAAQ,SAAS,MAAM,QAAQ,MAAM;EACzC,IAAI,UAAU,GAAG,MAAM,QAAQ,MAAM,UAAU,KAAK,OAAO,IAAI,KAAK,MAAM;EAC1E,IAAI;EACJ,IAAI;GACF,WAAW,MAAM,QAAQ,KAAK;IAC5B,QAAQ;IACR,SAAS,EAAE,eAAe,UAAU,UAAU,SAAS;IACvD,QAAQ,cAAc,WAAW,MAAM;GACzC,CAAC;EACH,SAAS,OAAO;GACd,IAAI,QAAQ,SAAS,MAAM,QAAQ,MAAM;GACzC,YAAY,IAAI,oBAAoB,qCAAqC,IAAI,QAAQ,KAAK;GAC1F;EACF;EAEA,IAAI,QAAQ,SAAS;GACnB,MAAM,SAAS,MAAM,OAAO,QAAQ,MAAM,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;GAClE,MAAM,QAAQ,MAAM;EACtB;EAEA,IAAI,SAAS,IAAI;GACf,uBAAuB,WAAW,QAAQ;GAC1C,IAAI;IACF,OAAO,uBAAuB,MAAM,oBAAoB,UAAU,uBAAuB,CAAC;GAC5F,SAAS,OAAO;IACd,IAAI,QAAQ,SAAS,MAAM,QAAQ,MAAM;IACzC,YACE,iBAAiB,sBACb,QACA,IAAI,oBACF,+CAA+C,IAAI,QACnD,KACF;IACN,IAAI,UAAU,eAAe;IAC7B,MAAM;GACR;EACF;EAEA,IAAI;EACJ,IAAI;GACF,QAAQ,MAAM,kBAAkB,QAAQ;EAC1C,SAAS,OAAO;GACd,IAAI,QAAQ,SAAS,MAAM,QAAQ,MAAM;GACzC,QACE,iBAAiB,sBACb,QACA,IAAI,oBACF,qDAAqD,IAAI,QACzD,KACF;EACR;EACA,IAAI,mBAAmB,IAAI,SAAS,MAAM,KAAK,UAAU,eAAe;GACtE,YAAY;GACZ;EACF;EACA,IACE,QAAQ,YAAA,MACR,sBAAsB,KAAK,KAC3B,UAAU,eACV;GAEA,sBAAsB,SAAS;GAC/B,IAAI,aAAa,IAAI,aAAa,OAAA,EAA6B,CAAC;GAChE,YAAY;GACZ;EACF;EACA,MAAM;CACR;CAEA,MAAM,qBAAqB,QACvB,YACA,IAAI,oBAAoB,mCAAmC,SAAS;AAC1E;;;ACjOA,MAAM,OAAmB;CACvB,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,0BAAU,IAAI,IAAI;EAChB;EACA;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,MAAM,UAAsB;CAC1B,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,0BAAU,IAAI,IAAI;EAChB;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH;AAEA,SAAS,oBAAoB,WAAyB;CACpD,OAAO;EACL,WAAW,MAAc;GACvB,OAAO,EAAE,gBAAgB,KAAK;EAChC;EACA,IAAI,IAA0C;GAC5C,MAAM,OAAO,GAAG,SAAS;GACzB,MAAM,UAAU,SAAuB,WAAW,WAAW,MAAM,OAAO;GAC1E,QAAQ,eAAe,OAAO,WAAW,kBAAkB,WAAW,MAAM,OAAO,MAAM;GACzF,QAAQ,cAAc,SAAS,WAAW,iBAAiB,WAAW,MAAM,SAAS,MAAM;GAC3F,QAAQ,yBAAyB,iBAAiB,SAAS;GAC3D,QAAQ,8BAA8B,sBAAsB,SAAS;GACrE,OAAO;EACT;CACF;AACF;AAEA,SAAS,SAAY,WAAyB,SAAiB,MAAc,MAAqB;CAChG,MAAM,OAAiE,CAAC;CACxE,KAAK,MAAM,UAAU,KAAK,SACxB,KAAK,WAAW,GAAG,SACjB,OAAO,WAAW,SAAS,MAAM,QAAQ,MAAM,EAC7C,YAAY,CAAC,KAAK,SAAS,IAAI,MAAM,EACvC,CAAC;CAEL,OAAO;AACT;AAEA,SAAS,cAAiB,WAAyB,SAAiB,MAAkB;CACpF,OAAO;EACL,WAAW,MAAc;GACvB,OAAO,EAAE,gBAAgB,KAAK;EAChC;EACA,IAAI,IAA+B;GACjC,OAAO,SAAY,WAAW,SAAS,GAAG,SAAS,GAAG,IAAI;EAC5D;CACF;AACF;AAEA,MAAM,cAA0B;CAC9B,SAAS;EAAC;EAAa;EAAQ;CAAW;CAE1C,0BAAU,IAAI,IAAI;AACpB;AAEA,MAAM,cAA0B;CAC9B,SAAS;EAAC;EAAO;EAAW;EAAY;EAAgB;CAAc;CACtE,0BAAU,IAAI,IAAI;AACpB;AAEA,MAAM,WAAuB;CAC3B,SAAS;EAAC;EAAO;EAAW;EAAW;EAAgB;CAAc;CACrE,0BAAU,IAAI,IAAI;AACpB;;AAGA,MAAM,mCAAmB,IAAI,QAAsB;AAEnD,eAAe,iBACb,WACA,SAC6B;CAC7B,IAAI,iBAAiB,IAAI,SAAS,GAAG,OAAO;CAC5C,IAAI;EACF,OAAO,MAAM,eAA4B,WAAW,gCAAgC,CAAC,OAAO,GAAG,EAC7F,YAAY,KACd,CAAC;CACH,SAAS,OAAO;EAEd,IAAK,MAA+B,WAAW,KAAK;GAClD,iBAAiB,IAAI,SAAS;GAC9B,OAAO;EACT;EACA,MAAM;CACR;AACF;AAEA,SAAgB,gBAAgB,WAAwC;CACtE,MAAM,aAAa,cAAmC,WAAW,eAAe,WAAW;CAC3F,MAAM,aAAa,cAAkC,WAAW,eAAe,WAAW;CAC1F,MAAM,UAAU,cAA+B,WAAW,YAAY,QAAQ;CAC9E,MAAM,gBAAgB,oBAAoB;EAAE;EAAY;EAAY;CAAQ,CAAC;CAC7E,OAAO;EACL,aAAa,cAAiC,WAAW,QAAQ,IAAI;EACrE,kBAAkB,oBAAoB,SAAS;EAC/C,gBAAgB;GACd,GAAG;GACH,YAAY,KAAK,oBAAoB,yBACnC,eACE,WACA,yBACA;IAAC;IAAK;IAAoB;GAAoB,GAC9C,EACE,YAAY,KACd,CACF;GACF,WAAW,YACT,eAAe,WAAW,uBAAuB,CAAC,OAAO,GAAG,EAAE,YAAY,KAAK,CAAC;GAClF,mBAAmB,YAAY,iBAAiB,WAAW,OAAO;GAClE,YAAY,YACV,eAAe,WAAW,yBAAyB,CAAC,OAAO,GAAG,EAAE,YAAY,KAAK,CAAC;GACpF,cAAc,OAAO,UACnB,eAAe,WAAW,2BAA2B,CAAC,OAAO,KAAK,GAAG,EACnE,YAAY,KACd,CAAC;GACH,sBAAsB,OAAO,QAAQ,gBAAgB,OAAO,gBAC1D,eACE,WACA,4BACA;IAAC;IAAO;IAAQ;IAAgB;IAAO;GAAW,GAClD,EAAE,YAAY,KAAK,CACrB;GACF,yBAAyB,OAAO,OAAO,gBACrC,eACE,WACA,uCACA;IAAC;IAAO;IAAO;GAAW,GAC1B,EAAE,YAAY,KAAK,CACrB;GACF,qBAAqB,YACnB,eAAe,WAAW,2BAA2B,CAAC,OAAO,GAAG,EAAE,YAAY,KAAK,CAAC;EACxF;EACA,gBAAgB,EACd,OAAO,UAAU,YACf,eAAsC,WAAW,kBAAkB,CAAC,UAAU,OAAO,GAAG,EAGtF,YAAY,MACd,CAAC,EACL;CACF;AACF;;;;;;;;;;;;;;;;AClMA,SAAgB,kBAAkB,WAAmB;CACnD,QAAQ,GAAG,SAAoB;EAC7B,MAAM,QAAQ,OAAO,YAAY,cAAc,KAAA,IAAY,QAAQ,KAAK;EACxE,IAAI,CAAC,OAAO;EAQZ,IAAI,EALF,UAAU,OACV,UAAU,UACV,UAAU,OACV,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,OAAe,GAAG,KAAK,MAAM,SAAS,IAEjD;EAGd,MAAM,SAAS,qBADG,IAAI,KAAK,EAAA,CAAE,YACF,EAAE,KAAK,UAAU;EAC5C,MAAM,UAAU,KACb,KAAK,QAAS,OAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,OAAO,GAAG,CAAE,CAAC,CACpF,KAAK,GAAG;EAEX,IAAI,OAAO,QAAQ,QAAQ,UAAU,YACnC,QAAQ,OAAO,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG;OAE7C,QAAQ,MAAM,GAAG,OAAO,GAAG,SAAS;CAExC;AACF;;;ACnCA,MAAa,QAAQ,kBAAkB,aAAa;;;;;;;;;;;;;;;;;;;;AC2CpD,MAAM,qBAAqB;AAC3B,MAAM,2BAA2B;AAEjC,SAAS,MAAM,cAAqC;CAClD,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,YAAY,CAAC;AACnE;AAEA,eAAe,SAAS,cAAqC;CAC3D,IAAI,YAAY;CAChB,OAAO,YAAY,oBAAoB;EACrC,MAAM,MAAM,kBAAkB;EAC9B,aAAa;CACf;CACA,MAAM,MAAM,SAAS;AACvB;;;;;;;;;;AAWA,MAAa,2CAA2B,IAAI,IAAI;CAAC;CAAK;CAAK;CAAK;AAAG,CAAC;AAEpE,SAAS,iBAAiB,KAAyC;CACjE,IAAI,eAAe,sBAAsB,IAAI,WAAW,KAAA,GACtD,OAAO,yBAAyB,IAAI,IAAI,MAAM;CAEhD,OAAO;AACT;;AAGA,SAAgB,eAAe,SAAyB;CACtD,OAAO,KAAK,IAAI,IAAI,KAAK,OAAO;AAClC;AAIA,MAAM,iBAA2B;AAEjC,SAAS,aAAsB;CAI7B,IAAI,QAAQ,IAAI,qBAAqB,UAAU,OAAO;CACtD,OAAO,QAAQ,IAAI,WAAW,UAAU,QAAQ,IAAI,aAAa;AACnE;AAqCA,SAAS,eAAe,QAAkC;CACxD,IAAI,OAAO,SAAS,OAAO,OAAO;CAClC,IAAI,QAAQ,IAAI,mBAAmB,OAAO,QAAQ,IAAI;CAEtD,OAAO,oBADM,QAAQ,IAAI,QAAQ;AAEnC;;;;;;;;;;;;;AAcA,SAAS,eAAe,QAA0B;CAChD,MAAM,gBAAgB,qBACpB,uCACA,OAAO,eACP,KACA,GACA,6BACF;CACA,MAAM,cAAc,qBAClB,qCACA,OAAO,aACP,GACA,CACF;CACA,MAAM,gBAAgB,qBACpB,wCACA,OAAO,gBACP,KACA,GACA,wBACF;CAEA,MAAM,SAA2C,EAAE,MAAM,CAAC,EAAE;CAC5D,MAAM,SAA8C,EAAE,MAAM,CAAC,EAAE;;CAE/D,MAAM,mCAAmB,IAAI,IAAuB;CACpD,IAAI,UAAU;CAEd,SAAS,QAAQ,UAAwB;EACvC,IAAI,SAAS,gBACX,iBAAiB,OAAO,SAAS,cAAc;CAEnD;CAEA,SAAS,QAAQ,UAAoB,UAAwB;EAC3D,OAAO,SAAS,CAAC,KAAK,QAAQ;EAC9B,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG;CAC7B;CAEA,eAAe,KAAK,UAAkD;EACpE,MAAM,WAAW,OAAO,SAAS,CAAC,MAAM;EACxC,IAAI,UAAU,OAAO;EACrB,OAAO,IAAI,SAAS,YAAY;GAC9B,OAAO,SAAS,CAAC,WAAW,QAAQ,OAAO,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC;EACvE,CAAC;CACH;CAEA,eAAe,SAAS,UAAwB,UAAmC;EACjF,MAAM,MAAM,GAAG,eAAe,MAAM,EAAE,2BAA2B;EACjE,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,oBAAoB,SAAS;IAC7B,oBAAoB,SAAS;IAC7B,yBAAyB,OAAO,SAAS,OAAO;GAClD;GACA,MAAM,UAAU,SAAS,OAAO;GAChC,QAAQ,YAAY,QAAQ,aAAa;EAC3C,CAAC;EAED,IAAI,SAAS,IAAI;GACf,IAAI;IACF,MAAM,SAAS,MAAM,OAAO;GAC9B,QAAQ,CAGR;GACA,QAAQ,QAAQ;GAChB;EACF;EAEA,MAAM,OAAO,MAAM,SAAS,KAAK;EAEjC,IAAI,SAAS,WAAW,KAAK;GAC3B,IAAI;GACJ,IAAI;IACF,SAAS,KAAK,MAAM,IAAI;GAC1B,QAAQ;IACN,SAAS;GACX;GACA,MAAM,iBAAkB,QAA+C;GACvE,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,eAAe,mBACnB,KACA,gBACA,GACA,sCACF;GACA,IAAI,iBAAiB,MAAM;IAEzB,SAAc,eAAe,GAAG,CAAC,CAAC,WAAW,QAAQ,UAAU,QAAQ,CAAC;IACxE;GACF;EACF;EAEA,IAAI,yBAAyB,IAAI,SAAS,MAAM,GAAG;GACjD,QAAQ,QAAQ;GAChB,MACE,oCAAoC,SAAS,UAAU,mBAAmB,SAAS,OAAO,IAAI,MAChG;GACA;EACF;EAEA,IAAI,SAAS,UAAU,aAAa;GAClC,MAAM,OAAqB;IAAE,GAAG;IAAU,SAAS,SAAS,UAAU;GAAE;GACxE,MAAM,UAAU,KAAK,IACnB,0BACA,gBAAgB,KAAK,KAAK,IAAI,KAAK,UAAU,GAAG,EAAE,CACpD;GACA,IACE,yBAAyB,KAAK,IAAI,GAAG,SAAA,MAA+C,MACpF,MACA;IACA,QAAQ,QAAQ;IAChB,QAAQ,MACN,oCAAoC,SAAS,UAAU,qDACzD;IACA;GACF;GACA,SAAc,OAAO,CAAC,CAAC,WAAW,QAAQ,UAAU,IAAI,CAAC;EAC3D,OAAO;GACL,QAAQ,QAAQ;GAChB,QAAQ,MACN,oCAAoC,SAAS,UAAU,SAAS,SAAS,QAAQ,kBAAkB,SAAS,OAAO,IAAI,MACzH;EACF;CACF;CAEA,eAAe,KAAK,UAAoB;EACtC,OAAO,MAAM;GACX,IAAI,CAAC,SAAS;GACd,MAAM,WAAW,MAAM,KAAK,QAAQ;GACpC,IAAI,CAAC,UAAU;GACf,IAAI;IACF,MAAM,SAAS,UAAU,QAAQ;GACnC,SAAS,KAAK;IACZ,QAAQ,QAAQ;IAChB,QAAQ,MAAM,6CAA6C,SAAS,IAAI,GAAG;GAC7E;EACF;CACF;CAEA,OAAO;;EAEL,SAAS,gBAA2D;GAClE,OAAO,iBAAiB,iBAAiB,IAAI,cAAc,IAAI,KAAA;EACjE;EACA,KAAK,UAAoB,UAAwB,cAAuB;GACtE,IACE,mBACE,KAAK,IAAI,GACT,gBAAgB,GAChB,GAAA,MAEF,MAAM,MAEN,MAAM,IAAI,MAAM,iEAAiE;GAEnF,IAAI,SAAS,gBACX,iBAAiB,IAAI,SAAS,gBAAgB,UAAU,MAAM,SAAS,SAAS,CAAC;GAEnF,IAAI,gBAAgB,eAAe,GACjC,SAAc,eAAe,GAAI,CAAC,CAAC,WAAW,QAAQ,UAAU,QAAQ,CAAC;QAEzE,QAAQ,UAAU,QAAQ;EAE9B;EACA,MAAM,QAAQ;GACZ,IAAI,SAAS;GACb,UAAU;GACV,KAAU,MAAM;EAClB;EACA,OAAO;GACL,UAAU;GACV,KAAK,MAAM,QAAQ,OAAO,OAAO,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,EAAE;EACpE;CACF;AACF;AAEA,SAAgB,YAAY,QAA8D;CACxF,MAAM,EAAE,KAAK,iBAAiB;CAC9B,IAAI,CAAC,KAAK,gBACR,MAAM,IAAI,MAAM,kDAAkD;CAEpE,MAAM,oBAAoB,iBAAiB;CAC3C,MAAM,WAAW,eAAe,MAAM;CAEtC,OAAO;EACL,MAAM,MAAM,WAAW,SAAS,MAAM;GACpC,eAAe,SAAS;GACxB,MAAM,gBAAgB,mBAAmB,UAAU,OAAO;GAC1D,IAAI,CAAC,cAAc,SACjB,MAAM,IAAI,mBAAmB,wCAAwC,EAAE,QAAQ,IAAI,CAAC;GAEtF,IACE,mBACE,KAAK,IAAI,GACT,MAAM,gBAAgB,GACtB,GAAA,MAEF,MAAM,MAEN,MAAM,IAAI,MAAM,iEAAiE;GAEnF,MAAM,QACJ,WAAW,cAAc,QAAQ,OAAO,cAAc,KAAK,UAAU,WACjE,cAAc,KAAK,QACnB,KAAA;GAEN,IAAI,WAAW,GAAG;IAIhB,MAAM,WAAW,SAAS,SAAS,MAAM,cAAc;IACvD,IAAI,UACF,OAAO,EAAE,WAAW,SAAS;IAE/B,MAAM,YAAY,UAAU,MAAM,OAAO,kBAAkB,GAAG;IAC9D,SAAS,KACP,gBACA;KACE;KACA;KACA,SAAS;KACT,SAAS,cAAc;KACvB,gBAAgB,MAAM;IACxB,GACA,MAAM,YACR;IACA,OAAO,EAAE,UAAU;GACrB;GAKA,MAAM,YAAY,UAAU,MAAM,OAAO,kBAAkB,GAAG;GAC9D,MAAM,OAAO,UAAU,cAAc,IAAI;GACzC,MAAM,YACJ,MAAM,gBAAgB,KAAK,eAAe,IACrC,mBACC,KAAK,IAAI,GACT,KAAK,cACL,GAAA,MAEF,KAAK,KAAA,IACL,KAAA;GACN,MAAM,WAAgC;IACpC,SAAS;IACT;IACA;IACA,eAAe,eAAe,MAAM;IACpC;IACA,gBAAgB,MAAM;IACtB;IACA;GACF;GACA,MAAM,YAAY,MAAM,IAAI,eAAe,KAAK,UAAU,EACxD,cAAc,wBAAwB,WAAW,KAAK,IAAI,CAAC,EAC7D,CAAC;GACD,OAAO,EAAE,WAAW,UAAU,MAAM,UAAU,SAAS,EAAE;EAC3D;EAEA,mBAAmB,iBAAiB,SAAS;GAQ3C,OAAO,OAAO,QAAiB;IAC7B,IAAI,IAAI,WAAW,QACjB,OAAO,SAAS,KAAK,EAAE,OAAO,gBAAgB,GAAG,EAAE,QAAQ,IAAI,CAAC;IAElE,IACE,IAAI,QAAQ,IAAI,cAAc,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,MACrE,oBAEA,OAAO,SAAS,KAAK,EAAE,OAAO,4BAA4B,GAAG,EAAE,QAAQ,IAAI,CAAC;IAE9E,MAAM,eAAe,IAAI,QAAQ,IAAI,kBAAkB;IACvD,MAAM,eAAe,IAAI,QAAQ,IAAI,kBAAkB;IACvD,MAAM,aAAa,IAAI,QAAQ,IAAI,uBAAuB;IAE1D,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,MACxD,OAAO,SAAS,KAAK,EAAE,OAAO,mCAAmC,GAAG,EAAE,QAAQ,IAAI,CAAC;IAErF,IAAI,CAAC,aAAa,WAAW,eAAe,GAC1C,OAAO,SAAS,KAAK,EAAE,OAAO,kBAAkB,GAAG,EAAE,QAAQ,IAAI,CAAC;IAEpE,IAAI;IACJ,IAAI;KACF,UAAU,qBAAqB,yBAAyB,YAAY,GAAG,CAAC;IAC1E,QAAQ;KACN,OAAO,SAAS,KAAK,EAAE,OAAO,uCAAuC,GAAG,EAAE,QAAQ,IAAI,CAAC;IACzF;IACA,IAAI;KAEF,IAAI;KACJ,IAAI;MACF,OAAO,MAAe,MAAM,IAAI,KAAK,CAAC;KACxC,QAAQ;MACN,OAAO,SAAS,KAAK,EAAE,OAAO,6BAA6B,GAAG,EAAE,QAAQ,IAAI,CAAC;KAC/E;KACA,MAAM,aAAa,mBAAmB,UAAU,IAAI;KACpD,IAAI,CAAC,WAAW,SACd,OAAO,SAAS,KAAK,EAAE,OAAO,wBAAwB,GAAG,EAAE,QAAQ,IAAI,CAAC;KAE1E,MAAM,SAAS,MAAM,QAAQ,WAAW,MAAM;MAC5C;MACA,WAAW;MACX,WAAW;KACb,CAAC;KACD,IAAI,UAAU,OAAO,OAAO,mBAAmB,UAAU;MACvD,IACE,mBACE,KAAK,IAAI,GACT,OAAO,gBACP,GAAA,MAEF,MAAM,MAEN,MAAM,IAAI,MAAM,8CAA8C;MAEhE,OAAO,SAAS,KACd,EAAE,gBAAgB,OAAO,eAAe,GACxC;OAAE,QAAQ;OAAK,SAAS,EAAE,eAAe,OAAO,OAAO,cAAc,EAAE;MAAE,CAC3E;KACF;KACA,OAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;IAC3C,SAAS,OAAO;KAGd,IAAI,iBAAiB,KAAK,GAAG;MAC3B,MAAM,gDAAgD;OACpD,QAAQ,MAAM;OACd,OAAO,OAAO,KAAK;MACrB,CAAC;MACD,OAAO,SAAS,KACd;OAAE,OAAO,OAAO,KAAK;OAAG,WAAW;MAAK,GACxC,EAAE,QAAQ,MAAM,OAAO,CACzB;KACF;KAEA,MAAM,iBAAiB,eAAe,OAAO;KAC7C,MAAM,4DAA4D;MAChE,OAAO,OAAO,KAAK;MACnB;KACF,CAAC;KACD,OAAO,SAAS,KACd;MAAE,OAAO,OAAO,KAAK;MAAG,YAAY;KAAe,GACnD;MAAE,QAAQ;MAAK,SAAS,EAAE,eAAe,OAAO,cAAc,EAAE;KAAE,CACpE;IACF;GACF;EACF;EAEA,MAAM,kBAAkB;GACtB,OAAO;EACT;EAEA,MAAM,QAAQ;GACZ,IAAI,WAAW,GACb,MAAM,SAAS,MAAM;EAGzB;CACF;AACF;;;ACrZA,SAAS,UAAU,MAAsD;CACvE,OAAO;EAAE,OAAO,KAAK;EAAO,QAAQ,KAAK;CAAO;AAClD;AAEA,MAAM,0CAA0B,IAAI,IAAY;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAiC;AAoBjC,SAAS,2BAA2B,QAAuB;CACzD,MAAM,IAAI,oBAAoB,8CAA8C,QAAQ;AACtF;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,uBACP,SACA,KACA,SACM;CACN,MAAM,QAAQ,QAAQ;CACtB,IACE,UAAU,KAAA,MACT,OAAO,UAAU,YAChB,CAAC,OAAO,SAAS,KAAK,KACrB,WAAW,CAAC,OAAO,cAAc,KAAK,IAEzC,2BAA2B,GAAG,IAAI,WAAW,UAAU,mBAAmB,mBAAmB;AAEjG;AAEA,SAAS,6BAA6B,SAAwC;CAC5E,MAAM,QAAQ,QAAQ;CACtB,IACE,UAAU,KAAA,MACT,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,IAEtE,2BAA2B,kDAAkD;AAEjF;AAEA,SAAS,mBACP,SACA,KACA,QAGe;CACf,MAAM,QAAQ,QAAQ;CACtB,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,CAAC,SAAS,KAAK,GAAG,2BAA2B,GAAG,IAAI,YAAY;CACpE,MAAM,SAAS,OAAO,UAAU,QAAQ,KAAK,CAAC;CAC9C,IAAI,CAAC,OAAO,SAAS,2BAA2B,GAAG,IAAI,YAAY;CACnE,OAAO,OAAO;AAChB;;;;;;;;AASA,SAAS,uBAAuB,OAAyC;CACvE,IAAI,CAAC,SAAS,KAAK,GAAG,2BAA2B,4BAA4B;CAE7E,IAAI,MAAM,OAAO,OAAO;EACtB,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAC1D,2BAA2B,yCAAyC;EAEtE,IAAI,OAAO,MAAM,YAAY,UAC3B,2BAA2B,kCAAkC;EAE/D,uBAAuB,OAAO,UAAU,IAAI;EAC5C,uBAAuB,OAAO,cAAc,KAAK;EACjD,6BAA6B,KAAK;EAClC,uBAAuB,OAAO,qBAAqB,KAAK;EACxD,uBAAuB,OAAO,kBAAkB,IAAI;EACpD,uBAAuB,OAAO,oBAAoB,IAAI;EAEtD,MAAM,UAAU;EAChB,OAAO,wBAAwB,IAAI,QAAQ,IAAI,IAC3C;GACE,MAAM;GACG;EACX,IACA;GAAE,MAAM;GAAmB;EAAQ;CACzC;CAEA,IAAI,MAAM,OAAO,MAAM,2BAA2B,0BAA0B;CAC5E,IAAI,CAAC,MAAM,QAAQ,MAAM,aAAa,GACpC,2BAA2B,gCAAgC;CAE7D,KAAK,MAAM,gBAAgB,MAAM,eAC/B,IACE,CAAC,SAAS,YAAY,KACtB,OAAO,aAAa,WAAW,YAC/B,aAAa,OAAO,WAAW,KAC/B,OAAO,aAAa,UAAU,YAC9B,aAAa,MAAM,WAAW,GAE9B,2BAA2B,6DAA6D;CAI5F,MAAM,QAAQ,mBAAmB,OAAO,SAAS,WAAW;CAC5D,MAAM,MAAM,mBAAmB,OAAO,OAAO,iBAAiB;CAC9D,MAAM,YAAY,mBAAmB,OAAO,aAAa,iBAAiB;CAC1E,MAAM,OAAO,mBAAmB,OAAO,QAAQ,UAAU;CACzD,MAAM,OAAO,mBAAmB,OAAO,QAAQ,UAAU;CACzD,MAAM,OAAO,mBAAmB,OAAO,QAAQ,UAAU;CACzD,MAAM,cAAc,mBAAmB,OAAO,eAAe,UAAU;CAEvE,IAAI,MAAM,gBAAgB,KAAA,KAAa,MAAM,gBAAgB,MAC3D,2BAA2B,uCAAuC;CAEpE,IAAI,MAAM,eAAe,KAAA,GAErB;MAAA,CAAC,SAAS,MAAM,UAAU,KAC1B,OAAO,MAAM,WAAW,iBAAiB,YACzC,EAAE,MAAM,WAAW,qBAAqB,SACxC,OAAO,MAAM,MAAM,WAAW,UAAU,QAAQ,CAAC,GAEjD,2BAA2B,uBAAuB;CAAA;CAGtD,IAAI;CACJ,IAAI,MAAM,WAAW,KAAA,GAAW;EAC9B,IAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,GAAG,2BAA2B,yBAAyB;EACtF,SAAS,MAAM,OAAO,KAAK,cAAc;GACvC,IAAI,CAAC,SAAS,SAAS,GAAG,2BAA2B,kCAAkC;GACvF,MAAM,SAAS,YAAY,UAAU,QAAQ,SAAS,CAAC;GACvD,IAAI,CAAC,OAAO,SACV,2BAA2B,kCAAkC;GAE/D,OAAO,OAAO;EAChB,CAAC;EACD,IAAI,MAAM,WAAW,QAAQ,OAAO,MAAM,WAAW,UACnD,2BAA2B,4CAA4C;EAEzE,IAAI,OAAO,MAAM,YAAY,WAC3B,2BAA2B,6CAA6C;CAE5E;CACA,IAAI,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW,QAAQ,OAAO,MAAM,WAAW,UACjF,2BAA2B,iCAAiC;CAE9D,IAAI,MAAM,YAAY,KAAA,KAAa,OAAO,MAAM,YAAY,WAC1D,2BAA2B,2BAA2B;CAExD,IACE,MAAM,cAAc,KAAA,MACnB,OAAO,MAAM,cAAc,YAC1B,CAAC,OAAO,cAAc,MAAM,SAAS,KACrC,MAAM,YAAY,IAEpB,2BAA2B,+CAA+C;CAE5E,KAAK,MAAM,QAAQ,CAAC,qBAAqB,qBAAqB,GAC5D,IAAI,MAAM,UAAU,KAAA,KAAa,MAAM,UAAU,MAC/C,2BAA2B,GAAG,KAAK,2BAA2B;CAGlE,IAAI,QAAQ,KAAA,KAAa,MAAM,8BAA8B,KAAA,GAC3D,2BAA2B,2DAA2D;CAExF,IACE,MAAM,8BAA8B,KAAA,MACnC,OAAO,MAAM,8BAA8B,YAC1C,CAAC,OAAO,SAAS,MAAM,yBAAyB,IAElD,2BAA2B,mDAAmD;CAGhF,OAAO;EACL,MAAM;EACN,SAAS;GACP,GAAG;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,eAAe,MAAM,cAAc,KAAK,kBAAkB;IACxD,QAAS,aAAyC;IAClD,OAAQ,aAAyC;GACnD,EAAE;EACJ;CACF;AACF;;;;;AAMA,SAAS,WACP,MACA,aACA,aACG;CACH,IAAI,gBAAgB,QAAQ;EAC1B,MAAM,UAAU,EAAE,GAAG,KAAK;EAC1B,KAAK,MAAM,OAAO,aAChB,IAAI,OAAO,SACT,OAAO,QAAQ;EAGnB,OAAO;CACT;CACA,OAAO;AACT;;;;AAKA,SAAS,eAAe,MAAY,aAAgC;CAClE,IAAI,gBAAgB,UAAU,cAAc,MAAM;EAChD,MAAM,EAAE,UAAU,GAAG,GAAG,SAAS;EACjC,OAAO;GAAE,UAAU,KAAA;GAAW,GAAG;EAAK;CACxC;CACA,OAAO;AACT;;;;;;;AAQA,SAAS,kBACP,SACA,OACA,MACO;CACP,MAAM,YAA6B,UAAgB;EACjD,OAAO,OAAO,OAAO,EAAE,MAAM,QAAQ,KAAK,CAAC;EAC3C,OAAO;CACT;CAEA,QAAQ,QAAQ,MAAhB;EACE,KAAK,iBACH,MAAM,SAAS,IAAI,yBAAyB,KAAK,CAAC;EACpD,KAAK,kBACH,MAAM,IAAI,mBAAmB,QAAQ,SAAS;GAAE,QAAQ;GAAK,MAAM,QAAQ;EAAK,CAAC;EACnF,KAAK,kBACH,MAAM,SAAS,IAAI,kBAAkB,KAAK,iBAAiB,KAAK,CAAC;EACnE,KAAK,kBACH,MAAM,IAAI,mBAAmB,QAAQ,SAAS;GAAE,QAAQ;GAAK,MAAM,QAAQ;EAAK,CAAC;EACnF,KAAK,mBACH,MAAM,SAAS,IAAI,oBAAoB,QAAQ,OAAO,CAAC;EACzD,KAAK,wBACH,MAAM,IAAI,mBAAmB,QAAQ,SAAS;GAAE,QAAQ;GAAK,MAAM,QAAQ;EAAK,CAAC;EACnF,KAAK,eACH,MAAM,SAAS,IAAI,gBAAgB,QAAQ,OAAO,CAAC;EACrD,KAAK,aACH,MAAM,SAAS,IAAI,cAAc,QAAQ,SAAS,EAAE,YAAY,QAAQ,kBAAkB,CAAC,CAAC;EAC9F,KAAK,qBACH,MAAM,SAAS,IAAI,qBAAqB,QAAQ,kBAAkB,GAAG,oBAAoB,CAAC;EAC5F,SAAS;GACP,MAAM,QAAQ,IAAI,mBAAmB,QAAQ,SAAS;IACpD,QAAQ,QAAQ;IAChB,MAAM,QAAQ;IACd,YAAY,QAAQ;GACtB,CAAC;GACD,KAAK,MAAM,OAAO;IAChB;IACA;IACA;IACA;IACA;GACF,GACE,IAAI,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,GAAG,MAAM,QAAQ,KAAK,CAAC;GAE/E,MAAM;EACR;CACF;AACF;AAEA,MAAM,YAAY,QAAkC,kBAAkB,MAAM,QAAQ,GAAG,CAAC;AACxF,MAAM,aAAa,SAAqB,WAAW,MAAM,QAAQ,IAAI,CAAC;AACtE,MAAM,aAAa,SAAqB,WAAW,MAAM,QAAQ,IAAI,CAAC;AACtE,MAAM,cAAc,UAAwB,YAAY,MAAM,QAAQ,KAAK,CAAC;AAE5E,SAAS,WAAc,SAA+B;CACpD,IAAI,CAAC,QAAQ,IACX,MAAM,IAAI,gBAAgB,QAAQ,OAAO;CAE3C,OAAO,QAAQ;AACjB;AAEA,SAAgB,cAAc,QAA0C;CACtE,MAAM,EAAE,QAAQ;CAChB,MAAM,UAAU,EACd,aAAa,OAAO,kBAAkB,EACxC;CACA,MAAM,OAAO,iBAAiB;CAG9B,MAAM,YAAY,UAAqC;EACrD,MAAM,KAAK,IAAI,YAAY,WAAW,KAAK;EAC3C,OAAO,IAAI,YAAY,IAAI,EAAE;CAC/B;CAEA,MAAM,UAAU,OACd,OACA,WACkD;EAElD,MAAM,MAAM,WAAW,MADV,SAAS,KACU,CAAC,CAAC,OAAO,CAAC;EAE1C,IAAI,CAAC,KACH,MAAM,IAAI,yBAAyB,KAAK;EAG1C,OAAO,WAAW,SAAS,GAAG,GAAG,QAAQ,aAAa,CAAC,SAAS,QAAQ,CAAC;CAC3E;CAEA,OAAO;EACL,MAAM;GACJ,KAAK;GAEL,MAAM,KACJ,QACkE;IAClE,MAAM,UAA0B;KAC9B,cAAc,QAAQ;KACtB,UACE,QAAQ,WAAW,KAAA,IACf,KAAA,IACA,MAAM,QAAQ,OAAO,MAAM,IACzB,OAAO,SACP,CAAC,OAAO,MAAM;KACtB,OAAO,QAAQ,YAAY,SAAS;KACpC,QAAQ,QAAQ,YAAY;KAC5B,WAAW,QAAQ,YAAY;KAC/B,aAAa,QAAQ;IACvB;IAGA,MAAM,YACJ,OAAO,cAAc,QAAQ,KAAK,KAClC,QAAQ,SAAS,KACjB,QAAQ,SAAA,MACJ,MAAM,IAAI,eAAe,mBAAmB,QAAQ,OAAO,CAAC,IAC5D,KAAA;IACN,IAAI,WACF,OAAO;KACL,MAAM,UAAU,KAAK,KAAK,QACxB,WAAW,SAAS,GAAG,GAAG,QAAQ,aAAa,CAAC,SAAS,QAAQ,CAAC,CACpE;KACA,QAAQ,UAAU;KAClB,SAAS,UAAU;IACrB;IAGF,OAAO,MAAM,aACX;KACE,WAAW,YAAY,IAAI,eAAe,SAAS,OAAO;KAC1D,SAAS,OAAO,UAAU;MACxB,IAAI;OACF,OAAQ,MAAM,QAAQ,KAAK;MAC7B,SAAS,OAAO;OACd,IAAI,yBAAyB,GAAG,KAAK,KAAK,gBAAgB,GAAG,KAAK,GAAG,OAAO;OAC5E,MAAM;MACR;KACF;IACF,GACA,OACF;GACF;EACF;EAEA,QAAQ;GACN,MAAM,OACJ,OACA,MACA,QACsB;IAKtB,OAAO,kBAAkB,MAAM,QAAQ,IAAI,CAAC;IAC5C,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,MAAM,IAAI,mBAAmB,kCAAkC,EAAE,QAAQ,IAAI,CAAC;IAIhF,IAAI;IACJ,IAAI,KAAK,cAAc,kBAAkB,CAAC,SAAS,UAAU,KAC3D,iBAAiB,QAAQ,KAAK;SACzB,IAAI,CAAC,OACV,MAAM,IAAI,mBAAmB,gDAAgD,EAC3E,QAAQ,IACV,CAAC;SAED,iBAAiB;IAGnB,MAAM,OAAO,SAAS,cAAc;IAEpC,IAAI;IACJ,IAAI;IAGJ,IAAI,KAAK,cAAc,gBAAgB;KACrC,MAAM,QAAQ;MACZ,OAAO;MACP,QAAQ,KAAK;KACf;KACA,MAAM,YAAY,MAAM,IAAI,eAAe,YAAY,KAAK,UAAU,OAAO,KAAK;KAClF,IAAI,UAAU,UAAU;MACtB,cAAc;MACd,gBAAgB;OACd;OACA,aAAa,UAAU;OACvB,OAAO,KAAK,UAAU;MACxB;KACF,OACE,cAAc,UAAU;IAE5B;IAQA,IAAI;IACJ,IAAI;KASF,gBAAgB,uBAAuB,MARJ,KAAK,WAAW;MACjD,OAAO;MACP;MACA;MACA;MACA,aAAa,eAAe,YAAY;MACxC;KACF,CAAC,CACiD;IACpD,SAAS,OAAO;KACd,IAAI,eAAe;MACjB,IAAI;MACJ,IAAI;OACF,aAAa,MAAM,KAAK,sBAAsB;QAC5C,QAAQ,cAAc,MAAM;QAC5B,OAAO,cAAc;QACrB,SAAS,cAAc,YAAY;OACrC,CAAC;MACH,QAAQ;OAGN,MAAM;MACR;MACA,IAAI,CAAC,WAAW,WACd,MAAM,IAAI,eAAe,uBACvB,cAAc,OACd,cAAc,OACd,cAAc,WAChB;KAEJ;KACA,MAAM;IACR;IAEA,IAAI,cAAc,SAAS,WAAW;KACpC,IAAI,eACF,MAAM,IAAI,eAAe,uBACvB,cAAc,OACd,cAAc,OACd,cAAc,WAChB;KAEF,kBAAkB,cAAc,SAAS,gBAAgB,IAAI;IAC/D;IACA,MAAM,UAAU,cAAc;IAO9B,IAAI,QAAQ,OAAO,CAAC,QAAQ,mBAAmB;KAC7C,IAAI,QAAQ,8BAA8B,KAAA,GACxC,MAAM,IAAI,MAAM,iEAAiE;KAEnF,MAAM,IAAI,eAAe,UACvB,QAAQ,KACR,iBAAiB;MAAE,GAAG,QAAQ;MAAK,OAAO;KAAe,CAAC,GAC1D,QAAQ,yBACV;IACF;IACA,IAAI,QAAQ,aAAa;KACvB,MAAM,aAAa,UAAU,QAAQ,WAAW;KAChD,MAAM,IAAI,eAAe,oBACvB,QAAQ,YAAY,OACpB,QAAQ,YAAY,QACpB,YACA,UAAU,QAAQ,WAAW,GAC7B,eAAe,WACjB;IACF,OAAO,IAAI,eACT,MAAM,IAAI,eAAe,uBACvB,cAAc,OACd,cAAc,OACd,cAAc,WAChB;IAEF,IAAI,QAAQ,cAAc,SAAS,KAAK,CAAC,QAAQ,qBAC/C,MAAM,IAAI,eAAe,mBAAmB;KAC1C,OAAO;KACP,OAAO,QAAQ;IACjB,CAAC;IAGH,MAAM,YACJ,QAAQ,WAAW,KAAA,IACf,CAAC,IACD;KACE,QAAQ,QAAQ;KAChB,QAAQ,QAAQ,UAAU;KAC1B,SAAS,QAAQ,WAAW;IAC9B;IACN,OAAO;KACL,OAAO,QAAQ;KAGf,KAAK,QAAQ,OAAO,QAAQ;KAC5B,MAAM,QAAQ;KACd,MAAM,QAAQ;KACd,MAAM,QAAQ;KACd,aAAa,QAAQ;KACrB,WAAW,QAAQ;KACnB,GAAG;IACL;GACF;GAEA,MAAM,IAAI,OAAe,SAAiB,SAA0C;IAElF,MAAM,QAAQ,WAAW,MADZ,SAAS,KACY,CAAC,CAAC,SAAS,OAAO,CAAC;IAErD,IAAI,CAAC,OACH,MAAM,IAAI,mBAAmB,oBAAoB,WAAW,EAC1D,QAAQ,IACV,CAAC;IAGH,OAAO,WAAW,KAAK;GACzB;GAEA,MAAM,KAAK,QAA6D;IACtE,MAAM,EAAE,UAAU;IAClB,MAAM,QAAQ,QAAQ,YAAY,SAAS;IAG3C,MAAM,SAAS,WACb,MAFW,SAAS,KAEX,CAAC,CAAC,WAAW;KACpB;KACA,QAAQ,QAAQ,YAAY,UAAU,KAAA;KACtC,WAAW,OAAO,YAAY,aAAa;IAC7C,CAAC,CACH;IAEA,OAAO;KACL,MAAM,OAAO,KAAK,IAAI,UAAU;KAChC,QAAQ,OAAO;KACf,SAAS,OAAO;IAClB;GACF;GAEA,MAAM,oBAAoB,QAAQ;IAChC,MAAM,QAAQ,OAAO,YAAY,SAAS;IAC1C,MAAM,OAAO,SAAS,OAAO,KAAK;IAClC,MAAM,UAAmB,CAAC;IAC1B,IAAI,aAAa,OAAO,YAAY;IACpC,IAAI,YAAY;IAKhB,OAAO,QAAQ,UAAU,SAAS,CAAC,WAAW;KAC5C,MAAM,OAAO,WACX,MAAM,KAAK,WAAW;MACpB,OAAO,KAAK,IAAI,KAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,CAAC;MAC7C,QAAQ;MACR,WAAW,OAAO,YAAY,aAAa;KAC7C,CAAC,CACH;KACA,KAAK,MAAM,SAAS,KAAK,MACvB,IAAI,MAAM,kBAAkB,OAAO,eAAe;MAChD,QAAQ,KAAK,KAAK;MAClB,IAAI,QAAQ,SAAS,OAAO;KAC9B;KAEF,YAAY,CAAC,KAAK;KAClB,aAAa,KAAK,UAAU,KAAK,KAAK,GAAG,EAAE,CAAC,EAAE;KAC9C,IAAI,KAAK,KAAK,WAAW,GAAG,YAAY;IAC1C;IAEA,MAAM,UAAU,QAAQ,SAAS;IACjC,MAAM,OAAO,QAAQ,MAAM,GAAG,KAAK;IACnC,OAAO;KACL,MAAM,KAAK,IAAI,UAAU;KACzB,QAAQ,UAAW,KAAK,GAAG,EAAE,CAAC,EAAE,WAAW,OAAQ;KACnD;IACF;GACF;EACF;EAEA,OAAO;GACL,MAAM,IAAI,OAA2B,QAAgB,QAAwB;IAC3E,IAAI,CAAC,OACH,MAAM,IAAI,mBAAmB,gDAAgD,EAC3E,QAAQ,IACV,CAAC;IAGH,MAAM,OAAO,WAAW,MADX,SAAS,KACW,CAAC,CAAC,QAAQ,MAAM,CAAC;IAElD,IAAI,CAAC,MACH,MAAM,IAAI,mBAAmB,mBAAmB,UAAU,EACxD,QAAQ,IACV,CAAC;IAGH,OAAO,WAAW,UAAU,IAAI,GAAG,QAAQ,aAAa,CAAC,SAAS,QAAQ,CAAC;GAC7E;GAEA,MAAM,KACJ,QACoD;IACpD,MAAM,EAAE,UAAU;IAClB,MAAM,QAAQ,QAAQ,YAAY,SAAS;IAG3C,MAAM,SAAS,WACb,MAFW,SAAS,KAEX,CAAC,CAAC,UAAU;KACnB;KACA,QAAQ,QAAQ,YAAY,UAAU,KAAA;KACtC,WAAW,QAAQ,YAAY,aAAa;IAC9C,CAAC,CACH;IAEA,OAAO;KACL,MAAM,OAAO,KAAK,KAAK,MACrB,WAAW,UAAU,CAAC,GAAG,QAAQ,aAAa,CAAC,SAAS,QAAQ,CAAC,CACnE;KACA,QAAQ,OAAO;KACf,SAAS,OAAO;IAClB;GACF;EACF;EAEA,OAAO;GACL,MAAM,IAAI,QAAgB,QAAwB;IAChD,MAAM,MAAM,MAAM,IAAI,eAAe,YAAY,MAAM;IAEvD,IAAI,CAAC,KACH,MAAM,IAAI,kBAAkB,MAAM;IAIpC,OAAO,eADM,UAAU,MAAY,GAAG,CACb,GAAG,QAAQ,eAAe,KAAK;GAC1D;GAEA,MAAM,WAAW,OAAe,QAAwB;IACtD,MAAM,MAAM,MAAM,IAAI,eAAe,eAAe,KAAK;IAEzD,IAAI,CAAC,KACH,MAAM,IAAI,kBAAkB,KAAK;IAInC,OAAO,eADM,UAAU,MAAY,GAAG,CACb,GAAG,QAAQ,eAAe,KAAK;GAC1D;GAEA,MAAM,KAAK,QAA2D;IACpE,IAAI,CAAC,OAAO,OACV,MAAM,IAAI,mBAAmB,uCAAuC,EAClE,QAAQ,IACV,CAAC;IAEH,MAAM,QAAQ,OAAO;IACrB,MAAM,QAAQ,QAAQ,YAAY,SAAS;IAG3C,MAAM,SAAS,WACb,MAFW,SAAS,KAEX,CAAC,CAAC,UAAU;KACnB;KACA,QAAQ,QAAQ,YAAY,UAAU,KAAA;KACtC,WAAW,QAAQ,YAAY,aAAa;IAC9C,CAAC,CACH;IAEA,OAAO;KACL,MAAM,OAAO,KAAK,KAAK,MAAM,eAAe,UAAU,CAAC,GAAG,QAAQ,eAAe,KAAK,CAAC;KACvF,QAAQ,OAAO;KACf,SAAS,OAAO;IAClB;GACF;EACF;CACF;AACF;;;ACnuBA,MAAM,uBAAuB;AAC7B,MAAM,0BAAA;AACN,MAAM,sBAAA;AACN,MAAM,+BAA+B;AAErC,SAAS,QAAQ,OAAwC;CACvD,OAAO,OAAO,UAAU,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,IAAI;AACvE;AAEA,SAAS,cAAc,QAAgC;CACrD,IAAI,OAAO,UAAU,WAAW,MAAM,IAAI,MAAM,oBAAoB;CACpE,IAAI,OAAO,UAAU,WAAW;EAC9B,MAAM,QAAQ,IAAI,MAAM,OAAO,OAAO,WAAW,eAAe;EAChE,MAAM,OAAO,OAAO,OAAO,QAAQ;EACnC,MAAM;CACR;AACF;AAEA,SAAgB,eAAe,QAA4C;CACzE,MAAM,EAAE,QAAQ;CAChB,MAAM,mBAAmB,OAAO,oBAAoB;CACpD,IACE,CAAC,OAAO,cAAc,gBAAgB,KACtC,mBAAmB,KACnB,mBAAA,KAEA,MAAM,IAAI,MAAM,0CAA0C,yBAAyB;CAErF,MAAM,wBAAwB,OAAO,yBAAyB;CAC9D,IAAI,CAAC,OAAO,cAAc,qBAAqB,KAAK,wBAAwB,GAC1E,MAAM,IAAI,MAAM,2DAA2D;CAG7E,MAAM,eAAe,eAAqC;EACxD,MAAM,KAAK,IAAI,iBAAiB,WAAW,UAAU,YAAY;EACjE,OAAO,IAAI,iBAAiB,IAAI,EAAE;CACpC;CAEA,MAAM,oBAAoB,UAAgC;EACxD,MAAM,KAAK,IAAI,iBAAiB,WAAW,eAAe,OAAO;EACjE,OAAO,IAAI,iBAAiB,IAAI,EAAE;CACpC;;CAGA,MAAM,oCAAoB,IAAI,IAAY;CAE1C,eAAe,qBAAqB,MAAc,OAA8B;EAC9E,MAAM,WAAW,GAAG,MAAM,IAAI;EAC9B,IAAI,kBAAkB,IAAI,QAAQ,GAAG;EACrC,MAAM,iBAAiB,KAAK,CAAC,CAAC,eAAe,OAAO,IAAI;EACxD,IAAI,kBAAkB,QAAQ,8BAA8B;GAC1D,MAAM,SAAS,kBAAkB,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;GACjD,IAAI,WAAW,KAAA,GAAW,kBAAkB,OAAO,MAAM;EAC3D;EACA,kBAAkB,IAAI,QAAQ;CAChC;CAEA,MAAM,sBAAsB,OAC1B,MACA,OACA,UACkB;EAClB,IAAI,MAAM,WAAW,GAAG;EACxB,MAAM,gBAAgB,MAAM;EAC5B,MAAM,SAAS,MAAM,IAAI,OAAO;EAChC,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,aAAA,SACR,MAAM,IAAI,MAAM,wBAAwB,uBAAuB,OAAO;EAG1E,MAAM,qBAAqB,MAAM,aAAa;EAE9C,MAAM,OAAO,YAAY,IAAI;EAC7B,IAAI,OAAO;EACX,OAAO,OAAO,OAAO,QAAQ;GAE3B,MAAM,aAAa,KAAK,mBAAmB,KAAA;GAC3C,IAAI,MAAM;GACV,IAAI,aAAa;GACjB,OACE,MAAM,OAAO,UACb,MAAM,OAAO,eACZ,QAAQ,QAAQ,aAAa,OAAO,IAAI,CAAC,cAAA,UAC1C;IACA,cAAc,OAAO,IAAI,CAAC;IAC1B;GACF;GACA,MAAM,QAAQ,OAAO,MAAM,MAAM,GAAG;GACpC,IAAI;IACF,MAAM,KAAK,YAAY,eAAe,KAAK;GAC7C,SAAS,OAAO;IAEd,IAAI,MAAM,SAAA,MAAoC,sBAAsB,KAAK,GAAG;KAC1E,KAAK,wBAAwB;KAC7B;IACF;IACA,MAAM;GACR;GACA,OAAO;EACT;CACF;CAEA,MAAM,iBACJ,MACA,OACA,UACkB,oBAAoB,MAAM,OAAO,CAAC,KAAK,CAAC;CAE5D,MAAM,cAAc,OAAO,MAAc,UAAmD;EAC1F,MAAM,gBAAgB,MAAM;EAC5B,MAAM,qBAAqB,MAAM,aAAa;EAC9C,MAAM,YAAY,IAAI,CAAC,CAAC,YAAY,aAAa;CACnD;CAEA,MAAM,cAAc,OAClB,MACA,OACA,UACkB;EAClB,MAAM,gBAAgB,MAAM;EAC5B,MAAM,qBAAqB,MAAM,aAAa;EAC9C,MAAM,YAAY,IAAI,CAAC,CAAC,WAAW,eAAe,qBAAqB,KAAK,CAAC;CAC/E;CAEA,MAAM,iBAAiB,OACrB,MACA,OACA,aAAa,MAC2B;EACxC,MAAM,OAAO,YAAY,IAAI;EAE7B,IAAI;EACJ,IAAI,aAAa,GAAG;GAClB,MAAM,OAAO,MAAM,KAAK,WAAW;IACjC;IACA,YAAY;IACZ,WAAW;IACX,UAAU;IACV,QAAQ;GACV,CAAC;GACD,cAAc,IAAI;GAClB,YAAY,KAAK,IAAI,GAAG,KAAK,YAAY,IAAI,UAAU;EACzD,OACE,YAAY;EAGd,IAAI,YAAY;EAChB,MAAM,kBAAkB,IAAI,gBAAgB;EAE5C,OAAO,IAAI,eAA2B;GACpC,MAAM,KAAK,YAAY;IACrB,SAAS;KACP,IAAI,WAAW;KACf,IAAI;KACJ,IAAI;MACF,SAAS,MAAM,KAAK,WAClB;OACE;OACA,YAAY;OACZ,WAAW,KAAK,mBAAmB,KAAA;OACnC,UAAU;OACV,QAAQ;MACV,GACA,gBAAgB,MAClB;KACF,SAAS,OAAO;MACd,IAAI,aAAa,gBAAgB,OAAO,SAAS;MACjD,MAAM;KACR;KAEA,IAAI,OAAO,OAAO,SAAS,GAAG;MAC5B,KAAK,MAAM,SAAS,OAAO,QAAQ,WAAW,QAAQ,KAAK;MAC3D,aAAa,OAAO,OAAO;MAC3B;KACF;KACA,cAAc,MAAM;KACpB,IAAI,OAAO,UAAU,UAAU;MAC7B,WAAW,MAAM;MACjB;KACF;IAGF;GACF;GAEA,SAAS;IACP,YAAY;IACZ,gBAAgB,MAAM,IAAI,aAAa,2BAA2B,YAAY,CAAC;GACjF;EACF,CAAC;CACH;CAEA,MAAM,sBAAsB,UAC1B,iBAAiB,KAAK,CAAC,CAAC,YAAY;CAEtC,MAAM,kBAAkB,OACtB,MACA,OACA,YACkC;EAClC,MAAM,iBAAiB,SAAS,SAAS;EACzC,IAAI,CAAC,OAAO,cAAc,cAAc,KAAK,iBAAiB,GAC5D,MAAM,IAAI,MAAM,oDAAoD;EAEtE,MAAM,OAAO,YAAY,IAAI;EAC7B,MAAM,QAAQ,KAAK,IAAI,gBAAgB,KAAK,mBAAmB,KAAK,mBAAmB;EACvF,MAAM,aAAa,SAAS,SAAS,OAAO,SAAS,QAAQ,QAAQ,EAAE,IAAI;EAC3E,IAAI,OAAO,MAAM,UAAU,KAAK,aAAa,GAC3C,MAAM,IAAI,MAAM,0BAA0B,SAAS,QAAQ;EAG7D,MAAM,SAAS,MAAM,KAAK,WAAW;GACnC;GACA;GACA,WAAW;GACX,UAAU;GACV,QAAQ;EACV,CAAC;EACD,cAAc,MAAM;EACpB,MAAM,OAAsB,OAAO,OAAO,KAAK,OAAO,YAAY;GAChE,OAAO,aAAa;GACpB,MAAM;EACR,EAAE;EACF,MAAM,YAAY,aAAa,KAAK;EACpC,MAAM,UAAU,aAAa,OAAO;EAEpC,OAAO;GACL;GACA,QAAQ,UAAU,OAAO,SAAS,IAAI;GACtC;GACA,MAAM,OAAO,UAAU;EACzB;CACF;CAEA,MAAM,gBAAgB,OAAO,MAAc,UAA+C;EACxF,MAAM,SAAS,MAAM,YAAY,IAAI,CAAC,CAAC,WAAW;GAChD;GACA,YAAY;GACZ,WAAW;GACX,UAAU;GACV,QAAQ;EACV,CAAC;EACD,cAAc,MAAM;EACpB,OAAO;GAAE,WAAW,OAAO;GAAW,MAAM,OAAO,UAAU;EAAS;CACxE;CAEA,OAAO;EACL;EACA,SAAS;GACP,QAAQ,OAAO,MAAM,UAAU,cAAc,MAAM,OAAO,KAAK;GAC/D,aAAa,OAAO,MAAM,WAAW,oBAAoB,MAAM,OAAO,MAAM;GAC5E,QAAQ,OAAO,SAAS,YAAY,MAAM,KAAK;GAC/C,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,OAAO,KAAK;GAC5D,MAAM,OAAO,MAAM,eAAe,eAAe,MAAM,OAAO,UAAU;GACxE,MAAM;GACN,YAAY,OAAO,MAAM,YAAY,gBAAgB,MAAM,OAAO,OAAO;GACzE,UAAU,OAAO,SAAS,cAAc,MAAM,KAAK;EACrD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;;;;;ACtUA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;AACF;AAEA,SAAgB,iBAAiB,QAAuC;CACtE,MAAM,WAAW,cAAc,MAAM;CAGrC,IAAI,MAAM,SAAS;CACnB,IAAI,CAAC,KAAK;EACR,MAAM,YAAa,WAA6C;EAChE,IAAI,WACF,MAAM;CAEV;CAEA,IAAI,CAAC,KACC;MAAA,SAAS,UAAU;GACrB,IAAI,CAAC,SAAS,QACZ,MAAM,IAAI,MACR,8EACF;GAEF,MAAM,gBAAgB;IACpB,UAAU,SAAS;IACnB,QAAQ,SAAS;IACjB,WAAW,SAAS;GACtB,CAAC;EACH;;CAGF,IAAI,CAAC,KACH,MAAM,IAAI,MACR,4MAGF;CAGF,KAAK,MAAM,WAAW,uBACpB,IAAI,CAAC,IAAI,UACP,MAAM,IAAI,MAAM,uDAAuD,SAAS;CAIpF,MAAM,UAAU,cAAc;EAC5B,KAAK;GACH,aAAa,IAAI;GACjB,gBAAgB,IAAI;EACtB;EACA,cAAc,SAAS;EACvB,gBAAgB,SAAS;CAC3B,CAAC;CAED,MAAM,QAAQ,YAAY;EACxB,KAAK,EACH,gBAAgB,IAAI,eACtB;EACA,cAAc,SAAS;EACvB,SAAS,SAAS;CACpB,CAAC;CAED,MAAM,WAAW,eAAe;EAC9B,KAAK,EACH,kBAAkB,IAAI,iBACxB;EACA,kBAAkB,SAAS;EAC3B,uBAAuB,SAAS;CAClC,CAAC;CAED,MAAM,WAAW,UAAkB,IAAI,YAAY,IAAI,IAAI,YAAY,WAAW,KAAK,CAAC;CACxF,MAAM,YAAiC;EACrC,YAAY,UAAU,QAAQ,KAAK,CAAC,CAAC,iBAAiB;EACtD,WAAW,UAAU;GACnB,IAAI,SAAS,mBAAmB,GAC9B,MAAM,IAAI,MACR,2EACF;GAEF,OAAO,QAAQ,KAAK,CAAC,CAAC,gBAAgB,EACpC,aAAa,SAAS,eACxB,CAAC;EACH;EACA,aAAa,UACX,QAAQ,KAAK,CAAC,CAAC,WAAW,EACxB,aAAa,KAAK,IAAI,GAAG,SAAS,cAAc,EAClD,CAAC;EACH,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,aAAa;CAChD;CAEA,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH;EAIA,aAAa;CACf;AACF"}
1
+ {"version":3,"file":"index.js","names":["RETRYABLE_STATUSES","delayMs"],"sources":["../src/config.ts","../src/remote/errors.ts","../src/remote/rpc-client.ts","../src/remote/stream-client.ts","../src/remote/namespaces.ts","../src/vendor/shared/debug.ts","../src/util.ts","../src/queue.ts","../src/storage.ts","../src/streamer.ts","../src/index.ts"],"sourcesContent":["import type { WorkflowRunDONamespace } from './storage.js';\nimport type { StreamDONamespace } from './streamer.js';\nimport type { CelldQueueProducer } from './queue.js';\nimport { MAX_STREAM_LONG_POLL_MS } from './stream-protocol.js';\nimport type { WorkflowIndex } from './indexes.js';\nimport { MAX_FLEET_RPC_TIMEOUT_MS } from './lifecycle.js';\nimport { boundedIntegerOption, strictIntegerSetting } from './validation.js';\n\n/** Public alias retained for custom in-process environments. */\nexport type IndexNamespace = WorkflowIndex;\n\nexport interface HookTokenOwner {\n runId: string;\n hookId: string;\n}\n\nexport interface CelldWorldEnv {\n WORKFLOW_DB: WorkflowRunDONamespace;\n WORKFLOW_INDEX: IndexNamespace;\n WORKFLOW_QUEUE: CelldQueueProducer;\n WORKFLOW_STREAMS: StreamDONamespace;\n}\n\nexport interface CelldWorldConfig {\n /**\n * Base URL of any celld fleet node's public listener (e.g.\n * `http://fleet.internal:8080`). Requests are routed to the deployed\n * world-celld worker, which forwards them to the owning cells.\n * Default: process.env.CELLD_FLEET_URL\n */\n fleetUrl?: string;\n /**\n * Bearer secret shared with the worker (its WORLD_SECRET var).\n * Default: process.env.CELLD_WORLD_SECRET\n */\n secret?: string;\n /**\n * Pre-built namespaces (used by tests and the in-process harness). When\n * provided, fleetUrl/secret are not used.\n */\n env?: CelldWorldEnv;\n /** Default: process.env.CELLD_DEPLOYMENT_ID || 'celld-default' */\n deploymentId?: string;\n /**\n * Base URL the app's workflow endpoints are mounted on; the native Queue\n * consumer delivers to `${baseUrl}/.well-known/workflow/v1/flow`.\n * Default: process.env.WORKFLOW_BASE_URL || `http://localhost:${PORT ?? 3000}`\n */\n baseUrl?: string;\n /**\n * Keep terminal run payloads for this many milliseconds before replacing\n * them with metadata-only tombstones. Zero disables automatic cleanup.\n * Default: process.env.CELLD_RUN_RETENTION_MS || 0\n */\n runRetentionMs?: number;\n /** Duration of one bounded idle stream read. Default: 20000 */\n streamLongPollMs?: number;\n /** Runtime stream batching delay. Default: 0 */\n streamFlushIntervalMs?: number;\n /** Per-attempt fleet RPC deadline in milliseconds. Default: 30000 */\n rpcTimeoutMs?: number;\n}\n\nexport interface ResolvedCelldConfig {\n fleetUrl?: string;\n secret?: string;\n env?: CelldWorldEnv;\n deploymentId: string;\n baseUrl?: string;\n runRetentionMs: number;\n streamLongPollMs: number;\n streamFlushIntervalMs: number;\n rpcTimeoutMs: number;\n}\n\nexport function resolveConfig(config?: CelldWorldConfig): ResolvedCelldConfig {\n const runRetentionMs =\n config?.runRetentionMs !== undefined\n ? boundedIntegerOption('world-celld: runRetentionMs', config.runRetentionMs, 0, 0)\n : strictIntegerSetting(\n 'world-celld: runRetentionMs',\n process.env.CELLD_RUN_RETENTION_MS,\n 0,\n 0,\n );\n\n const rpcTimeoutMs = config?.rpcTimeoutMs ?? 30_000;\n if (\n !Number.isSafeInteger(rpcTimeoutMs) ||\n rpcTimeoutMs < 1 ||\n rpcTimeoutMs > MAX_FLEET_RPC_TIMEOUT_MS\n ) {\n throw new Error(`world-celld: rpcTimeoutMs must be between 1 and ${MAX_FLEET_RPC_TIMEOUT_MS}`);\n }\n const streamLongPollMs =\n config?.streamLongPollMs ??\n Math.min(MAX_STREAM_LONG_POLL_MS, Math.max(1, rpcTimeoutMs - 1_000));\n if (\n !Number.isSafeInteger(streamLongPollMs) ||\n streamLongPollMs < 1 ||\n streamLongPollMs > MAX_STREAM_LONG_POLL_MS\n ) {\n throw new Error(\n `world-celld: streamLongPollMs must be between 1 and ${MAX_STREAM_LONG_POLL_MS}`,\n );\n }\n if (streamLongPollMs >= rpcTimeoutMs) {\n throw new Error('world-celld: streamLongPollMs must be less than rpcTimeoutMs');\n }\n const streamFlushIntervalMs = config?.streamFlushIntervalMs ?? 0;\n if (!Number.isSafeInteger(streamFlushIntervalMs) || streamFlushIntervalMs < 0) {\n throw new Error('world-celld: streamFlushIntervalMs must be a non-negative safe integer');\n }\n\n return {\n fleetUrl: config?.fleetUrl ?? process.env.CELLD_FLEET_URL,\n secret: config?.secret ?? process.env.CELLD_WORLD_SECRET,\n env: config?.env,\n deploymentId: config?.deploymentId ?? process.env.CELLD_DEPLOYMENT_ID ?? 'celld-default',\n baseUrl: config?.baseUrl,\n runRetentionMs,\n streamLongPollMs,\n streamFlushIntervalMs,\n rpcTimeoutMs,\n };\n}\n","import { WorkflowWorldError } from '@workflow/errors';\n\nexport interface WireError {\n name?: string;\n message?: string;\n status?: number;\n}\n\n/**\n * Reconstruct a typed error from a router error payload. `@workflow/errors`\n * matches with name-based `.is()` checks, so a WorkflowWorldError with the\n * original name (and status) restored behaves identically to the source\n * error for every consumer in the workflow runtime.\n */\nexport function reconstructError(wire: WireError | undefined, httpStatus: number): Error {\n const message = wire?.message ?? `world-celld rpc failed with HTTP ${httpStatus}`;\n const error = new WorkflowWorldError(message, {\n status: wire?.status ?? httpStatus,\n });\n if (wire?.name) {\n error.name = wire.name;\n }\n return error;\n}\n\n/** Transport-level failure (fleet unreachable, malformed response). */\nexport class FleetTransportError extends Error {\n constructor(\n message: string,\n readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'FleetTransportError';\n }\n}\n","import { rpcParse, rpcStringify } from '../codec.js';\nimport { FleetTransportError, reconstructError, type WireError } from './errors.js';\nimport { FLEET_IDEMPOTENT_ATTEMPTS, MAX_FLEET_RPC_TIMEOUT_MS } from '../lifecycle.js';\n\nexport interface RpcTransport {\n fleetUrl: string;\n secret: string;\n /** Per-attempt request deadline. Default: 30 seconds. */\n timeoutMs?: number;\n /** Injectable for tests. Default: globalThis.fetch */\n fetchImpl?: typeof fetch;\n}\n\n/** Statuses that mean \"the fleet couldn't take the request\" (safe to retry reads). */\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction delayMs(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function resolveFleetTimeoutMs(transport: RpcTransport): number {\n const timeoutMs = transport.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_FLEET_RPC_TIMEOUT_MS) {\n throw new Error(\n `world-celld: fleet RPC timeout must be between 1 and ${MAX_FLEET_RPC_TIMEOUT_MS}`,\n );\n }\n return timeoutMs;\n}\n\n/**\n * Invoke one DO method through the worker router.\n *\n * Mutating calls run exactly once from the client's perspective: a blind\n * retry of e.g. applyEvent would turn commit-then-network-fail into a\n * spurious ENTITY_CONFLICT. The workflow runtime already gets at-least-once\n * via queue redelivery. Read-only calls retry on transport failures.\n */\nexport async function callDO<T>(\n transport: RpcTransport,\n binding: string,\n name: string,\n method: string,\n args: unknown[],\n opts?: { idempotent?: boolean },\n): Promise<T> {\n return await callFleetRoute(\n transport,\n `/v1/rpc/${binding}/${encodeURIComponent(name)}/${method}`,\n args,\n opts,\n );\n}\n\n/** Invoke a fixed authenticated worker route using the generic RPC codec. */\nexport async function callFleetRoute<T>(\n transport: RpcTransport,\n path: string,\n args: unknown[],\n opts?: { idempotent?: boolean },\n): Promise<T> {\n const doFetch = transport.fetchImpl ?? fetch;\n const url = `${transport.fleetUrl.replace(/\\/$/, '')}${path}`;\n const attempts = opts?.idempotent ? FLEET_IDEMPOTENT_ATTEMPTS : 1;\n const timeoutMs = resolveFleetTimeoutMs(transport);\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n if (attempt > 1) {\n await delayMs(100 * attempt + Math.random() * 200);\n }\n let response: Response;\n try {\n response = await doFetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${transport.secret}`,\n },\n body: rpcStringify(args),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n lastError = new FleetTransportError(`world-celld: fleet unreachable at ${url}`, error);\n continue;\n }\n\n if (response.ok) {\n try {\n return rpcParse<T>(await response.text());\n } catch (error) {\n lastError = new FleetTransportError(\n `world-celld: malformed successful response from ${url}`,\n error,\n );\n if (attempt < attempts) continue;\n throw lastError;\n }\n }\n\n let text: string;\n try {\n text = await response.text();\n } catch (error) {\n lastError = new FleetTransportError(\n `world-celld: interrupted error response from ${url}`,\n error,\n );\n // Headers can arrive before the connection fails. Reading the body is\n // part of the transport attempt, with the same bounded retry policy.\n continue;\n }\n let wire: WireError | undefined;\n try {\n wire = (JSON.parse(text) as { error?: WireError }).error;\n } catch {\n wire = { message: text || `HTTP ${response.status}` };\n }\n\n if (RETRYABLE_STATUSES.has(response.status) && attempt < attempts) {\n lastError = reconstructError(wire, response.status);\n continue;\n }\n\n throw reconstructError(wire, response.status);\n }\n\n throw lastError instanceof Error\n ? lastError\n : new FleetTransportError('world-celld: rpc failed', lastError);\n}\n","import {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n MAX_STREAM_WRITE_CHUNKS,\n NEGOTIATED_STREAM_CHUNKS,\n STREAM_BATCH_CONTENT_TYPE,\n STREAM_CHUNK_LIMIT_HEADER,\n isChunkLimitRejection,\n decodeStreamReadResult,\n decodeStreamWriteResult,\n encodeStreamWriteBatch,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamWriteResult,\n} from '../stream-protocol.js';\nimport { FleetTransportError, reconstructError, type WireError } from './errors.js';\nimport { resolveFleetTimeoutMs, type RpcTransport } from './rpc-client.js';\n\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\nconst READ_ATTEMPTS = 3;\nconst MAX_WRITE_RESPONSE_BYTES = 64;\nconst MAX_READ_RESPONSE_BYTES = MAX_STREAM_READ_BYTES + 64 * 1024;\nconst MAX_ERROR_RESPONSE_BYTES = 64 * 1024;\n\n/**\n * Per-request chunk limit the fleet has advertised, per transport. Absent\n * until a worker advertises one, so a client never sends an older worker more\n * than the baseline it accepts; a response without the header drops back.\n */\nconst advertisedChunkLimits = new WeakMap<RpcTransport, number>();\n\nexport function streamChunkLimit(transport: RpcTransport): number {\n return advertisedChunkLimits.get(transport) ?? MAX_STREAM_WRITE_CHUNKS;\n}\n\nexport function resetStreamChunkLimit(transport: RpcTransport): void {\n advertisedChunkLimits.delete(transport);\n}\n\nfunction recordStreamChunkLimit(transport: RpcTransport, response: Response): void {\n const advertised = Number(response.headers.get(STREAM_CHUNK_LIMIT_HEADER));\n if (Number.isSafeInteger(advertised) && advertised > MAX_STREAM_WRITE_CHUNKS) {\n advertisedChunkLimits.set(transport, Math.min(advertised, NEGOTIATED_STREAM_CHUNKS));\n } else {\n advertisedChunkLimits.delete(transport);\n }\n}\n\nfunction delayMs(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));\n if (signal.aborted) return Promise.reject(aborted(signal));\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n reject(aborted(signal));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction requestSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\n const timeout = AbortSignal.timeout(timeoutMs);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction aborted(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');\n}\n\nasync function readBoundedResponse(response: Response, maxBytes: number): Promise<Uint8Array> {\n const contentLength = Number(response.headers.get('content-length') ?? '0');\n if (contentLength > maxBytes) {\n await response.body?.cancel('stream response exceeds configured limit').catch(() => undefined);\n throw new FleetTransportError(`world-celld: stream response exceeds ${maxBytes} bytes`);\n }\n if (!response.body) return new Uint8Array();\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel('stream response exceeds configured limit').catch(() => undefined);\n throw new FleetTransportError(`world-celld: stream response exceeds ${maxBytes} bytes`);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nasync function errorFromResponse(response: Response): Promise<Error> {\n const text = new TextDecoder().decode(\n await readBoundedResponse(response, MAX_ERROR_RESPONSE_BYTES),\n );\n let wire: WireError | undefined;\n try {\n wire = (JSON.parse(text) as { error?: WireError }).error;\n } catch {\n wire = { message: text || `HTTP ${response.status}` };\n }\n return reconstructError(wire, response.status);\n}\n\nfunction streamUrl(transport: RpcTransport, name: string): string {\n return `${transport.fleetUrl.replace(/\\/$/, '')}/v1/streams/${encodeURIComponent(name)}/chunks`;\n}\n\nexport async function writeStreamChunks(\n transport: RpcTransport,\n name: string,\n runId: string,\n chunks: Uint8Array[],\n): Promise<StreamWriteResult> {\n const timeoutMs = resolveFleetTimeoutMs(transport);\n const body = encodeStreamWriteBatch(chunks);\n if (body.byteLength > MAX_STREAM_BATCH_BYTES + 4 * NEGOTIATED_STREAM_CHUNKS + 1024) {\n throw new Error('world-celld: encoded stream batch exceeds configured limit');\n }\n const url = new URL(streamUrl(transport, name));\n url.searchParams.set('runId', runId);\n const doFetch = transport.fetchImpl ?? fetch;\n\n let response: Response;\n try {\n response = await doFetch(url, {\n method: 'POST',\n headers: {\n 'content-type': STREAM_BATCH_CONTENT_TYPE,\n authorization: `Bearer ${transport.secret}`,\n },\n body,\n signal: requestSignal(timeoutMs),\n });\n } catch (error) {\n throw new FleetTransportError(`world-celld: fleet unreachable at ${url.href}`, error);\n }\n\n if (!response.ok) throw await errorFromResponse(response);\n recordStreamChunkLimit(transport, response);\n try {\n const result = decodeStreamWriteResult(\n await readBoundedResponse(response, MAX_WRITE_RESPONSE_BYTES),\n );\n if (result.count !== chunks.length) {\n throw new Error('Stream write acknowledgement does not match the requested chunk count');\n }\n return result;\n } catch (error) {\n if (error instanceof FleetTransportError) throw error;\n throw new FleetTransportError(`world-celld: malformed stream response from ${url.href}`, error);\n }\n}\n\nexport async function readStreamChunks(\n transport: RpcTransport,\n name: string,\n request: StreamReadRequest,\n signal?: AbortSignal,\n): Promise<StreamReadResult> {\n const timeoutMs = resolveFleetTimeoutMs(transport);\n const url = new URL(streamUrl(transport, name));\n url.searchParams.set('runId', request.runId);\n url.searchParams.set('startIndex', String(request.startIndex));\n url.searchParams.set('maxChunks', String(request.maxChunks));\n url.searchParams.set('maxBytes', String(request.maxBytes));\n url.searchParams.set('waitMs', String(request.waitMs));\n const doFetch = transport.fetchImpl ?? fetch;\n let lastError: unknown;\n let maxChunks = request.maxChunks;\n\n for (let attempt = 1; attempt <= READ_ATTEMPTS; attempt++) {\n if (signal?.aborted) throw aborted(signal);\n if (attempt > 1) await delayMs(100 * attempt + Math.random() * 200, signal);\n let response: Response;\n try {\n response = await doFetch(url, {\n method: 'GET',\n headers: { authorization: `Bearer ${transport.secret}` },\n signal: requestSignal(timeoutMs, signal),\n });\n } catch (error) {\n if (signal?.aborted) throw aborted(signal);\n lastError = new FleetTransportError(`world-celld: fleet unreachable at ${url.href}`, error);\n continue;\n }\n\n if (signal?.aborted) {\n await response.body?.cancel(aborted(signal)).catch(() => undefined);\n throw aborted(signal);\n }\n\n if (response.ok) {\n recordStreamChunkLimit(transport, response);\n try {\n const result = decodeStreamReadResult(\n await readBoundedResponse(response, MAX_READ_RESPONSE_BYTES),\n );\n // A structurally valid frame can still be a stale or partial reply.\n // Do not expose output or advance its offset until it matches this\n // request's range and bounds. Reads can safely retry the same offset.\n if (\n result.startIndex !== request.startIndex ||\n result.chunks.length > maxChunks ||\n result.chunks.reduce((bytes, chunk) => bytes + chunk.byteLength, 0) > request.maxBytes ||\n (result.chunks.length > 0 &&\n result.startIndex + result.chunks.length - 1 > result.tailIndex) ||\n (maxChunks > 0 &&\n result.chunks.length === 0 &&\n result.startIndex <= result.tailIndex &&\n result.state !== 'expired')\n ) {\n throw new Error('Stream read response does not match the requested range and bounds');\n }\n return result;\n } catch (error) {\n if (signal?.aborted) throw aborted(signal);\n lastError =\n error instanceof FleetTransportError\n ? error\n : new FleetTransportError(\n `world-celld: malformed stream response from ${url.href}`,\n error,\n );\n if (attempt < READ_ATTEMPTS) continue;\n throw lastError;\n }\n }\n\n let error: Error;\n try {\n error = await errorFromResponse(response);\n } catch (cause) {\n if (signal?.aborted) throw aborted(signal);\n error =\n cause instanceof FleetTransportError\n ? cause\n : new FleetTransportError(\n `world-celld: malformed stream error response from ${url.href}`,\n cause,\n );\n }\n if (RETRYABLE_STATUSES.has(response.status) && attempt < READ_ATTEMPTS) {\n lastError = error;\n continue;\n }\n if (\n request.maxChunks > MAX_STREAM_READ_CHUNKS &&\n isChunkLimitRejection(error) &&\n attempt < READ_ATTEMPTS\n ) {\n // An older worker behind the same fleet URL; reads are safe to repeat.\n resetStreamChunkLimit(transport);\n maxChunks = MAX_STREAM_READ_CHUNKS;\n url.searchParams.set('maxChunks', String(MAX_STREAM_READ_CHUNKS));\n lastError = error;\n continue;\n }\n throw error;\n }\n\n throw lastError instanceof Error\n ? lastError\n : new FleetTransportError('world-celld: stream read failed', lastError);\n}\n","/**\n * HTTP-backed implementations of the structural namespace interfaces the\n * vendored storage/streamer/queue layers consume. `get(id)` returns a stub\n * whose method calls become `POST /v1/rpc/{binding}/{name}/{method}` against\n * the fleet — the celld stand-in for Cloudflare's `env` bindings.\n */\nimport type { CelldWorldEnv } from '../config.js';\nimport {\n createWorkflowIndex,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport type { CelldQueueProducer } from '../queue.js';\nimport type { NativeQueueSendResult } from '../queue-protocol.js';\nimport type { WorkflowRunDOStub } from '../storage.js';\nimport type { StreamDOStub } from '../streamer.js';\nimport type { RunListPage, RunListRequest } from '../run-list.js';\nimport { callDO, callFleetRoute, type RpcTransport } from './rpc-client.js';\nimport {\n readStreamChunks,\n resetStreamChunkLimit,\n streamChunkLimit,\n writeStreamChunks,\n} from './stream-client.js';\n\ninterface MethodSpec {\n methods: readonly string[];\n mutating: ReadonlySet<string>;\n}\n\nconst RUNS: MethodSpec = {\n methods: [\n 'applyEvent',\n 'getLifecycleStatus',\n 'getRun',\n 'getStep',\n 'getEvent',\n 'listEvents',\n 'listSteps',\n 'listHooks',\n 'getCleanupStatus',\n 'scheduleCleanup',\n 'cleanupNow',\n 'rearmCleanup',\n 'resolveHookTokenClaim',\n 'resolveExpiredHookClaim',\n ],\n mutating: new Set([\n 'applyEvent',\n 'scheduleCleanup',\n 'cleanupNow',\n 'rearmCleanup',\n 'resolveHookTokenClaim',\n 'resolveExpiredHookClaim',\n ]),\n};\n\nconst STREAMS: MethodSpec = {\n methods: [\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'listStreams',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ],\n mutating: new Set([\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ]),\n};\n\nfunction makeStreamNamespace(transport: RpcTransport) {\n return {\n idFromName(name: string) {\n return { toString: () => name };\n },\n get(id: { toString(): string }): StreamDOStub {\n const name = id.toString();\n const control = makeStub<StreamDOStub>(transport, 'streams', name, STREAMS);\n control.writeChunks = (runId, chunks) => writeStreamChunks(transport, name, runId, chunks);\n control.readChunks = (request, signal) => readStreamChunks(transport, name, request, signal);\n control.streamChunkLimit = () => streamChunkLimit(transport);\n control.resetStreamChunkLimit = () => resetStreamChunkLimit(transport);\n return control;\n },\n };\n}\n\nfunction makeStub<T>(transport: RpcTransport, binding: string, name: string, spec: MethodSpec): T {\n const stub: Record<string, (...args: unknown[]) => Promise<unknown>> = {};\n for (const method of spec.methods) {\n stub[method] = (...args: unknown[]) =>\n callDO(transport, binding, name, method, args, {\n idempotent: !spec.mutating.has(method),\n });\n }\n return stub as T;\n}\n\nfunction makeNamespace<T>(transport: RpcTransport, binding: string, spec: MethodSpec) {\n return {\n idFromName(name: string) {\n return { toString: () => name };\n },\n get(id: { toString(): string }): T {\n return makeStub<T>(transport, binding, id.toString(), spec);\n },\n };\n}\n\nconst RUN_CATALOG: MethodSpec = {\n methods: ['upsertRun', 'list', 'expireRun'],\n // Every method is idempotent; transport retries cannot duplicate effects.\n mutating: new Set(),\n};\n\nconst HOOK_TOKENS: MethodSpec = {\n methods: ['get', 'reserve', 'finalize', 'releaseClaim', 'releaseBatch'],\n mutating: new Set(),\n};\n\nconst HOOK_IDS: MethodSpec = {\n methods: ['get', 'reserve', 'publish', 'releaseClaim', 'releaseBatch'],\n mutating: new Set(),\n};\n\n/** Transports whose worker answered the fleet-side run listing with 404. */\nconst legacyRunListing = new WeakSet<RpcTransport>();\n\nasync function listResolvedRuns(\n transport: RpcTransport,\n request: RunListRequest,\n): Promise<RunListPage | null> {\n if (legacyRunListing.has(transport)) return null;\n try {\n return await callFleetRoute<RunListPage>(transport, '/v1/index/runs/list-resolved', [request], {\n idempotent: true,\n });\n } catch (error) {\n // A worker that predates the route: list from the client instead.\n if ((error as { status?: unknown }).status === 404) {\n legacyRunListing.add(transport);\n return null;\n }\n throw error;\n }\n}\n\nexport function createRemoteEnv(transport: RpcTransport): CelldWorldEnv {\n const runCatalog = makeNamespace<RunCatalogShardStub>(transport, 'run-catalog', RUN_CATALOG);\n const hookTokens = makeNamespace<HookTokenShardStub>(transport, 'hook-tokens', HOOK_TOKENS);\n const hookIds = makeNamespace<HookIdShardStub>(transport, 'hook-ids', HOOK_IDS);\n const workflowIndex = createWorkflowIndex({ runCatalog, hookTokens, hookIds });\n return {\n WORKFLOW_DB: makeNamespace<WorkflowRunDOStub>(transport, 'runs', RUNS),\n WORKFLOW_STREAMS: makeStreamNamespace(transport),\n WORKFLOW_INDEX: {\n ...workflowIndex,\n commitRun: (run, serializedMetadata, publicationExpiresAt) =>\n callFleetRoute(\n transport,\n '/v1/index/runs/commit',\n [run, serializedMetadata, publicationExpiresAt],\n {\n idempotent: true,\n },\n ),\n listRuns: (options) =>\n callFleetRoute(transport, '/v1/index/runs/list', [options], { idempotent: true }),\n listResolvedRuns: (request) => listResolvedRuns(transport, request),\n expireRun: (request) =>\n callFleetRoute(transport, '/v1/index/runs/expire', [request], { idempotent: true }),\n reserveHook: (token, owner) =>\n callFleetRoute(transport, '/v1/index/hooks/reserve', [token, owner], {\n idempotent: true,\n }),\n finalizeHookIndexes: (token, hookId, serializedHook, owner, reservation) =>\n callFleetRoute(\n transport,\n '/v1/index/hooks/finalize',\n [token, hookId, serializedHook, owner, reservation],\n { idempotent: true },\n ),\n releaseHookReservation: (token, owner, reservation) =>\n callFleetRoute(\n transport,\n '/v1/index/hooks/release-reservation',\n [token, owner, reservation],\n { idempotent: true },\n ),\n releaseHookIndexes: (request) =>\n callFleetRoute(transport, '/v1/index/hooks/release', [request], { idempotent: true }),\n },\n WORKFLOW_QUEUE: {\n send: (envelope, options) =>\n callFleetRoute<NativeQueueSendResult>(transport, '/v1/queue/send', [envelope, options], {\n // A lost response leaves Queue publication ambiguous. The broker and\n // consumer are at-least-once; do not add a blind transport retry.\n idempotent: false,\n }),\n } satisfies CelldQueueProducer,\n };\n}\n","/**\n * Creates a namespaced debug logger.\n * Logs to stderr to avoid corrupting CLI JSON output on stdout.\n *\n * Control via WORKFLOW_DEBUG environment variable:\n * WORKFLOW_DEBUG=1 // Enable all\n * WORKFLOW_DEBUG=mysql-world // Specific namespace\n * WORKFLOW_DEBUG=mysql-world,redis-world // Multiple namespaces\n *\n * Vendored from vinnymac/worlds packages/shared, modified: guarded for\n * non-Node runtimes (celld/workerd), where `process` may be absent or\n * stubbed — falls back to console.error.\n */\nexport function createDebugLogger(namespace: string) {\n return (...args: unknown[]) => {\n const debug = typeof process === 'undefined' ? undefined : process.env?.WORKFLOW_DEBUG;\n if (!debug) return;\n\n const enabled =\n debug === '1' ||\n debug === 'true' ||\n debug === '*' ||\n debug.split(',').some((ns: string) => ns.trim() === namespace);\n\n if (!enabled) return;\n\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${namespace}]`;\n const message = args\n .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\n .join(' ');\n\n if (typeof process.stderr?.write === 'function') {\n process.stderr.write(`${prefix} ${message}\\n`);\n } else {\n console.error(`${prefix} ${message}`);\n }\n };\n}\n","import { createDebugLogger } from './vendor/shared/index.js';\n\nexport { compact } from './vendor/shared/index.js';\nexport const debug = createDebugLogger('celld-world');\n","/**\n * Queue implementation for the celld world.\n *\n * Vendored from vinnymac/worlds packages/world-cloudflare/src/queue.ts\n * (Apache-2.0, see NOTICE), modified for celld:\n *\n * - Production publishes a small pointer through celld v0.6.0 native Queues.\n * The deployed Queue consumer forwards deliveries to the same HTTP handler\n * used by the in-process test pump.\n * - Run-bearing message bodies live in the fleet object store. This preserves\n * the World's larger payload contract and lets run retention delete payload\n * bytes independently of the broker's fixed retention window.\n * - `createQueueHandler` has ONE dialect — the x-vqs wire format the test\n * pump has always used — extended so permanent errors surface as their\n * HTTP statuses. Native Queue deliveries and the in-process test pump hit the\n * exact same handler path.\n */\nimport { WorkflowWorldError } from '@workflow/errors';\nimport {\n MessageId,\n parseQueueName,\n QueuePayloadSchema,\n type Queue,\n type QueuePayload,\n type ValidQueueName,\n} from '@workflow/world';\nimport { parse, stringify } from './vendor/shared/index.js';\nimport { monotonicFactory } from 'ulid';\nimport { debug } from './util.js';\nimport {\n nativeQueueDelaySeconds,\n queueClaimName,\n type NativeQueueEnvelope,\n type NativeQueueSendOptions,\n type NativeQueueSendResult,\n} from './queue-protocol.js';\nimport {\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n} from './lifecycle.js';\nimport {\n boundedIntegerOption,\n checkedQueueTimestampAdd,\n queueDelayDeadline,\n strictIntegerSetting,\n} from './validation.js';\n\nconst MAX_TIMER_DELAY_MS = 0x7fffffff;\nconst MAX_TEST_PUMP_BACKOFF_MS = 60_000;\n\nfunction delay(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\nasync function delayFor(milliseconds: number): Promise<void> {\n let remaining = milliseconds;\n while (remaining > MAX_TIMER_DELAY_MS) {\n await delay(MAX_TIMER_DELAY_MS);\n remaining -= MAX_TIMER_DELAY_MS;\n }\n await delay(remaining);\n}\n\n/**\n * HTTP status codes that indicate permanent (non-retryable) failures.\n * Deliveries with these statuses are dropped immediately instead of retried.\n *\n * - 404: Resource not found (e.g., run was deleted)\n * - 409: Conflict (e.g., duplicate event that can't be replayed)\n * - 410: Gone (e.g., run was already terminal)\n * - 422: Unprocessable entity (e.g., invalid payload structure)\n */\nexport const PERMANENT_ERROR_STATUSES = new Set([404, 409, 410, 422]);\n\nfunction isPermanentError(err: unknown): err is WorkflowWorldError {\n if (err instanceof WorkflowWorldError && err.status !== undefined) {\n return PERMANENT_ERROR_STATUSES.has(err.status);\n }\n return false;\n}\n\n/** Caps at 60 seconds. */\nexport function computeBackoff(attempt: number): number {\n return Math.min(60, 2 ** attempt);\n}\n\ntype Pathname = 'flow';\n\nconst QUEUE_PATHNAME: Pathname = 'flow';\n\nfunction isTestMode(): boolean {\n // Explicit override: force the production native-Queue path even under a test\n // runner (used by the conformance suite to exercise the live native queue —\n // the world-testing server inherits VITEST from the vitest parent).\n if (process.env.CELLD_QUEUE_MODE === 'native') return false;\n return process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';\n}\n\nexport interface CelldQueueProducer {\n send(\n envelope: NativeQueueEnvelope,\n options?: NativeQueueSendOptions,\n ): Promise<NativeQueueSendResult>;\n}\n\nexport interface CelldQueueConfig {\n env: {\n WORKFLOW_QUEUE: CelldQueueProducer;\n };\n deploymentId: string;\n /**\n * Base URL the app's workflow endpoints are mounted on. The native Queue\n * consumer delivers to `${baseUrl}/.well-known/workflow/v1/flow`; the test\n * pump uses the same value.\n * Default: process.env.WORKFLOW_BASE_URL || `http://localhost:${process.env.PORT ?? 3000}`\n */\n baseUrl?: string;\n /** Per-job HTTP request timeout (ms) for the test pump. Default/max: 300_000 */\n httpTimeoutMs?: number;\n /** Maximum retry attempts in the test pump before dropping a job. Default: 5 */\n maxAttempts?: number;\n /** Base backoff delay (ms) for test pump retries. Default: 1000; maximum: 60_000 */\n backoffDelayMs?: number;\n}\n\ninterface PumpEnvelope {\n messageId: string;\n queueName: ValidQueueName;\n attempt: number;\n message: QueuePayload;\n idempotencyKey?: string;\n}\n\nfunction resolveBaseUrl(config: CelldQueueConfig): string {\n if (config.baseUrl) return config.baseUrl;\n if (process.env.WORKFLOW_BASE_URL) return process.env.WORKFLOW_BASE_URL;\n const port = process.env.PORT ?? '3000';\n return `http://localhost:${port}`;\n}\n\n/**\n * In-process test pump. Holds an in-memory FIFO and HTTP-dispatches envelopes\n * to the user's server at `${baseUrl}/.well-known/workflow/v1/flow`.\n *\n * Mirrors world-local's idempotency semantics: messages are deduplicated on\n * `idempotencyKey` while a message with the same key is in flight, and the\n * key is released only when the message is fully handled (success or drop).\n *\n * Modified vs upstream: permanent-error statuses (404/409/410/422) from the\n * handler drop the message immediately instead of burning retry budget —\n * matching the native Queue consumer's production semantics.\n */\nfunction createTestPump(config: CelldQueueConfig) {\n const httpTimeoutMs = boundedIntegerOption(\n 'world-celld test pump httpTimeoutMs',\n config.httpTimeoutMs,\n 300_000,\n 1,\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n );\n const maxAttempts = boundedIntegerOption(\n 'world-celld test pump maxAttempts',\n config.maxAttempts,\n 5,\n 1,\n );\n const baseBackoffMs = boundedIntegerOption(\n 'world-celld test pump backoffDelayMs',\n config.backoffDelayMs,\n 1000,\n 0,\n MAX_TEST_PUMP_BACKOFF_MS,\n );\n\n const queues: Record<Pathname, PumpEnvelope[]> = { flow: [] };\n const wakers: Record<Pathname, Array<() => void>> = { flow: [] };\n /** Inflight messageIds by idempotencyKey (world-local queue.js semantics). */\n const inflightMessages = new Map<string, MessageId>();\n let running = false;\n\n function release(envelope: PumpEnvelope) {\n if (envelope.idempotencyKey) {\n inflightMessages.delete(queueClaimName(envelope.queueName, envelope.idempotencyKey));\n }\n }\n\n function enqueue(pathname: Pathname, envelope: PumpEnvelope) {\n queues[pathname].push(envelope);\n wakers[pathname].shift()?.();\n }\n\n async function take(pathname: Pathname): Promise<PumpEnvelope | null> {\n const existing = queues[pathname].shift();\n if (existing) return existing;\n return new Promise((resolve) => {\n wakers[pathname].push(() => resolve(queues[pathname].shift() ?? null));\n });\n }\n\n function retry(envelope: PumpEnvelope, pathname: Pathname, reason: string): void {\n if (envelope.attempt >= maxAttempts) {\n release(envelope);\n console.error(\n `[world-celld test pump] dropping ${envelope.messageId} after ${envelope.attempt} attempts: ${reason}`,\n );\n return;\n }\n const next: PumpEnvelope = { ...envelope, attempt: envelope.attempt + 1 };\n const backoff = Math.min(\n MAX_TEST_PUMP_BACKOFF_MS,\n baseBackoffMs * 2 ** Math.min(next.attempt - 1, 30),\n );\n if (\n checkedQueueTimestampAdd(Date.now(), backoff, MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS) === null\n ) {\n release(envelope);\n console.error(\n `[world-celld test pump] dropping ${envelope.messageId}: retry deadline exceeds the queue timestamp horizon`,\n );\n return;\n }\n void delayFor(backoff).then(() => enqueue(pathname, next));\n }\n\n async function dispatch(envelope: PumpEnvelope, pathname: Pathname): Promise<void> {\n const url = `${resolveBaseUrl(config)}/.well-known/workflow/v1/${pathname}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-vqs-queue-name': envelope.queueName,\n 'x-vqs-message-id': envelope.messageId,\n 'x-vqs-message-attempt': String(envelope.attempt),\n },\n body: stringify(envelope.message),\n signal: AbortSignal.timeout(httpTimeoutMs),\n });\n\n if (response.ok || PERMANENT_ERROR_STATUSES.has(response.status)) {\n try {\n await response.body?.cancel();\n } catch {\n // The status already determines the queue outcome. Do not turn an ack\n // into a retry solely because releasing an unused body failed.\n }\n release(envelope);\n if (!response.ok) {\n debug(\n `[world-celld test pump] dropping ${envelope.messageId}: permanent HTTP ${response.status}`,\n );\n }\n return;\n }\n\n const text = await response.text();\n\n if (response.status === 503) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = null;\n }\n const timeoutSeconds = (parsed as { timeoutSeconds?: number } | null)?.timeoutSeconds;\n const now = Date.now();\n const redeliveryAt = queueDelayDeadline(\n now,\n timeoutSeconds,\n 1,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n );\n if (redeliveryAt !== null) {\n // Same message re-delivered later: the idempotency key stays claimed.\n void delayFor(redeliveryAt - now).then(() => enqueue(pathname, envelope));\n return;\n }\n }\n\n retry(envelope, pathname, `HTTP ${response.status}: ${text}`);\n }\n\n async function loop(pathname: Pathname) {\n while (true) {\n if (!running) return;\n const envelope = await take(pathname);\n if (!envelope) continue;\n try {\n await dispatch(envelope, pathname);\n } catch (err) {\n retry(envelope, pathname, err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n return {\n /** Returns the inflight messageId when the key is already claimed. */\n inflight(queueName: string, idempotencyKey: string | undefined): MessageId | undefined {\n return idempotencyKey\n ? inflightMessages.get(queueClaimName(queueName, idempotencyKey))\n : undefined;\n },\n push(pathname: Pathname, envelope: PumpEnvelope, delaySeconds?: number) {\n if (\n queueDelayDeadline(\n Date.now(),\n delaySeconds ?? 0,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) === null\n ) {\n throw new Error('world-celld queue delaySeconds lacks required delivery headroom');\n }\n if (envelope.idempotencyKey) {\n inflightMessages.set(\n queueClaimName(envelope.queueName, envelope.idempotencyKey),\n MessageId.parse(envelope.messageId),\n );\n }\n if (delaySeconds && delaySeconds > 0) {\n void delayFor(delaySeconds * 1000).then(() => enqueue(pathname, envelope));\n } else {\n enqueue(pathname, envelope);\n }\n },\n async start() {\n if (running) return;\n running = true;\n void loop('flow');\n },\n stop() {\n running = false;\n for (const list of Object.values(wakers)) for (const w of list) w();\n },\n };\n}\n\nexport function createQueue(config: CelldQueueConfig): Queue & { start(): Promise<void> } {\n const { env, deploymentId } = config;\n if (!env?.WORKFLOW_QUEUE) {\n throw new Error('world-celld queue missing WORKFLOW_QUEUE binding');\n }\n const generateMessageId = monotonicFactory();\n const testPump = createTestPump(config);\n\n return {\n async queue(queueName, message, opts) {\n parseQueueName(queueName);\n const parsedMessage = QueuePayloadSchema.safeParse(message);\n if (!parsedMessage.success) {\n throw new WorkflowWorldError('world-celld queue payload is invalid', { status: 422 });\n }\n if (\n queueDelayDeadline(\n Date.now(),\n opts?.delaySeconds ?? 0,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) === null\n ) {\n throw new Error('world-celld queue delaySeconds lacks required delivery headroom');\n }\n const runId =\n 'runId' in parsedMessage.data && typeof parsedMessage.data.runId === 'string'\n ? parsedMessage.data.runId\n : undefined;\n\n if (isTestMode()) {\n // Dedup on idempotencyKey while a message with the same key is in\n // flight — core re-enqueues every still-pending step on every replay\n // with idempotencyKey = stepId and relies on queue-level dedup.\n const existing = testPump.inflight(queueName, opts?.idempotencyKey);\n if (existing) {\n return { messageId: existing };\n }\n const messageId = MessageId.parse(`msg_${generateMessageId()}`);\n testPump.push(\n QUEUE_PATHNAME,\n {\n messageId,\n queueName,\n attempt: 1,\n message: parsedMessage.data,\n idempotencyKey: opts?.idempotencyKey,\n },\n opts?.delaySeconds,\n );\n return { messageId };\n }\n\n // Production: publish through celld's native Queue. The worker-side send\n // route moves run-bearing payload bytes into object storage before it publishes this\n // envelope, so only a bounded pointer reaches the broker.\n const messageId = MessageId.parse(`msg_${generateMessageId()}`);\n const body = stringify(parsedMessage.data);\n const notBefore =\n opts?.delaySeconds && opts.delaySeconds > 0\n ? (queueDelayDeadline(\n Date.now(),\n opts.delaySeconds,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) ?? undefined)\n : undefined;\n const envelope: NativeQueueEnvelope = {\n version: 1,\n messageId,\n queueName,\n targetBaseUrl: resolveBaseUrl(config),\n runId,\n idempotencyKey: opts?.idempotencyKey,\n body,\n notBefore,\n };\n const published = await env.WORKFLOW_QUEUE.send(envelope, {\n delaySeconds: nativeQueueDelaySeconds(notBefore, Date.now()),\n });\n return { messageId: MessageId.parse(published.messageId) };\n },\n\n createQueueHandler(queueNamePrefix, handler) {\n // ONE dialect for the pump, native Queue consumer deliveries, and\n // @workflow/world-testing's mounted routes: x-vqs headers + tagged-JSON\n // body. The response taxonomy drives the sender's retry state machine:\n // - 2xx -> ack\n // - 503 + {timeoutSeconds} -> redeliver after N seconds (key stays claimed)\n // - 404/409/410/422 -> permanent, drop without retrying\n // - other non-2xx -> retry with capped backoff\n return async (req: Request) => {\n if (req.method !== 'POST') {\n return Response.json({ error: 'Expected POST' }, { status: 405 });\n }\n if (\n req.headers.get('content-type')?.split(';', 1)[0].trim().toLowerCase() !==\n 'application/json'\n ) {\n return Response.json({ error: 'Expected application/json' }, { status: 415 });\n }\n const reqQueueName = req.headers.get('x-vqs-queue-name');\n const reqMessageId = req.headers.get('x-vqs-message-id') as MessageId | null;\n const attemptStr = req.headers.get('x-vqs-message-attempt');\n\n if (!reqQueueName || !reqMessageId || !attemptStr || !req.body) {\n return Response.json({ error: 'Missing required headers or body' }, { status: 400 });\n }\n if (!reqQueueName.startsWith(queueNamePrefix)) {\n return Response.json({ error: 'Unhandled queue' }, { status: 400 });\n }\n let attempt: number;\n try {\n attempt = strictIntegerSetting('x-vqs-message-attempt', attemptStr, 1, 1);\n } catch {\n return Response.json({ error: 'Invalid x-vqs-message-attempt header' }, { status: 400 });\n }\n try {\n // Tagged-JSON codec: revives Uint8Array payloads (runInput.input).\n let body: unknown;\n try {\n body = parse<unknown>(await req.text());\n } catch {\n return Response.json({ error: 'Malformed tagged JSON body' }, { status: 422 });\n }\n const parsedBody = QueuePayloadSchema.safeParse(body);\n if (!parsedBody.success) {\n return Response.json({ error: 'Invalid queue payload' }, { status: 422 });\n }\n const result = await handler(parsedBody.data, {\n attempt,\n queueName: reqQueueName,\n messageId: reqMessageId,\n });\n if (result && typeof result.timeoutSeconds === 'number') {\n if (\n queueDelayDeadline(\n Date.now(),\n result.timeoutSeconds,\n 1,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n ) === null\n ) {\n throw new Error('Queue handler timeoutSeconds is out of range');\n }\n return Response.json(\n { timeoutSeconds: result.timeoutSeconds },\n { status: 503, headers: { 'Retry-After': String(result.timeoutSeconds) } },\n );\n }\n return new Response(null, { status: 204 });\n } catch (error) {\n // Permanent vs transient distinction: permanent errors surface as\n // their own status so the sender drops instead of retrying.\n if (isPermanentError(error)) {\n debug('[world-celld queue handler] permanent error:', {\n status: error.status,\n error: String(error),\n });\n return Response.json(\n { error: String(error), permanent: true },\n { status: error.status },\n );\n }\n\n const backoffSeconds = computeBackoff(attempt);\n debug('[world-celld queue handler] transient error, will retry:', {\n error: String(error),\n backoffSeconds,\n });\n return Response.json(\n { error: String(error), retryAfter: backoffSeconds },\n { status: 500, headers: { 'Retry-After': String(backoffSeconds) } },\n );\n }\n };\n },\n\n async getDeploymentId() {\n return deploymentId;\n },\n\n async start() {\n if (isTestMode()) {\n await testPump.start();\n }\n // Production: celld native Queues are push-based, nothing to start.\n },\n };\n}\n","import {\n EntityConflictError,\n HookNotFoundError,\n RunExpiredError,\n RunNotSupportedError,\n TooEarlyError,\n WorkflowRunNotFoundError,\n WorkflowWorldError,\n} from '@workflow/errors';\nimport type {\n CreateEventParams,\n CreateEventRequest,\n Event,\n EventResult,\n GetEventParams,\n GetHookParams,\n GetStepParams,\n GetWorkflowRunParams,\n Hook,\n ListEventsParams,\n ListHooksParams,\n ListWorkflowRunStepsParams,\n ListWorkflowRunsParams,\n PaginatedResponse,\n ResolveData,\n RunCreatedEventRequest,\n Step,\n StepWithoutData,\n Storage,\n WorkflowRun,\n WorkflowRunWithoutData,\n} from '@workflow/world';\nimport {\n CreateEventSchema,\n EventSchema,\n HookSchema,\n SPEC_VERSION_CURRENT,\n StepSchema,\n WaitSchema,\n WorkflowRunSchema,\n} from '@workflow/world';\nimport { parse, stringify } from './vendor/shared/index.js';\nimport { monotonicFactory } from 'ulid';\nimport type {\n ApplyEventErrorCode,\n ApplyEventFailure,\n ApplyEventOutcome,\n ApplyEventRequest,\n ApplyEventSuccess,\n} from './apply-event.js';\nimport type { HookTokenOwner, IndexNamespace } from './config.js';\nimport { type HookReservation, runIndexMetadata } from './indexes.js';\nimport { FleetTransportError } from './remote/errors.js';\nimport { listRunsPage, MAX_RUN_LIST_LIMIT, type RunListRequest } from './run-list.js';\nimport { compact } from './util.js';\nimport type { RunReadOutcome } from './retention.js';\n\n/**\n * RPC surface of WorkflowRunDO used by the storage layer. Declared\n * structurally to avoid a circular type reference on the DO class.\n */\nexport interface WorkflowRunDOStub {\n applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome>;\n resolveHookTokenClaim(request: {\n hookId: string;\n token: string;\n claimId: string;\n }): Promise<{ committed: boolean }>;\n resolveExpiredHookClaim(request: {\n hookId: string;\n claimId: string;\n token?: string;\n }): Promise<Hook | null>;\n getLifecycleStatus(): Promise<import('./retention.js').RunLifecycleStatus>;\n getRun(): Promise<RunReadOutcome<WorkflowRun | null>>;\n getStep(stepId: string): Promise<RunReadOutcome<Step | null>>;\n getEvent(eventId: string): Promise<RunReadOutcome<Event | null>>;\n listEvents(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Event[]; cursor: string | null; hasMore: boolean }>>;\n listSteps(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Step[]; cursor: string | null; hasMore: boolean }>>;\n listHooks(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Hook[]; cursor: string | null; hasMore: boolean }>>;\n getCleanupStatus(): Promise<import('./retention.js').CleanupRecord | null>;\n scheduleCleanup(\n request: import('./retention.js').ScheduleCleanupRequest,\n ): Promise<import('./retention.js').CleanupRecord | null>;\n cleanupNow(\n request: import('./retention.js').ScheduleCleanupRequest,\n ): Promise<import('./retention.js').CleanupRecord | null>;\n rearmCleanup(): Promise<import('./retention.js').CleanupRecord | null>;\n}\n\nexport interface WorkflowRunDONamespace {\n idFromName(name: string): DurableObjectIdLike;\n get(id: DurableObjectIdLike): WorkflowRunDOStub;\n}\n\nexport interface DurableObjectIdLike {\n toString(): string;\n}\n\nexport interface CloudflareStorageConfig {\n env: {\n WORKFLOW_DB: WorkflowRunDONamespace;\n WORKFLOW_INDEX: IndexNamespace;\n };\n deploymentId: string;\n runRetentionMs?: number;\n}\n\nfunction hookOwner(hook: Pick<Hook, 'runId' | 'hookId'>): HookTokenOwner {\n return { runId: hook.runId, hookId: hook.hookId };\n}\n\nconst APPLY_EVENT_ERROR_CODES = new Set<string>([\n 'RUN_NOT_FOUND',\n 'STEP_NOT_FOUND',\n 'HOOK_NOT_FOUND',\n 'WAIT_NOT_FOUND',\n 'ENTITY_CONFLICT',\n 'HOOK_CLAIM_CANCELLED',\n 'RUN_EXPIRED',\n 'TOO_EARLY',\n 'RUN_NOT_SUPPORTED',\n] satisfies ApplyEventErrorCode[]);\n\ninterface ApplyEventWireFailure {\n ok: false;\n code: string;\n message: string;\n status?: number;\n retryAfter?: number;\n retryAfterMs?: number;\n retryAfterSeconds?: number;\n runSpecVersion?: number;\n worldSpecVersion?: number;\n details?: unknown;\n}\n\ntype ParsedApplyEventOutcome =\n | { kind: 'success'; outcome: ApplyEventSuccess }\n | { kind: 'known-failure'; outcome: ApplyEventFailure & ApplyEventWireFailure }\n | { kind: 'unknown-failure'; outcome: ApplyEventWireFailure };\n\nfunction malformedApplyEventOutcome(reason: string): never {\n throw new FleetTransportError(`world-celld: malformed applyEvent outcome: ${reason}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction validateOptionalNumber(\n outcome: Record<string, unknown>,\n key: 'status' | 'retryAfter' | 'retryAfterSeconds' | 'runSpecVersion' | 'worldSpecVersion',\n integer: boolean,\n): void {\n const value = outcome[key];\n if (\n value !== undefined &&\n (typeof value !== 'number' ||\n !Number.isFinite(value) ||\n (integer && !Number.isSafeInteger(value)))\n ) {\n malformedApplyEventOutcome(`${key} must be ${integer ? 'a safe integer' : 'a finite number'}`);\n }\n}\n\nfunction validateOptionalRetryAfterMs(outcome: Record<string, unknown>): void {\n const value = outcome.retryAfterMs;\n if (\n value !== undefined &&\n (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)\n ) {\n malformedApplyEventOutcome('retryAfterMs must be a non-negative safe integer');\n }\n}\n\nfunction parseSuccessEntity<T>(\n outcome: Record<string, unknown>,\n key: 'event' | 'run' | 'replayRun' | 'step' | 'hook' | 'wait' | 'hookToIndex',\n schema: {\n safeParse(value: unknown): { success: true; data: T } | { success: false };\n },\n): T | undefined {\n const value = outcome[key];\n if (value === undefined) return undefined;\n if (!isRecord(value)) malformedApplyEventOutcome(`${key} is invalid`);\n const entity: Record<string, unknown> = compact(value);\n // A step's error is opaque serialized data; null is a valid thrown value.\n if (key === 'step') entity.error = value.error;\n const result = schema.safeParse(entity);\n if (!result.success) malformedApplyEventOutcome(`${key} is invalid`);\n return result.data;\n}\n\n/**\n * Validate the untrusted value decoded from the remote applyEvent RPC.\n * Unknown failure codes are intentionally valid and classified separately so\n * an older client can reconstruct their wire metadata without treating them\n * as success. All fields consumed by the success path are checked before any\n * derivative index operation can run.\n */\nfunction parseApplyEventOutcome(value: unknown): ParsedApplyEventOutcome {\n if (!isRecord(value)) malformedApplyEventOutcome('response must be an object');\n\n if (value.ok === false) {\n if (typeof value.code !== 'string' || value.code.length === 0) {\n malformedApplyEventOutcome('failure code must be a non-empty string');\n }\n if (typeof value.message !== 'string') {\n malformedApplyEventOutcome('failure message must be a string');\n }\n validateOptionalNumber(value, 'status', true);\n validateOptionalNumber(value, 'retryAfter', false);\n validateOptionalRetryAfterMs(value);\n validateOptionalNumber(value, 'retryAfterSeconds', false);\n validateOptionalNumber(value, 'runSpecVersion', true);\n validateOptionalNumber(value, 'worldSpecVersion', true);\n\n const outcome = value as unknown as ApplyEventWireFailure;\n return APPLY_EVENT_ERROR_CODES.has(outcome.code)\n ? {\n kind: 'known-failure',\n outcome: outcome as ApplyEventFailure & ApplyEventWireFailure,\n }\n : { kind: 'unknown-failure', outcome };\n }\n\n if (value.ok !== true) malformedApplyEventOutcome('ok must be true or false');\n if (!Array.isArray(value.releasedHooks)) {\n malformedApplyEventOutcome('releasedHooks must be an array');\n }\n for (const releasedHook of value.releasedHooks) {\n if (\n !isRecord(releasedHook) ||\n typeof releasedHook.hookId !== 'string' ||\n releasedHook.hookId.length === 0 ||\n typeof releasedHook.token !== 'string' ||\n releasedHook.token.length === 0\n ) {\n malformedApplyEventOutcome('releasedHooks entries must contain hookId and token strings');\n }\n }\n\n const event = parseSuccessEntity(value, 'event', EventSchema);\n const run = parseSuccessEntity(value, 'run', WorkflowRunSchema);\n const replayRun = parseSuccessEntity(value, 'replayRun', WorkflowRunSchema);\n const step = parseSuccessEntity(value, 'step', StepSchema);\n const hook = parseSuccessEntity(value, 'hook', HookSchema);\n const wait = parseSuccessEntity(value, 'wait', WaitSchema);\n const hookToIndex = parseSuccessEntity(value, 'hookToIndex', HookSchema);\n\n if (value.stepCreated !== undefined && value.stepCreated !== true) {\n malformedApplyEventOutcome('stepCreated must be true when present');\n }\n if (value.runCreated !== undefined) {\n if (\n !isRecord(value.runCreated) ||\n typeof value.runCreated.workflowName !== 'string' ||\n !(value.runCreated.createdAt instanceof Date) ||\n Number.isNaN(value.runCreated.createdAt.getTime())\n ) {\n malformedApplyEventOutcome('runCreated is invalid');\n }\n }\n let events: Event[] | undefined;\n if (value.events !== undefined) {\n if (!Array.isArray(value.events)) malformedApplyEventOutcome('events must be an array');\n events = value.events.map((candidate) => {\n if (!isRecord(candidate)) malformedApplyEventOutcome('events contains an invalid event');\n const result = EventSchema.safeParse(compact(candidate));\n if (!result.success) {\n malformedApplyEventOutcome('events contains an invalid event');\n }\n return result.data;\n });\n if (value.cursor !== null && typeof value.cursor !== 'string') {\n malformedApplyEventOutcome('cursor is required when events are present');\n }\n if (typeof value.hasMore !== 'boolean') {\n malformedApplyEventOutcome('hasMore is required when events are present');\n }\n }\n if (value.cursor !== undefined && value.cursor !== null && typeof value.cursor !== 'string') {\n malformedApplyEventOutcome('cursor must be a string or null');\n }\n if (value.hasMore !== undefined && typeof value.hasMore !== 'boolean') {\n malformedApplyEventOutcome('hasMore must be a boolean');\n }\n if (\n value.maxEvents !== undefined &&\n (typeof value.maxEvents !== 'number' ||\n !Number.isSafeInteger(value.maxEvents) ||\n value.maxEvents < 0)\n ) {\n malformedApplyEventOutcome('maxEvents must be a non-negative safe integer');\n }\n for (const flag of ['runIndexPublished', 'hookIndexesReleased'] as const) {\n if (value[flag] !== undefined && value[flag] !== true) {\n malformedApplyEventOutcome(`${flag} must be true when present`);\n }\n }\n if (run !== undefined && value.indexPublicationExpiresAt === undefined) {\n malformedApplyEventOutcome('indexPublicationExpiresAt is required when run is present');\n }\n if (\n value.indexPublicationExpiresAt !== undefined &&\n (typeof value.indexPublicationExpiresAt !== 'number' ||\n !Number.isFinite(value.indexPublicationExpiresAt))\n ) {\n malformedApplyEventOutcome('indexPublicationExpiresAt must be a finite number');\n }\n\n return {\n kind: 'success',\n outcome: {\n ...value,\n event,\n run,\n replayRun,\n step,\n hook,\n wait,\n hookToIndex,\n events,\n releasedHooks: value.releasedHooks.map((releasedHook) => ({\n hookId: (releasedHook as Record<string, unknown>).hookId as string,\n token: (releasedHook as Record<string, unknown>).token as string,\n })),\n } as ApplyEventSuccess,\n };\n}\n\n/**\n * Filter data based on ResolveData parameter.\n * When resolveData is 'none', strips specified keys to reduce data transfer.\n */\nfunction filterData<T extends object>(\n data: T,\n resolveData: ResolveData | undefined,\n keysToStrip: (keyof T)[],\n): T {\n if (resolveData === 'none') {\n const newData = { ...data };\n for (const key of keysToStrip) {\n if (key in newData) {\n delete newData[key];\n }\n }\n return newData;\n }\n return data;\n}\n\n/**\n * Filter hook data based on resolveData parameter\n */\nfunction filterHookData(hook: Hook, resolveData: ResolveData): Hook {\n if (resolveData === 'none' && 'metadata' in hook) {\n const { metadata: _, ...rest } = hook;\n return { metadata: undefined, ...rest };\n }\n return hook;\n}\n\n/**\n * Convert a structured applyEvent failure back into the typed error the\n * runtime matches on (via error-name based `.is()` checks). Typed errors\n * cannot cross the DO RPC boundary intact, which is why the DO returns\n * outcome objects instead of throwing.\n */\nfunction throwOutcomeError(\n outcome: ApplyEventWireFailure,\n runId: string,\n data: CreateEventRequest | RunCreatedEventRequest,\n): never {\n const withCode = <T extends Error>(error: T): T => {\n Object.assign(error, { code: outcome.code });\n return error;\n };\n\n switch (outcome.code) {\n case 'RUN_NOT_FOUND':\n throw withCode(new WorkflowRunNotFoundError(runId));\n case 'STEP_NOT_FOUND':\n throw new WorkflowWorldError(outcome.message, { status: 404, code: outcome.code });\n case 'HOOK_NOT_FOUND':\n throw withCode(new HookNotFoundError(data.correlationId ?? runId));\n case 'WAIT_NOT_FOUND':\n throw new WorkflowWorldError(outcome.message, { status: 404, code: outcome.code });\n case 'ENTITY_CONFLICT':\n throw withCode(new EntityConflictError(outcome.message));\n case 'HOOK_CLAIM_CANCELLED':\n throw new WorkflowWorldError(outcome.message, { status: 503, code: outcome.code });\n case 'RUN_EXPIRED':\n throw withCode(new RunExpiredError(outcome.message));\n case 'TOO_EARLY':\n throw withCode(new TooEarlyError(outcome.message, { retryAfter: outcome.retryAfterSeconds }));\n case 'RUN_NOT_SUPPORTED':\n throw withCode(new RunNotSupportedError(outcome.runSpecVersion ?? 0, SPEC_VERSION_CURRENT));\n default: {\n const error = new WorkflowWorldError(outcome.message, {\n status: outcome.status,\n code: outcome.code,\n retryAfter: outcome.retryAfter,\n });\n for (const key of [\n 'retryAfterMs',\n 'retryAfterSeconds',\n 'runSpecVersion',\n 'worldSpecVersion',\n 'details',\n ] as const) {\n if (Object.hasOwn(outcome, key)) Object.assign(error, { [key]: outcome[key] });\n }\n throw error;\n }\n }\n}\n\nconst parseRun = (run: WorkflowRun): WorkflowRun => WorkflowRunSchema.parse(compact(run));\nconst parseStep = (step: Step): Step => StepSchema.parse({ ...compact(step), error: step.error });\nconst parseHook = (hook: Hook): Hook => HookSchema.parse(compact(hook));\nconst parseEvent = (event: Event): Event => EventSchema.parse(compact(event));\n\nfunction unwrapRead<T>(outcome: RunReadOutcome<T>): T {\n if (!outcome.ok) {\n throw new RunExpiredError(outcome.message);\n }\n return outcome.value;\n}\n\nexport function createStorage(config: CloudflareStorageConfig): Storage {\n const { env } = config;\n const cleanup = {\n retentionMs: config.runRetentionMs ?? 0,\n };\n const ulid = monotonicFactory();\n\n // Helper to get or create a DO for a run\n const getRunDO = (runId: string): WorkflowRunDOStub => {\n const id = env.WORKFLOW_DB.idFromName(runId);\n return env.WORKFLOW_DB.get(id);\n };\n\n const runsGet = async (\n runId: string,\n params?: GetWorkflowRunParams,\n ): Promise<WorkflowRun | WorkflowRunWithoutData> => {\n const stub = getRunDO(runId);\n const run = unwrapRead(await stub.getRun());\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return filterData(parseRun(run), params?.resolveData, ['input', 'output']);\n };\n\n return {\n runs: {\n get: runsGet,\n\n async list(\n params?: ListWorkflowRunsParams,\n ): Promise<PaginatedResponse<WorkflowRun | WorkflowRunWithoutData>> {\n const request: RunListRequest = {\n workflowName: params?.workflowName,\n statuses:\n params?.status === undefined\n ? undefined\n : Array.isArray(params.status)\n ? params.status\n : [params.status],\n limit: params?.pagination?.limit ?? 20,\n cursor: params?.pagination?.cursor,\n sortOrder: params?.pagination?.sortOrder,\n resolveData: params?.resolveData,\n };\n\n // One fleet round trip when the worker lists inside the fleet.\n const fleetPage =\n Number.isSafeInteger(request.limit) &&\n request.limit >= 1 &&\n request.limit <= MAX_RUN_LIST_LIMIT\n ? await env.WORKFLOW_INDEX.listResolvedRuns?.(compact(request))\n : undefined;\n if (fleetPage) {\n return {\n data: fleetPage.data.map((run) =>\n filterData(parseRun(run), params?.resolveData, ['input', 'output']),\n ),\n cursor: fleetPage.cursor,\n hasMore: fleetPage.hasMore,\n };\n }\n\n return await listRunsPage(\n {\n listRuns: (options) => env.WORKFLOW_INDEX.listRuns(options),\n readRun: async (runId) => {\n try {\n return (await runsGet(runId)) as WorkflowRun;\n } catch (error) {\n if (WorkflowRunNotFoundError.is(error) || RunExpiredError.is(error)) return null;\n throw error;\n }\n },\n },\n request,\n );\n },\n } as Storage['runs'],\n\n events: {\n async create(\n runId: string | null,\n data: RunCreatedEventRequest | CreateEventRequest,\n params?: CreateEventParams,\n ): Promise<EventResult> {\n // Parse the public runtime value before run routing or hook admission.\n // The canonical Workflow schema strips unknown fields and rejects bad\n // discriminants/missing/wrong-typed fields without any external side\n // effects.\n data = CreateEventSchema.parse(compact(data));\n if (runId !== null && typeof runId !== 'string') {\n throw new WorkflowWorldError('runId must be a string or null', { status: 400 });\n }\n\n // For run_created events, generate a runId server-side if absent.\n let effectiveRunId: string;\n if (data.eventType === 'run_created' && (!runId || runId === '')) {\n effectiveRunId = `wrun_${ulid()}`;\n } else if (!runId) {\n throw new WorkflowWorldError('runId is required for non-run_created events', {\n status: 400,\n });\n } else {\n effectiveRunId = runId;\n }\n\n const stub = getRunDO(effectiveRunId);\n\n let tokenHolder: ApplyEventRequest['tokenHolder'];\n let hookAdmission:\n | { owner: HookTokenOwner; reservation: HookReservation; token: string }\n | undefined;\n if (data.eventType === 'hook_created') {\n const owner = {\n runId: effectiveRunId,\n hookId: data.correlationId,\n };\n const admission = await env.WORKFLOW_INDEX.reserveHook(data.eventData.token, owner);\n if (admission.admitted) {\n tokenHolder = null;\n hookAdmission = {\n owner,\n reservation: admission.reservation,\n token: data.eventData.token,\n };\n } else {\n tokenHolder = admission.holder;\n }\n }\n\n // Guards, event append, and entity mutation run in ONE DO storage\n // transaction (see apply-event.ts). The event is schema-validated\n // before anything is persisted.\n // A thrown RPC is commit-ambiguous. Resolve it inside the authoritative\n // RunDO: that transaction either observes the committed hook or fences\n // this exact reservation before its token/ID claims are released.\n let parsedOutcome: ParsedApplyEventOutcome;\n try {\n const wireOutcome: unknown = await stub.applyEvent({\n runId: effectiveRunId,\n data,\n params,\n tokenHolder,\n hookClaimId: hookAdmission?.reservation.claimId,\n cleanup,\n });\n parsedOutcome = parseApplyEventOutcome(wireOutcome);\n } catch (error) {\n if (hookAdmission) {\n let resolution: { committed: boolean };\n try {\n resolution = await stub.resolveHookTokenClaim({\n hookId: hookAdmission.owner.hookId,\n token: hookAdmission.token,\n claimId: hookAdmission.reservation.claimId,\n });\n } catch {\n // Resolution is itself ambiguous, so fail closed and leave both\n // claims for an exact same-reservation retry.\n throw error;\n }\n if (!resolution.committed) {\n await env.WORKFLOW_INDEX.releaseHookReservation(\n hookAdmission.token,\n hookAdmission.owner,\n hookAdmission.reservation,\n );\n }\n }\n throw error;\n }\n\n if (parsedOutcome.kind !== 'success') {\n if (hookAdmission) {\n await env.WORKFLOW_INDEX.releaseHookReservation(\n hookAdmission.token,\n hookAdmission.owner,\n hookAdmission.reservation,\n );\n }\n throwOutcomeError(parsedOutcome.outcome, effectiveRunId, data);\n }\n const outcome = parsedOutcome.outcome;\n\n // Derived indexes are deliberately rewritten on idempotent replay so\n // a committed run or hook can repair an interrupted index update.\n // The worker router publishes both inside the fleet when it can and\n // says so; otherwise (older workers, or a failed in-fleet write) the\n // client publishes them here.\n if (outcome.run && !outcome.runIndexPublished) {\n if (outcome.indexPublicationExpiresAt === undefined) {\n throw new Error('world-celld: authoritative run mutation omitted its index lease');\n }\n await env.WORKFLOW_INDEX.commitRun(\n outcome.run,\n runIndexMetadata({ ...outcome.run, runId: effectiveRunId }),\n outcome.indexPublicationExpiresAt,\n );\n }\n if (outcome.hookToIndex) {\n const serialized = stringify(outcome.hookToIndex);\n await env.WORKFLOW_INDEX.finalizeHookIndexes(\n outcome.hookToIndex.token,\n outcome.hookToIndex.hookId,\n serialized,\n hookOwner(outcome.hookToIndex),\n hookAdmission?.reservation,\n );\n } else if (hookAdmission) {\n await env.WORKFLOW_INDEX.releaseHookReservation(\n hookAdmission.token,\n hookAdmission.owner,\n hookAdmission.reservation,\n );\n }\n if (outcome.releasedHooks.length > 0 && !outcome.hookIndexesReleased) {\n await env.WORKFLOW_INDEX.releaseHookIndexes({\n runId: effectiveRunId,\n hooks: outcome.releasedHooks,\n });\n }\n\n const eventPage =\n outcome.events === undefined\n ? {}\n : {\n events: outcome.events,\n cursor: outcome.cursor ?? null,\n hasMore: outcome.hasMore ?? false,\n };\n return {\n event: outcome.event,\n // A hook_received replay preload returns the run unchanged, so it\n // is not published to the run catalog above.\n run: outcome.run ?? outcome.replayRun,\n step: outcome.step,\n hook: outcome.hook,\n wait: outcome.wait,\n stepCreated: outcome.stepCreated,\n maxEvents: outcome.maxEvents,\n ...eventPage,\n };\n },\n\n async get(runId: string, eventId: string, _params?: GetEventParams): Promise<Event> {\n const stub = getRunDO(runId);\n const event = unwrapRead(await stub.getEvent(eventId));\n\n if (!event) {\n throw new WorkflowWorldError(`Event not found: ${eventId}`, {\n status: 404,\n });\n }\n\n return parseEvent(event);\n },\n\n async list(params: ListEventsParams): Promise<PaginatedResponse<Event>> {\n const { runId } = params;\n const limit = params?.pagination?.limit ?? 100;\n\n const stub = getRunDO(runId);\n const result = unwrapRead(\n await stub.listEvents({\n limit,\n cursor: params?.pagination?.cursor || undefined,\n sortOrder: params.pagination?.sortOrder || 'asc',\n }),\n );\n\n return {\n data: result.data.map(parseEvent),\n cursor: result.cursor,\n hasMore: result.hasMore,\n };\n },\n\n async listByCorrelationId(params) {\n const limit = params.pagination?.limit ?? 100;\n const stub = getRunDO(params.runId);\n const matches: Event[] = [];\n let scanCursor = params.pagination?.cursor;\n let exhausted = false;\n\n // Workflow 5 scopes correlation IDs to a run. Scan that run's dense\n // event log rather than the global derived index so identical step or\n // wait IDs in different runs can never leak into this result.\n while (matches.length <= limit && !exhausted) {\n const page = unwrapRead(\n await stub.listEvents({\n limit: Math.min(1000, Math.max(50, limit + 1)),\n cursor: scanCursor,\n sortOrder: params.pagination?.sortOrder ?? 'asc',\n }),\n );\n for (const event of page.data) {\n if (event.correlationId === params.correlationId) {\n matches.push(event);\n if (matches.length > limit) break;\n }\n }\n exhausted = !page.hasMore;\n scanCursor = page.cursor ?? page.data.at(-1)?.eventId;\n if (page.data.length === 0) exhausted = true;\n }\n\n const hasMore = matches.length > limit;\n const data = matches.slice(0, limit);\n return {\n data: data.map(parseEvent),\n cursor: hasMore ? (data.at(-1)?.eventId ?? null) : null,\n hasMore,\n };\n },\n },\n\n steps: {\n async get(runId: string | undefined, stepId: string, params?: GetStepParams) {\n if (!runId) {\n throw new WorkflowWorldError('runId is required for Cloudflare step lookup', {\n status: 400,\n });\n }\n const stub = getRunDO(runId);\n const step = unwrapRead(await stub.getStep(stepId));\n\n if (!step) {\n throw new WorkflowWorldError(`Step not found: ${stepId}`, {\n status: 404,\n });\n }\n\n return filterData(parseStep(step), params?.resolveData, ['input', 'output']);\n },\n\n async list(\n params: ListWorkflowRunStepsParams,\n ): Promise<PaginatedResponse<Step | StepWithoutData>> {\n const { runId } = params;\n const limit = params?.pagination?.limit ?? 20;\n\n const stub = getRunDO(runId);\n const result = unwrapRead(\n await stub.listSteps({\n limit,\n cursor: params?.pagination?.cursor || undefined,\n sortOrder: params?.pagination?.sortOrder ?? 'asc',\n }),\n );\n\n return {\n data: result.data.map((s) =>\n filterData(parseStep(s), params?.resolveData, ['input', 'output']),\n ),\n cursor: result.cursor,\n hasMore: result.hasMore,\n };\n },\n } as Storage['steps'],\n\n hooks: {\n async get(hookId: string, params?: GetHookParams) {\n const raw = await env.WORKFLOW_INDEX.getHookById(hookId);\n\n if (!raw) {\n throw new HookNotFoundError(hookId);\n }\n\n const hook = parseHook(parse<Hook>(raw));\n return filterHookData(hook, params?.resolveData ?? 'all');\n },\n\n async getByToken(token: string, params?: GetHookParams) {\n const raw = await env.WORKFLOW_INDEX.getHookByToken(token);\n\n if (!raw) {\n throw new HookNotFoundError(token);\n }\n\n const hook = parseHook(parse<Hook>(raw));\n return filterHookData(hook, params?.resolveData ?? 'all');\n },\n\n async list(params: ListHooksParams): Promise<PaginatedResponse<Hook>> {\n if (!params.runId) {\n throw new WorkflowWorldError('runId is required for listing hooks', {\n status: 400,\n });\n }\n const runId = params.runId;\n const limit = params?.pagination?.limit ?? 100;\n\n const stub = getRunDO(runId);\n const result = unwrapRead(\n await stub.listHooks({\n limit,\n cursor: params?.pagination?.cursor || undefined,\n sortOrder: params?.pagination?.sortOrder ?? 'asc',\n }),\n );\n\n return {\n data: result.data.map((h) => filterHookData(parseHook(h), params?.resolveData ?? 'all')),\n cursor: result.cursor,\n hasMore: result.hasMore,\n };\n },\n },\n };\n}\n","import type {\n GetChunksOptions,\n StreamChunk,\n StreamChunksResponse,\n StreamInfoResponse,\n Streamer,\n} from '@workflow/world';\nimport type {\n ExpireRunStreamsResult,\n ExpireStreamResult,\n FinalizeRunStreamsResult,\n} from './retention.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n MAX_STREAM_WRITE_CHUNKS,\n isChunkLimitRejection,\n normalizeStreamError,\n type StreamErrorData,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamWriteResult,\n} from './stream-protocol.js';\n\nexport interface CelldStreamerConfig {\n env: {\n WORKFLOW_STREAMS: StreamDONamespace;\n };\n /** Duration of one bounded idle read. Default: 20000. */\n streamLongPollMs?: number;\n /** Runtime coalescing delay for streams.writeMulti(). Default: 0. */\n streamFlushIntervalMs?: number;\n}\n\nexport interface CelldStreamer extends Omit<Streamer, 'streams'> {\n streams: Streamer['streams'] & {\n fail(runId: string, name: string, error: StreamErrorData | string): Promise<void>;\n };\n writeToStream(\n name: string,\n runId: string | Promise<string>,\n chunk: string | Uint8Array,\n ): Promise<void>;\n writeChunksToStream(\n name: string,\n runId: string | Promise<string>,\n chunks: readonly (string | Uint8Array)[],\n ): Promise<void>;\n closeStream(name: string, runId: string | Promise<string>): Promise<void>;\n errorStream(\n name: string,\n runId: string | Promise<string>,\n error: StreamErrorData | string,\n ): Promise<void>;\n readFromStream(\n name: string,\n runId: string,\n startIndex?: number,\n ): Promise<ReadableStream<Uint8Array>>;\n listStreamsByRunId(runId: string): Promise<string[]>;\n getStreamChunks(\n name: string,\n runId: string,\n options?: GetChunksOptions,\n ): Promise<StreamChunksResponse>;\n getStreamInfo(name: string, runId: string): Promise<StreamInfoResponse>;\n}\n\n/** Direct StreamDO RPC surface. Remote stubs specialize read/write as binary HTTP. */\nexport interface StreamDOStub {\n /**\n * Remote stubs only: the per-request chunk limit the fleet has advertised.\n * Stubs without it are held to the baseline every worker accepts.\n */\n streamChunkLimit?(): number;\n /** Remote stubs only: drop an advertised limit an older worker rejected. */\n resetStreamChunkLimit?(): void;\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n closeStream(runId: string): Promise<void>;\n failStream(runId: string, error: StreamErrorData | string): Promise<void>;\n registerStream(runId: string, name: string): Promise<void>;\n listStreams(): Promise<string[]>;\n expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult>;\n finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult>;\n expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult>;\n}\n\nexport interface StreamDONamespace {\n idFromName(name: string): StreamDOId;\n get(id: StreamDOId): StreamDOStub;\n}\n\nexport interface StreamDOId {\n toString(): string;\n}\n\nconst DEFAULT_LONG_POLL_MS = MAX_STREAM_LONG_POLL_MS;\nconst DEFAULT_CHUNK_PAGE_SIZE = MAX_STREAM_READ_CHUNKS;\nconst MAX_CHUNK_PAGE_SIZE = MAX_STREAM_READ_CHUNKS;\nconst REGISTERED_STREAM_CACHE_SIZE = 4096;\n\nfunction toBytes(chunk: string | Uint8Array): Uint8Array {\n return typeof chunk === 'string' ? new TextEncoder().encode(chunk) : chunk;\n}\n\nfunction throwTerminal(result: StreamReadResult): void {\n if (result.state === 'expired') throw new Error('Stream has expired');\n if (result.state === 'errored') {\n const error = new Error(result.error?.message ?? 'Stream failed');\n error.name = result.error?.name ?? 'Error';\n throw error;\n }\n}\n\nexport function createStreamer(config: CelldStreamerConfig): CelldStreamer {\n const { env } = config;\n const streamLongPollMs = config.streamLongPollMs ?? DEFAULT_LONG_POLL_MS;\n if (\n !Number.isSafeInteger(streamLongPollMs) ||\n streamLongPollMs < 1 ||\n streamLongPollMs > MAX_STREAM_LONG_POLL_MS\n ) {\n throw new Error(`streamLongPollMs must be between 1 and ${MAX_STREAM_LONG_POLL_MS}`);\n }\n const streamFlushIntervalMs = config.streamFlushIntervalMs ?? 0;\n if (!Number.isSafeInteger(streamFlushIntervalMs) || streamFlushIntervalMs < 0) {\n throw new Error('streamFlushIntervalMs must be a non-negative safe integer');\n }\n\n const getStreamDO = (streamName: string): StreamDOStub => {\n const id = env.WORKFLOW_STREAMS.idFromName(`stream:${streamName}`);\n return env.WORKFLOW_STREAMS.get(id);\n };\n\n const getRunRegistryDO = (runId: string): StreamDOStub => {\n const id = env.WORKFLOW_STREAMS.idFromName(`run-streams:${runId}`);\n return env.WORKFLOW_STREAMS.get(id);\n };\n\n /** Bounded per-isolate cache; eviction only repeats idempotent registration. */\n const registeredStreams = new Set<string>();\n\n async function registerStreamForRun(name: string, runId: string): Promise<void> {\n const cacheKey = `${runId}\\0${name}`;\n if (registeredStreams.has(cacheKey)) return;\n await getRunRegistryDO(runId).registerStream(runId, name);\n if (registeredStreams.size >= REGISTERED_STREAM_CACHE_SIZE) {\n const oldest = registeredStreams.values().next().value;\n if (oldest !== undefined) registeredStreams.delete(oldest);\n }\n registeredStreams.add(cacheKey);\n }\n\n const writeChunksToStream = async (\n name: string,\n runId: string | Promise<string>,\n input: readonly (string | Uint8Array)[],\n ): Promise<void> => {\n if (input.length === 0) return;\n const resolvedRunId = await runId;\n const chunks = input.map(toBytes);\n for (const chunk of chunks) {\n if (chunk.byteLength > MAX_STREAM_CHUNK_BYTES) {\n throw new Error(`Stream chunk exceeds ${MAX_STREAM_CHUNK_BYTES} bytes`);\n }\n }\n await registerStreamForRun(name, resolvedRunId);\n\n const stub = getStreamDO(name);\n let next = 0;\n while (next < chunks.length) {\n // Re-read per batch: the first response may advertise a larger limit.\n const chunkLimit = stub.streamChunkLimit?.() ?? MAX_STREAM_WRITE_CHUNKS;\n let end = next;\n let batchBytes = 0;\n while (\n end < chunks.length &&\n end - next < chunkLimit &&\n (end === next || batchBytes + chunks[end].byteLength <= MAX_STREAM_BATCH_BYTES)\n ) {\n batchBytes += chunks[end].byteLength;\n end++;\n }\n const batch = chunks.slice(next, end);\n try {\n await stub.writeChunks(resolvedRunId, batch);\n } catch (error) {\n // An older worker rejects the batch before writing anything.\n if (batch.length > MAX_STREAM_WRITE_CHUNKS && isChunkLimitRejection(error)) {\n stub.resetStreamChunkLimit?.();\n continue;\n }\n throw error;\n }\n next = end;\n }\n };\n\n const writeToStream = (\n name: string,\n runId: string | Promise<string>,\n chunk: string | Uint8Array,\n ): Promise<void> => writeChunksToStream(name, runId, [chunk]);\n\n const closeStream = async (name: string, runId: string | Promise<string>): Promise<void> => {\n const resolvedRunId = await runId;\n await registerStreamForRun(name, resolvedRunId);\n await getStreamDO(name).closeStream(resolvedRunId);\n };\n\n const errorStream = async (\n name: string,\n runId: string | Promise<string>,\n error: StreamErrorData | string,\n ): Promise<void> => {\n const resolvedRunId = await runId;\n await registerStreamForRun(name, resolvedRunId);\n await getStreamDO(name).failStream(resolvedRunId, normalizeStreamError(error));\n };\n\n const readFromStream = async (\n name: string,\n runId: string,\n startIndex = 0,\n ): Promise<ReadableStream<Uint8Array>> => {\n const stub = getStreamDO(name);\n\n let nextIndex: number;\n if (startIndex < 0) {\n const info = await stub.readChunks({\n runId,\n startIndex: 0,\n maxChunks: 0,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: 0,\n });\n throwTerminal(info);\n nextIndex = Math.max(0, info.tailIndex + 1 + startIndex);\n } else {\n nextIndex = startIndex;\n }\n\n let cancelled = false;\n const abortController = new AbortController();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n for (;;) {\n if (cancelled) return;\n let result: StreamReadResult;\n try {\n result = await stub.readChunks(\n {\n runId,\n startIndex: nextIndex,\n maxChunks: stub.streamChunkLimit?.() ?? MAX_STREAM_READ_CHUNKS,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: streamLongPollMs,\n },\n abortController.signal,\n );\n } catch (error) {\n if (cancelled || abortController.signal.aborted) return;\n throw error;\n }\n\n if (result.chunks.length > 0) {\n for (const chunk of result.chunks) controller.enqueue(chunk);\n nextIndex += result.chunks.length;\n return;\n }\n throwTerminal(result);\n if (result.state === 'closed') {\n controller.close();\n return;\n }\n // A normal long-poll timeout returns no data; keep the pending\n // ReadableStream read attached through the next bounded request.\n }\n },\n\n cancel() {\n cancelled = true;\n abortController.abort(new DOMException('Stream reader cancelled', 'AbortError'));\n },\n });\n };\n\n const listStreamsByRunId = (runId: string): Promise<string[]> =>\n getRunRegistryDO(runId).listStreams();\n\n const getStreamChunks = async (\n name: string,\n runId: string,\n options?: GetChunksOptions,\n ): Promise<StreamChunksResponse> => {\n const requestedLimit = options?.limit ?? DEFAULT_CHUNK_PAGE_SIZE;\n if (!Number.isSafeInteger(requestedLimit) || requestedLimit < 1) {\n throw new Error('Stream chunk limit must be a positive safe integer');\n }\n const stub = getStreamDO(name);\n const limit = Math.min(requestedLimit, stub.streamChunkLimit?.() ?? MAX_CHUNK_PAGE_SIZE);\n const startIndex = options?.cursor ? Number.parseInt(options.cursor, 10) : 0;\n if (Number.isNaN(startIndex) || startIndex < 0) {\n throw new Error(`Invalid stream cursor: ${options?.cursor}`);\n }\n\n const result = await stub.readChunks({\n runId,\n startIndex,\n maxChunks: limit,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: 0,\n });\n throwTerminal(result);\n const data: StreamChunk[] = result.chunks.map((chunk, offset) => ({\n index: startIndex + offset,\n data: chunk,\n }));\n const nextIndex = startIndex + data.length;\n const hasMore = nextIndex <= result.tailIndex;\n\n return {\n data,\n cursor: hasMore ? String(nextIndex) : null,\n hasMore,\n done: result.state === 'closed',\n };\n };\n\n const getStreamInfo = async (name: string, runId: string): Promise<StreamInfoResponse> => {\n const result = await getStreamDO(name).readChunks({\n runId,\n startIndex: 0,\n maxChunks: 0,\n maxBytes: MAX_STREAM_READ_BYTES,\n waitMs: 0,\n });\n throwTerminal(result);\n return { tailIndex: result.tailIndex, done: result.state === 'closed' };\n };\n\n return {\n streamFlushIntervalMs,\n streams: {\n write: (runId, name, chunk) => writeToStream(name, runId, chunk),\n writeMulti: (runId, name, chunks) => writeChunksToStream(name, runId, chunks),\n close: (runId, name) => closeStream(name, runId),\n fail: (runId, name, error) => errorStream(name, runId, error),\n get: (runId, name, startIndex) => readFromStream(name, runId, startIndex),\n list: listStreamsByRunId,\n getChunks: (runId, name, options) => getStreamChunks(name, runId, options),\n getInfo: (runId, name) => getStreamInfo(name, runId),\n },\n writeToStream,\n writeChunksToStream,\n closeStream,\n errorStream,\n readFromStream,\n listStreamsByRunId,\n getStreamChunks,\n getStreamInfo,\n };\n}\n","/**\n * @ewhauser/world-celld — celld World implementation for the Vercel Workflow\n * DevKit. Modeled on vinnymac/worlds packages/world-cloudflare/src/index.ts\n * (Apache-2.0, see NOTICE).\n */\nimport { SPEC_VERSION_CURRENT, type World } from '@workflow/world';\nimport { type CelldWorldConfig, type CelldWorldEnv, resolveConfig } from './config.js';\nimport { createRemoteEnv } from './remote/namespaces.js';\nimport { createQueue } from './queue.js';\nimport { createStorage } from './storage.js';\nimport { createStreamer, type CelldStreamer } from './streamer.js';\nimport type { CleanupRecord } from './retention.js';\n\nexport type { CelldWorldConfig, CelldWorldEnv, IndexNamespace } from './config.js';\nexport type { CelldQueueProducer } from './queue.js';\nexport type {\n NativeQueueEnvelope,\n NativeQueueSendOptions,\n NativeQueueSendResult,\n} from './queue-protocol.js';\nexport type { WorkflowRunDONamespace, WorkflowRunDOStub } from './storage.js';\nexport type { StreamDONamespace, StreamDOStub } from './streamer.js';\nexport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_ERROR_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n MAX_STREAM_WRITE_CHUNKS,\n} from './stream-protocol.js';\nexport type {\n StreamErrorData,\n StreamReadRequest,\n StreamReadResult,\n StreamTerminalState,\n StreamWriteResult,\n} from './stream-protocol.js';\nexport type { CleanupPhase, CleanupRecord, RunTombstone } from './retention.js';\n\nexport interface CelldRetentionAdmin {\n getStatus(runId: string): Promise<CleanupRecord | null>;\n schedule(runId: string): Promise<CleanupRecord | null>;\n cleanupNow(runId: string): Promise<CleanupRecord | null>;\n rearm(runId: string): Promise<CleanupRecord | null>;\n}\n\nexport type CelldWorld = World & CelldStreamer & { retention: CelldRetentionAdmin };\n\nconst REQUIRED_ENV_BINDINGS = [\n 'WORKFLOW_DB',\n 'WORKFLOW_INDEX',\n 'WORKFLOW_QUEUE',\n 'WORKFLOW_STREAMS',\n] as const satisfies readonly (keyof CelldWorldEnv)[];\n\nexport function createCelldWorld(config?: CelldWorldConfig): CelldWorld {\n const resolved = resolveConfig(config);\n\n // Check for global test environment first (for @workflow/world-testing)\n let env = resolved.env;\n if (!env) {\n const globalEnv = (globalThis as { CELLD_ENV?: CelldWorldEnv }).CELLD_ENV;\n if (globalEnv) {\n env = globalEnv;\n }\n }\n\n if (!env) {\n if (resolved.fleetUrl) {\n if (!resolved.secret) {\n throw new Error(\n 'world-celld: config.secret (or CELLD_WORLD_SECRET) is required with fleetUrl',\n );\n }\n env = createRemoteEnv({\n fleetUrl: resolved.fleetUrl,\n secret: resolved.secret,\n timeoutMs: resolved.rpcTimeoutMs,\n });\n }\n }\n\n if (!env) {\n throw new Error(\n 'celld environment not configured. Provide config.fleetUrl + config.secret ' +\n '(or CELLD_FLEET_URL / CELLD_WORLD_SECRET), or pass config.env with ' +\n 'WORKFLOW_DB, WORKFLOW_INDEX, WORKFLOW_QUEUE, WORKFLOW_STREAMS',\n );\n }\n\n for (const binding of REQUIRED_ENV_BINDINGS) {\n if (!env[binding]) {\n throw new Error(`world-celld: config.env is missing required binding ${binding}`);\n }\n }\n\n const storage = createStorage({\n env: {\n WORKFLOW_DB: env.WORKFLOW_DB,\n WORKFLOW_INDEX: env.WORKFLOW_INDEX,\n },\n deploymentId: resolved.deploymentId,\n runRetentionMs: resolved.runRetentionMs,\n });\n\n const queue = createQueue({\n env: {\n WORKFLOW_QUEUE: env.WORKFLOW_QUEUE,\n },\n deploymentId: resolved.deploymentId,\n baseUrl: resolved.baseUrl,\n });\n\n const streamer = createStreamer({\n env: {\n WORKFLOW_STREAMS: env.WORKFLOW_STREAMS,\n },\n streamLongPollMs: resolved.streamLongPollMs,\n streamFlushIntervalMs: resolved.streamFlushIntervalMs,\n });\n\n const runStub = (runId: string) => env.WORKFLOW_DB.get(env.WORKFLOW_DB.idFromName(runId));\n const retention: CelldRetentionAdmin = {\n getStatus: (runId) => runStub(runId).getCleanupStatus(),\n schedule: (runId) => {\n if (resolved.runRetentionMs === 0) {\n throw new Error(\n 'world-celld: runRetentionMs must be greater than zero to schedule cleanup',\n );\n }\n return runStub(runId).scheduleCleanup({\n retentionMs: resolved.runRetentionMs,\n });\n },\n cleanupNow: (runId) =>\n runStub(runId).cleanupNow({\n retentionMs: Math.max(1, resolved.runRetentionMs),\n }),\n rearm: (runId) => runStub(runId).rearmCleanup(),\n };\n\n return {\n ...storage,\n ...queue,\n ...streamer,\n retention,\n // Enables resilient start: runs are created at the current spec version,\n // so the queue message carries runInput and run_started can bootstrap the\n // run when run_created has not landed yet.\n specVersion: SPEC_VERSION_CURRENT,\n };\n}\n\n// Export createWorld as an alias for compatibility with @workflow/world\nexport { createCelldWorld as createWorld };\n"],"mappings":"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"}