@ewhauser/world-celld 0.7.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/CHANGELOG.md +26 -0
- package/README.md +5 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -37
- package/dist/index.js.map +1 -1
- package/dist/queue-consumer.d.ts +1 -1
- package/dist/queue-consumer.js +1 -1
- package/dist/{queue-delivery-DzNOtCYA.d.ts → queue-delivery-wvPp6_Hh.d.ts} +30 -3
- package/dist/queue-delivery-wvPp6_Hh.d.ts.map +1 -0
- package/dist/{queue-protocol-CtH7UUCO.js → queue-protocol-C1zbXwa_.js} +28 -2
- package/dist/queue-protocol-C1zbXwa_.js.map +1 -0
- package/dist/{run-list-B__jKuE7.js → run-list-DGsdv6Jf.js} +28 -2
- package/dist/{run-list-B__jKuE7.js.map → run-list-DGsdv6Jf.js.map} +1 -1
- package/dist/testing.d.ts +2 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +945 -255
- package/dist/testing.js.map +1 -1
- package/dist/worker.d.ts +98 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +972 -269
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/queue-delivery-DzNOtCYA.d.ts.map +0 -1
- package/dist/queue-protocol-CtH7UUCO.js.map +0 -1
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","names":["QUEUE_ORPHAN_GRACE_MS","STORAGE_BATCH_SIZE","sameOwner","isRecord","isRecord","MAX_RELEASE_BATCH","CLAIM_DEADLINE_PREFIX","pad","recordKey","claimKey","claimDeadlineKey","pad","isRecord"],"sources":["../src/worker/auth.ts","../src/worker/queue-delivery.ts","../src/vendor/shared/serialization.ts","../src/vendor/shared/util.ts","../src/apply-event.ts","../src/codec.ts","../src/run-list.ts","../src/indexes.ts","../src/stream-protocol.ts","../src/worker/index-validation.ts","../src/worker/router.ts","../src/retention.ts","../src/worker/retention-sweep.ts","../src/worker/queue-payload-store.ts","../src/worker/durable-objects/hook-index-shared.ts","../src/worker/durable-objects/HookIdDO.ts","../src/worker/durable-objects/HookTokenDO.ts","../src/worker/durable-objects/RunCatalogDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"sourcesContent":["/**\n * Bearer-token auth for the worker router.\n *\n * Fails closed: when the WORLD_SECRET var is not configured, every protected\n * route returns 503 instead of forwarding unauthenticated traffic (the\n * eve-ambient celld-worker pattern).\n */\n\n/**\n * Constant-time string comparison via SHA-256 digests (digest-then-compare\n * is length-independent). crypto.subtle is global in both workerd and Node.\n */\nexport async function timingSafeEqual(a: string, b: string): Promise<boolean> {\n const enc = new TextEncoder();\n const [da, db] = await Promise.all([\n crypto.subtle.digest('SHA-256', enc.encode(a)),\n crypto.subtle.digest('SHA-256', enc.encode(b)),\n ]);\n const va = new Uint8Array(da);\n const vb = new Uint8Array(db);\n let diff = 0;\n for (let i = 0; i < va.length; i++) {\n diff |= va[i] ^ vb[i];\n }\n return diff === 0;\n}\n\nexport type AuthResult = { ok: true } | { ok: false; response: Response };\n\nexport async function authenticate(\n request: Request,\n secret: string | undefined,\n): Promise<AuthResult> {\n if (!secret) {\n return {\n ok: false,\n response: Response.json(\n { error: { name: 'WorldNotConfigured', message: 'WORLD_SECRET is not configured' } },\n { status: 503 },\n ),\n };\n }\n\n const header = request.headers.get('authorization') ?? '';\n const token = header.startsWith('Bearer ') ? header.slice('Bearer '.length) : '';\n if (!token || !(await timingSafeEqual(token, secret))) {\n return {\n ok: false,\n response: Response.json(\n { error: { name: 'Unauthorized', message: 'invalid or missing bearer token' } },\n { status: 401 },\n ),\n };\n }\n\n return { ok: true };\n}\n","/** Internal delivery contract. No Request/Response objects cross the RPC boundary. */\nimport {\n QUEUE_CLAIM_STALE_MS,\n queueClaimName,\n queueOrphanName,\n validateNativeQueueEnvelope,\n} from '../queue-protocol.js';\nimport { queueDelayDeadline } from '../validation.js';\nimport { timingSafeEqual } from './auth.js';\nimport type { QueueRunStub, WorkerEnv } from './router.js';\n\nexport type QueueDeliveryResult =\n | { kind: 'complete' }\n | { kind: 'suspend'; timeoutSeconds: number }\n | { kind: 'retry' };\n\nexport type QueueDeliveryEnv = Pick<\n WorkerEnv,\n 'WORKFLOW_DB' | 'WORKFLOW_QUEUE_PAYLOADS' | 'WORLD_SECRET' | 'WORKFLOW_CALLBACK_SECRET'\n>;\n\nconst MAX_QUEUE_DELIVERY_RESPONSE_BYTES = 64 * 1024;\nconst QUEUE_ORPHAN_GRACE_MS = 5 * 24 * 60 * 60 * 1000;\nconst PERMANENT_QUEUE_STATUSES = new Set([404, 409, 410, 422]);\nasync function readResponseText(response: Response): Promise<string> {\n if (!response.body) return '';\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_QUEUE_DELIVERY_RESPONSE_BYTES) {\n await reader.cancel('queue delivery response is too large').catch(() => undefined);\n throw new Error('workflow queue handler response exceeds configured limit');\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n}\n\n/** Validate at the service boundary; callers cannot bypass auth via RPC. */\nexport async function deliverQueueMessage(\n env: QueueDeliveryEnv,\n secret: unknown,\n input: unknown,\n attempt: unknown,\n): Promise<QueueDeliveryResult> {\n if (!env.WORLD_SECRET) throw new Error('WORLD_SECRET is not configured');\n if (typeof secret !== 'string' || !secret || !(await timingSafeEqual(secret, env.WORLD_SECRET))) {\n throw new Error('Unauthorized Queue delivery');\n }\n const envelope = validateNativeQueueEnvelope(input);\n if (!Number.isSafeInteger(attempt) || (attempt as number) < 1) {\n throw new TypeError('queue delivery attempt must be a positive safe integer');\n }\n if (!env.WORKFLOW_DB) throw new Error('missing binding: WORKFLOW_DB');\n\n const namespace = env.WORKFLOW_DB;\n const payloadStore = env.WORKFLOW_QUEUE_PAYLOADS;\n const runStub = (name: string) => namespace.get(namespace.idFromName(name)) as QueueRunStub;\n let claim: QueueRunStub | undefined;\n let claimed = false;\n\n async function releaseClaim(): Promise<void> {\n if (claimed) await claim!.releaseInflight(envelope.messageId);\n }\n async function unregisterPayload(): Promise<void> {\n if (envelope.runId) {\n await runStub(envelope.runId).unregisterQueuePayload(envelope.messageId);\n await runStub(queueOrphanName(envelope.messageId)).cancelQueuePayloadOrphan(\n envelope.messageId,\n );\n }\n }\n\n try {\n if (envelope.idempotencyKey) {\n claim = runStub(queueClaimName(envelope.queueName, envelope.idempotencyKey));\n const result = await claim.claimInflight({\n messageId: envelope.messageId,\n staleMs: QUEUE_CLAIM_STALE_MS,\n });\n if (!result.claimed) {\n const now = Date.now();\n if (result.retryAt !== undefined && result.retryAt > now) {\n return {\n kind: 'suspend',\n timeoutSeconds: Math.max(1, Math.ceil((result.retryAt - now) / 1000)),\n };\n }\n return { kind: 'complete' };\n }\n claimed = true;\n }\n\n let body = envelope.body;\n if (envelope.payloadKey) {\n if (!payloadStore) throw new Error('missing binding: WORKFLOW_QUEUE_PAYLOADS');\n body = (await payloadStore.read(envelope.payloadKey)) ?? undefined;\n if (body === undefined) {\n await unregisterPayload();\n await claim?.completeQueueMessage(envelope.messageId);\n return { kind: 'complete' };\n }\n }\n\n const headers: Record<string, string> = {\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(attempt),\n };\n if (env.WORKFLOW_CALLBACK_SECRET) {\n headers['x-workflow-callback-secret'] = env.WORKFLOW_CALLBACK_SECRET;\n }\n const callback = await fetch(\n `${envelope.targetBaseUrl.replace(/\\/$/, '')}/.well-known/workflow/v1/flow`,\n { method: 'POST', headers, body, signal: AbortSignal.timeout(300_000) },\n );\n if (callback.ok || PERMANENT_QUEUE_STATUSES.has(callback.status)) {\n await callback.body?.cancel().catch(() => undefined);\n if (envelope.payloadKey) {\n await payloadStore!.delete(envelope.payloadKey);\n await unregisterPayload();\n }\n // Do not acknowledge until cleanup and completion are durably accepted.\n await claim?.completeQueueMessage(envelope.messageId);\n return { kind: 'complete' };\n }\n\n if (callback.status === 503) {\n const responseBody = await readResponseText(callback);\n const timeoutSeconds = (JSON.parse(responseBody) as { timeoutSeconds?: unknown })\n .timeoutSeconds;\n const notBefore = queueDelayDeadline(Date.now(), timeoutSeconds, 1, QUEUE_CLAIM_STALE_MS);\n if (notBefore === null) throw new Error('workflow queue suspension deadline is invalid');\n if (envelope.payloadKey && envelope.runId) {\n await runStub(queueOrphanName(envelope.messageId)).scheduleQueuePayloadOrphan({\n messageId: envelope.messageId,\n runId: envelope.runId,\n key: envelope.payloadKey,\n expiresAt: notBefore + QUEUE_ORPHAN_GRACE_MS,\n });\n }\n if (claim) {\n await claim.holdInflight({\n messageId: envelope.messageId,\n retryAt: notBefore,\n expiresAt: notBefore + QUEUE_CLAIM_STALE_MS,\n reservationExpiresAt: notBefore + QUEUE_ORPHAN_GRACE_MS,\n });\n }\n // Validation proves a positive safe integer delay.\n return {\n kind: 'suspend',\n timeoutSeconds: timeoutSeconds as number,\n };\n }\n\n await callback.body?.cancel().catch(() => undefined);\n await releaseClaim();\n claimed = false;\n return { kind: 'retry' };\n } catch (error) {\n // A failed read, callback, or cleanup must not turn into an acknowledgement.\n await releaseClaim();\n throw error;\n }\n}\n","/** Standard Date fields used across all worlds */\nexport const DATE_FIELDS = new Set([\n 'createdAt',\n 'updatedAt',\n 'startedAt',\n 'completedAt',\n 'retryAfter',\n] as const);\n\n/**\n * JSON reviver that converts ISO date strings to Date objects.\n * Use with JSON.parse(json, dateReviver).\n */\nexport function dateReviver(key: string, value: unknown): unknown {\n if (\n DATE_FIELDS.has(key as typeof DATE_FIELDS extends Set<infer T> ? T : never) &&\n typeof value === 'string'\n ) {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date;\n }\n return value;\n}\n\n/**\n * Base64 helpers. Modified vs upstream: implemented without Buffer so this\n * module is safe inside the celld worker bundle (workerd has no Buffer\n * global). Uses the native Uint8Array base64 methods where the runtime has\n * them (Node >= 25, current V8) and falls back to atob/btoa elsewhere.\n */\nconst nativeToBase64 = (\n Uint8Array.prototype as Uint8Array & { toBase64?: (this: Uint8Array) => string }\n).toBase64;\nconst nativeFromBase64 = (Uint8Array as { fromBase64?: (text: string) => Uint8Array }).fromBase64;\n\n/** Small enough to stay far below engine argument-count limits and fast to spread. */\nconst FALLBACK_ENCODE_CHUNK = 0x1000;\n\n/** @internal Exported for tests; use b64encode. */\nexport function b64encodeFallback(bytes: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < bytes.length; i += FALLBACK_ENCODE_CHUNK) {\n bin += String.fromCharCode.apply(\n null,\n bytes.subarray(i, i + FALLBACK_ENCODE_CHUNK) as unknown as number[],\n );\n }\n return btoa(bin);\n}\n\n/** @internal Exported for tests; use b64decode. */\nexport function b64decodeFallback(text: string): Uint8Array {\n const bin = atob(text);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) {\n out[i] = bin.charCodeAt(i);\n }\n return out;\n}\n\nexport function b64encode(bytes: Uint8Array): string {\n return nativeToBase64 ? nativeToBase64.call(bytes) : b64encodeFallback(bytes);\n}\n\nexport function b64decode(text: string): Uint8Array {\n return nativeFromBase64 ? nativeFromBase64(text) : b64decodeFallback(text);\n}\n\n/**\n * JSON replacer that encodes Uint8Array as a tagged object with base64 data.\n */\nexport function uint8ArrayReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Uint8Array) {\n return {\n __type: 'Uint8Array',\n data: b64encode(value),\n };\n }\n return value;\n}\n\n/**\n * JSON reviver that decodes tagged Uint8Array objects and ISO date strings.\n * Supports both:\n * - New format: { __type: 'Uint8Array', data: '<base64>' }\n * - Legacy format: { __uint8array: true, data: [1, 2, 3] }\n */\nexport function uint8ArrayReviver(key: string, value: unknown): unknown {\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n // New format: base64-encoded\n if (obj.__type === 'Uint8Array') {\n if (typeof obj.data !== 'string') throw new SyntaxError('Malformed Uint8Array tag');\n try {\n return b64decode(obj.data);\n } catch {\n throw new SyntaxError('Malformed Uint8Array tag');\n }\n }\n // Legacy format: number array (backwards compat with NATS JetStream data)\n if (obj.__uint8array === true) {\n if (\n !Array.isArray(obj.data) ||\n !obj.data.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)\n ) {\n throw new SyntaxError('Malformed legacy Uint8Array tag');\n }\n return new Uint8Array(obj.data);\n }\n }\n return dateReviver(key, value);\n}\n\n/** Stringify with Uint8Array support. */\nexport function stringify(value: unknown): string {\n return JSON.stringify(value, uint8ArrayReplacer);\n}\n\n/** Parse with Uint8Array and Date support. */\nexport function parse<T>(text: string): T {\n return JSON.parse(text, uint8ArrayReviver) as T;\n}\n\n/** Deep clone using structuredClone */\nexport function deepClone<T>(value: T): T {\n return structuredClone(value);\n}\n","export class Mutex {\n promise: Promise<unknown> = Promise.resolve();\n andThen<T>(fn: () => Promise<T> | T): Promise<T> {\n this.promise = this.promise.then(\n () => fn(),\n () => fn(),\n );\n return this.promise as Promise<T>;\n }\n}\n\nexport function compact<T extends object>(obj: T) {\n const value = {} as {\n [key in keyof T]: null extends T[key] ? undefined | NonNullable<T[key]> : T[key];\n };\n for (const key in obj) {\n if (obj[key] !== null) {\n value[key] = obj[key] as any;\n } else {\n value[key] = undefined as any;\n }\n }\n return value;\n}\n\n/**\n * Reference counting helper for managing resource lifecycle\n */\nexport class Rc {\n private count = 0;\n private disposeFn?: () => void | Promise<void>;\n\n constructor(disposeFn?: () => void | Promise<void>) {\n this.disposeFn = disposeFn;\n }\n\n inc(): void {\n this.count++;\n }\n\n async dec(): Promise<void> {\n this.count--;\n if (this.count === 0 && this.disposeFn) {\n await this.disposeFn();\n }\n }\n\n getCount(): number {\n return this.count;\n }\n}\n","/**\n * Transactional event-application core shared by the real WorkflowRunDO and\n * the in-memory test mocks.\n *\n * All guard checks, the event append, and the entity mutation happen against a\n * single {@link EventStore}. The Durable Object wraps a call to\n * {@link applyEvent} in `ctx.storage.transaction()`, so the whole operation is\n * atomic; the mocks run it against an in-memory store.\n *\n * Guard semantics are ported from the upstream `@workflow/world-local` /\n * `@workflow/world-postgres` reference implementations (Workflow 5 contract):\n * - run_started on a terminal run -> RunExpiredError\n * - terminal transitions on a terminal run -> EntityConflictError\n * - run_cancelled is idempotent on an already-cancelled run\n * - duplicate step_created / hook_created -> EntityConflictError\n * - step events on a terminal step -> EntityConflictError\n * - step_started before step.retryAfter -> TooEarlyError\n * - error/output/completedAt are cleared whenever a run re-enters a\n * non-final status (WorkflowRunSchema is a discriminated union)\n *\n * Errors are returned as structured outcomes (never thrown) because custom\n * error classes do not survive the Durable Object RPC boundary with their\n * `name` intact — and `@workflow/errors` matches errors by name via `.is()`.\n * The storage layer converts outcomes back into the typed errors.\n */\n\nimport type {\n CreateEventParams,\n CreateEventRequest,\n Event,\n Hook,\n RunCreatedEventRequest,\n Step,\n Wait,\n WorkflowRun,\n} from '@workflow/world';\nimport {\n applyAttributeChanges,\n CreateEventSchema,\n eventIdToSlot,\n EventSchema,\n getMaxEventsPerRun,\n HookSchema,\n isChildEntityCreationEvent,\n isTerminalStepStatus,\n isTerminalWorkflowRunStatus,\n SPEC_VERSION_CURRENT,\n slotToEventId,\n StepSchema,\n validateAttributeChanges,\n WaitSchema,\n WorkflowRunSchema,\n} from '@workflow/world';\nimport { compact } from './util.js';\nimport type { ScheduleCleanupRequest } from './retention.js';\n\n/** Storage key for the run entity. */\nconst RUN_KEY = 'run';\n/** Key prefixes for per-entity storage. */\nexport const EVENT_KEY_PREFIX = 'event:';\nexport const STEP_KEY_PREFIX = 'step:';\nexport const HOOK_KEY_PREFIX = 'hook:';\nexport const WAIT_KEY_PREFIX = 'wait:';\nexport const STEP_CREATED_KEY_PREFIX = 'stepcreated:';\nexport const HOOK_CREATED_KEY_PREFIX = 'hookcreated:';\n/**\n * Marker recording that a hook_created event was committed for a hookId.\n * Mirrors postgres' `workflow_events_entity_creation_unique` partial index:\n * it outlives hook disposal so a replayed hook_created after dispose is\n * rejected as a duplicate instead of resurrecting the hook.\n */\nconst HOOK_EVENT_MARKER_PREFIX = 'hookevent:';\n/** Durable repair record for idempotent post-commit hook-index release. */\nconst HOOK_RELEASE_MARKER_PREFIX = 'hookreleased:';\n/** Exact ambiguous reservations canceled by a serialized RunDO resolution. */\nexport const HOOK_CLAIM_CANCELLATION_PREFIX = 'hookclaimcancelled:';\n/** Workflow-authored attr_set correlation claims. */\nconst ATTRIBUTE_EVENT_MARKER_PREFIX = 'attrevent:';\n/** Durable lazy-hook resume claims, scoped by the containing run DO. */\nconst HOOK_RESUME_CLAIM_PREFIX = 'hookresume:';\n\ninterface HookResumeClaim {\n hookId: string;\n eventId: string;\n payloadDigest?: string;\n}\n\nexport interface EventStoreListOptions {\n prefix: string;\n /** Exclusive lower bound (full key). */\n startAfter?: string;\n /** Exclusive upper bound (full key). */\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\n/**\n * Minimal transactional key-value surface, satisfied by\n * `DurableObjectTransaction` / `DurableObjectStorage` and by the in-memory\n * test-mock store. Keys list in lexicographic order (reversed when\n * `reverse: true`).\n */\nexport interface EventStore {\n get<T>(key: string): Promise<T | undefined>;\n /** Optional native multi-key read (128 keys per Durable Object call). */\n getMany?<T>(keys: string[]): Promise<Map<string, T>>;\n put<T>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<boolean>;\n /** Optional native multi-key delete. */\n deleteMany?(keys: string[]): Promise<number>;\n list<T>(options: EventStoreListOptions): Promise<Map<string, T>>;\n /**\n * Celld-only capability: terminal entity cleanup is persisted and paged by\n * WorkflowRunDO alarms instead of running inside the event transaction.\n */\n deferTerminalCleanup?: boolean;\n}\n\nconst STORAGE_BATCH_SIZE = 128;\nconst MAX_ENTITY_PAGE_SIZE = 1000;\n\nasync function getMany<T>(store: EventStore, keys: string[]): Promise<Map<string, T>> {\n if (store.getMany) {\n const result = new Map<string, T>();\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n const page = await store.getMany<T>(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n for (const entry of page) result.set(...entry);\n }\n return result;\n }\n const values = await Promise.all(keys.map((key) => store.get<T>(key)));\n return new Map(\n keys.flatMap((key, index) =>\n values[index] === undefined ? [] : ([[key, values[index] as T]] as Array<[string, T]>),\n ),\n );\n}\n\nasync function deleteMany(store: EventStore, keys: string[]): Promise<number> {\n if (store.deleteMany) {\n let deleted = 0;\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n deleted += await store.deleteMany(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n return deleted;\n }\n const results = await Promise.all(keys.map((key) => store.delete(key)));\n return results.filter(Boolean).length;\n}\n\nexport interface ApplyEventRequest {\n /** The effective run id (already resolved / generated by the caller). */\n runId: string;\n data: CreateEventRequest | RunCreatedEventRequest;\n /** Workflow 5 event-log position and preload options. */\n params?: CreateEventParams;\n /**\n * Current holder of the hook token per the sharded token-ownership index\n * (hook_created only). `null` means the token is unclaimed.\n */\n tokenHolder?: { runId: string; hookId: string } | null;\n /** Exact token/ID reservation fenced on ambiguous-delivery resolution. */\n hookClaimId?: string;\n /** Internal world-celld retention policy captured with the event. */\n cleanup?: ScheduleCleanupRequest;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Validate and canonicalize the untyped fleet-facing applyEvent envelope.\n * This runs before a RunDO transaction starts; in particular, malformed hook\n * events cannot allocate a sequence or touch hook/entity storage.\n */\nexport function parseApplyEventRequest(value: unknown): ApplyEventRequest {\n if (!isRecord(value)) throw new TypeError('applyEvent request must be an object');\n if (typeof value.runId !== 'string' || value.runId.length === 0) {\n throw new TypeError('applyEvent runId must be a non-empty string');\n }\n\n const data = CreateEventSchema.parse(isRecord(value.data) ? compact(value.data) : value.data);\n const params = value.params;\n if (params !== undefined) {\n if (!isRecord(params)) throw new TypeError('applyEvent params must be an object');\n if (\n params.occurredAt !== undefined &&\n (!(params.occurredAt instanceof Date) || Number.isNaN(params.occurredAt.getTime()))\n ) {\n throw new TypeError('applyEvent params.occurredAt must be a valid Date');\n }\n for (const key of ['resumeId', 'resumePayloadDigest', 'sinceCursor'] as const) {\n if (params[key] !== undefined && typeof params[key] !== 'string') {\n throw new TypeError(`applyEvent params.${key} must be a string`);\n }\n }\n if (\n params.eventCount !== undefined &&\n (typeof params.eventCount !== 'number' ||\n !Number.isSafeInteger(params.eventCount) ||\n params.eventCount < 0)\n ) {\n throw new TypeError('applyEvent params.eventCount must be a non-negative safe integer');\n }\n for (const key of ['skipPreload', 'preloadEvents'] as const) {\n if (params[key] !== undefined && params[key] !== true) {\n throw new TypeError(`applyEvent params.${key} must be true when present`);\n }\n }\n }\n\n let tokenHolder: ApplyEventRequest['tokenHolder'];\n if (value.tokenHolder === null) {\n tokenHolder = null;\n } else if (value.tokenHolder !== undefined) {\n if (\n !isRecord(value.tokenHolder) ||\n typeof value.tokenHolder.runId !== 'string' ||\n value.tokenHolder.runId.length === 0 ||\n typeof value.tokenHolder.hookId !== 'string' ||\n value.tokenHolder.hookId.length === 0\n ) {\n throw new TypeError('applyEvent tokenHolder must contain non-empty runId and hookId strings');\n }\n tokenHolder = { runId: value.tokenHolder.runId, hookId: value.tokenHolder.hookId };\n }\n\n if (\n value.hookClaimId !== undefined &&\n (typeof value.hookClaimId !== 'string' || value.hookClaimId.length === 0)\n ) {\n throw new TypeError('applyEvent hookClaimId must be a non-empty string');\n }\n\n return {\n runId: value.runId,\n data,\n ...(params === undefined ? {} : { params }),\n ...(value.tokenHolder === undefined ? {} : { tokenHolder }),\n ...(value.hookClaimId === undefined ? {} : { hookClaimId: value.hookClaimId }),\n ...(value.cleanup === undefined ? {} : { cleanup: value.cleanup as ScheduleCleanupRequest }),\n };\n}\n\nexport type ApplyEventErrorCode =\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\nexport interface ApplyEventFailure {\n ok: false;\n code: ApplyEventErrorCode;\n message: string;\n /** Seconds until retry is allowed (TOO_EARLY only). */\n retryAfterSeconds?: number;\n /** The run's spec version (RUN_NOT_SUPPORTED only). */\n runSpecVersion?: number;\n}\n\nexport interface ApplyEventSuccess {\n ok: true;\n /** Absent for idempotent replays that record no new event. */\n event?: Event;\n run?: WorkflowRun;\n step?: Step;\n hook?: Hook;\n wait?: Wait;\n /** True when a lazy step_started atomically created its step. */\n stepCreated?: true;\n /** Hooks whose token and ID indexes must be released. */\n releasedHooks: Array<{ hookId: string; token: string }>;\n /** Set when a run entity was created (run_created or resilient bootstrap). */\n runCreated?: { workflowName: string; createdAt: Date };\n /** Set when the sharded hook indexes must be (re)written. */\n hookToIndex?: Hook;\n /** All events (ascending), preloaded for run_started responses. */\n events?: Event[];\n /** Pagination metadata required whenever events are returned. */\n cursor?: string | null;\n hasMore?: boolean;\n /** Server-owned event ceiling advertised on run lifecycle writes. */\n maxEvents?: number;\n /** Deadline for publishing this authoritative mutation to derivative indexes. */\n indexPublicationExpiresAt?: number;\n /** Set by the worker router after it published `run` to the run catalog. */\n runIndexPublished?: true;\n /** Set by the worker router after it released `releasedHooks` from the hook indexes. */\n hookIndexesReleased?: true;\n /**\n * The unchanged run returned with a `preloadEvents` hook_received replay\n * log. It is not a run mutation, so it carries no index publication.\n */\n replayRun?: WorkflowRun;\n}\n\nexport type ApplyEventOutcome = ApplyEventSuccess | ApplyEventFailure;\n\ninterface ApplyEventContext extends ApplyEventRequest {\n nextEventId(): string;\n now: Date;\n}\n\nfunction failure(\n code: ApplyEventErrorCode,\n message: string,\n extra?: Pick<ApplyEventFailure, 'retryAfterSeconds' | 'runSpecVersion'>,\n): ApplyEventFailure {\n return { ok: false, code, message, ...extra };\n}\n\nexport function hookClaimCancellationKey(claimId: string): string {\n return `${HOOK_CLAIM_CANCELLATION_PREFIX}${encodeURIComponent(claimId)}`;\n}\n\nfunction readStringProp(value: unknown, key: string): string | undefined {\n if (value !== null && typeof value === 'object') {\n const prop = (value as Record<string, unknown>)[key];\n if (typeof prop === 'string') return prop;\n }\n return undefined;\n}\n\n/**\n * Map a failure eventData.error (which may be a string, an Error-shaped\n * object, or anything else) to the structured error stored on entities.\n * Matches upstream: string errors keep their text, errorCode is preserved.\n */\nfunction toStructuredError(\n error: unknown,\n opts?: { stack?: string; code?: string },\n): { message: string; stack?: string; code?: string } {\n const message =\n typeof error === 'string' ? error : (readStringProp(error, 'message') ?? 'Unknown error');\n return {\n message,\n stack: opts?.stack ?? readStringProp(error, 'stack'),\n code: opts?.code ?? readStringProp(error, 'code'),\n };\n}\n\n/**\n * Shared cursor pagination over a key prefix. Fetches `limit + 1` entries to\n * detect `hasMore` without ever skipping the boundary entry (the cursor is\n * derived from the last *returned* item, not the peeked one).\n */\nexport async function listByPrefix<T>(\n store: EventStore,\n prefix: string,\n params: { limit: number; cursor?: string; sortOrder?: 'asc' | 'desc' },\n getId: (item: T) => string,\n): Promise<{ data: T[]; cursor: string | null; hasMore: boolean }> {\n const { limit, cursor, sortOrder = 'asc' } = params;\n const options: EventStoreListOptions =\n sortOrder === 'desc'\n ? { prefix, reverse: true, limit: limit + 1, end: cursor ? `${prefix}${cursor}` : undefined }\n : { prefix, limit: limit + 1, startAfter: cursor ? `${prefix}${cursor}` : undefined };\n const entries = await store.list<T>(options);\n const values = Array.from(entries.values());\n const hasMore = values.length > limit;\n const data = values.slice(0, limit);\n const last = data.at(-1);\n return {\n data,\n cursor: hasMore && last !== undefined ? getId(last) : null,\n hasMore,\n };\n}\n\nfunction creationIndexKey(prefix: string, createdAt: Date, id: string): string {\n return `${prefix}${createdAt.toISOString()}:${id}`;\n}\n\n/**\n * Cursor pagination over an explicit creation-time index. Entity ids are\n * values rather than key suffixes, so caller-supplied ids cannot disturb the\n * requested ordering.\n */\nexport async function listByCreationTime<T>(\n store: EventStore,\n indexPrefix: string,\n entityPrefix: string,\n params: { limit: number; cursor?: string; sortOrder?: 'asc' | 'desc' },\n): Promise<{ data: T[]; cursor: string | null; hasMore: boolean }> {\n const requestedLimit = Number.isFinite(params.limit) ? Math.floor(params.limit) : 1;\n const limit = Math.min(MAX_ENTITY_PAGE_SIZE, Math.max(1, requestedLimit));\n const { cursor, sortOrder = 'asc' } = params;\n const entries = await store.list<string>(\n sortOrder === 'desc'\n ? {\n prefix: indexPrefix,\n reverse: true,\n limit: limit + 1,\n end: cursor ? `${indexPrefix}${cursor}` : undefined,\n }\n : {\n prefix: indexPrefix,\n limit: limit + 1,\n startAfter: cursor ? `${indexPrefix}${cursor}` : undefined,\n },\n );\n const page = Array.from(entries.entries()).slice(0, limit);\n const entityKeys = page.map(([, id]) => `${entityPrefix}${id}`);\n const entities = await getMany<T>(store, entityKeys);\n const data = entityKeys.flatMap((key) => {\n const item = entities.get(key);\n return item === undefined ? [] : [item];\n });\n const hasMore = entries.size > limit;\n const lastKey = page.at(-1)?.[0];\n return {\n data,\n cursor: hasMore && lastKey ? lastKey.slice(indexPrefix.length) : null,\n hasMore,\n };\n}\n\n/** Delete all hook entities for the run, returning the released tokens. */\nasync function releaseAllHooks(\n store: EventStore,\n): Promise<Array<{ hookId: string; token: string }>> {\n if (store.deferTerminalCleanup) return [];\n const hooks = await store.list<Hook>({ prefix: HOOK_KEY_PREFIX });\n const released: Array<{ hookId: string; token: string }> = [];\n const keys: string[] = [];\n for (const hook of hooks.values()) {\n keys.push(`${HOOK_KEY_PREFIX}${hook.hookId}`);\n keys.push(creationIndexKey(HOOK_CREATED_KEY_PREFIX, hook.createdAt, hook.hookId));\n released.push({ hookId: hook.hookId, token: hook.token });\n }\n await deleteMany(store, keys);\n return released;\n}\n\n/** Delete all persisted waits once their owning run becomes terminal. */\nasync function releaseAllWaits(store: EventStore): Promise<void> {\n if (store.deferTerminalCleanup) return;\n const waits = await store.list<Wait>({ prefix: WAIT_KEY_PREFIX });\n await deleteMany(store, Array.from(waits.keys()));\n}\n\nexport async function applyEvent(\n store: EventStore,\n ctx: ApplyEventContext,\n): Promise<ApplyEventOutcome> {\n const { runId, data, now } = ctx;\n const specVersion = data.specVersion ?? SPEC_VERSION_CURRENT;\n\n if (specVersion !== SPEC_VERSION_CURRENT) {\n return failure(\n 'RUN_NOT_SUPPORTED',\n `Run \"${runId}\" uses unsupported specVersion ${specVersion}; this world requires ${SPEC_VERSION_CURRENT}`,\n { runSpecVersion: specVersion },\n );\n }\n\n /** Build and validate the stored event BEFORE anything is persisted. */\n const buildEvent = (record: Record<string, unknown>): Event => {\n const withMeta: Record<string, unknown> = {\n ...record,\n runId,\n eventId: ctx.nextEventId(),\n createdAt: now,\n occurredAt: ctx.params?.occurredAt,\n resumeId: ctx.params?.resumeId,\n specVersion,\n };\n if (record.eventType !== 'hook_received') {\n delete withMeta.resumeId;\n }\n if (record.eventType === 'run_started') {\n delete withMeta.eventData;\n }\n if (\n record.eventType === 'step_started' &&\n withMeta.eventData !== null &&\n typeof withMeta.eventData === 'object'\n ) {\n const { input: _input, ...eventData } = withMeta.eventData as Record<string, unknown>;\n withMeta.eventData = eventData;\n }\n return EventSchema.parse(compact(withMeta));\n };\n\n const putEvent = async (event: Event): Promise<void> => {\n await store.put(`${EVENT_KEY_PREFIX}${event.eventId}`, event);\n };\n\n // ============================================================\n // VALIDATION: current run state (skipped for run_created and for\n // step_completed / step_retrying, matching upstream — those only operate\n // on running steps regardless of run state).\n // ============================================================\n let currentRun: WorkflowRun | undefined;\n const skipRunValidation =\n data.eventType === 'run_created' ||\n data.eventType === 'step_completed' ||\n data.eventType === 'step_retrying';\n if (!skipRunValidation) {\n currentRun = await store.get<WorkflowRun>(RUN_KEY);\n }\n\n // ============================================================\n // RESILIENT START: run_started on a non-existent run bootstraps the run\n // from the message's runInput (spec >= 3 queue transport).\n // ============================================================\n let bootstrapped: ApplyEventSuccess['runCreated'];\n if (data.eventType === 'run_started' && !currentRun && data.eventData) {\n const {\n deploymentId,\n workflowName,\n input,\n executionContext,\n attributes,\n allowReservedAttributes,\n encryptionPublicKey,\n } = data.eventData;\n if (deploymentId && workflowName && input !== undefined) {\n const attributeChanges = Object.entries(attributes ?? {}).map(([key, value]) => ({\n key,\n value,\n }));\n validateAttributeChanges(attributeChanges, { allowReservedAttributes });\n const createdRun = WorkflowRunSchema.parse(\n compact({\n runId,\n deploymentId,\n workflowName,\n specVersion,\n executionContext,\n attributes,\n encryptionPublicKey,\n input,\n status: 'pending',\n output: undefined,\n error: undefined,\n startedAt: undefined,\n completedAt: undefined,\n createdAt: now,\n updatedAt: now,\n }),\n );\n const runCreatedEvent = buildEvent({\n eventType: 'run_created',\n eventData: {\n deploymentId,\n workflowName,\n input,\n executionContext,\n attributes,\n allowReservedAttributes,\n encryptionPublicKey,\n },\n });\n await store.put(RUN_KEY, createdRun);\n await putEvent(runCreatedEvent);\n currentRun = createdRun;\n bootstrapped = { workflowName, createdAt: now };\n }\n }\n\n // ============================================================\n // WORKFLOW 5 PROTOCOL BOUNDARY\n // ============================================================\n if (currentRun && currentRun.specVersion !== SPEC_VERSION_CURRENT) {\n return failure(\n 'RUN_NOT_SUPPORTED',\n `Run \"${runId}\" uses unsupported specVersion ${currentRun.specVersion}; this world requires ${SPEC_VERSION_CURRENT}`,\n { runSpecVersion: currentRun.specVersion },\n );\n }\n\n // ============================================================\n // GUARDS: terminal run state\n // ============================================================\n if (currentRun && isTerminalWorkflowRunStatus(currentRun.status)) {\n // Idempotent: run_cancelled on an already-cancelled run records the event\n // and returns the current state.\n if (data.eventType === 'run_cancelled' && currentRun.status === 'cancelled') {\n const event = buildEvent({ ...data });\n await putEvent(event);\n return { ok: true, event, run: currentRun, releasedHooks: [] };\n }\n if (data.eventType === 'run_started') {\n return failure(\n 'RUN_EXPIRED',\n `Workflow run \"${runId}\" is already in terminal state \"${currentRun.status}\"`,\n );\n }\n if (\n data.eventType === 'run_completed' ||\n data.eventType === 'run_failed' ||\n data.eventType === 'run_cancelled'\n ) {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot transition run from terminal state \"${currentRun.status}\"`,\n );\n }\n if (isChildEntityCreationEvent(data)) {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot create new entities on run in terminal state \"${currentRun.status}\"`,\n );\n }\n if (data.eventType === 'attr_set') {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot set attributes on run in terminal state \"${currentRun.status}\"`,\n );\n }\n }\n\n // ============================================================\n // GUARDS: step ordering and terminal state\n // ============================================================\n let validatedStep: Step | undefined;\n if (\n data.eventType === 'step_started' ||\n data.eventType === 'step_completed' ||\n data.eventType === 'step_failed' ||\n data.eventType === 'step_retrying'\n ) {\n const lazyStepStart = data.eventType === 'step_started' && isChildEntityCreationEvent(data);\n validatedStep = await store.get<Step>(`${STEP_KEY_PREFIX}${data.correlationId}`);\n if (!validatedStep) {\n if (!lazyStepStart) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n } else if (lazyStepStart) {\n return failure('ENTITY_CONFLICT', `Step \"${data.correlationId}\" already exists`);\n }\n if (validatedStep && isTerminalStepStatus(validatedStep.status)) {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot modify step in terminal state \"${validatedStep.status}\"`,\n );\n }\n // On terminal runs, only in-flight steps may still record progress.\n if (\n currentRun &&\n isTerminalWorkflowRunStatus(currentRun.status) &&\n validatedStep &&\n validatedStep.status !== 'running'\n ) {\n return failure(\n 'RUN_EXPIRED',\n `Cannot modify non-running step on run in terminal state \"${currentRun.status}\"`,\n );\n }\n }\n\n // ============================================================\n // GUARDS: hook event ordering\n // ============================================================\n if (data.eventType === 'hook_received' && ctx.params?.resumeId) {\n const claim = await store.get<HookResumeClaim>(\n `${HOOK_RESUME_CLAIM_PREFIX}${ctx.params.resumeId}`,\n );\n if (claim) {\n if (claim.hookId !== data.correlationId) {\n return failure(\n 'ENTITY_CONFLICT',\n `hook_received resumeId \"${ctx.params.resumeId}\" already recorded for a different hook`,\n );\n }\n if (\n claim.payloadDigest &&\n ctx.params.resumePayloadDigest &&\n claim.payloadDigest !== ctx.params.resumePayloadDigest\n ) {\n return failure(\n 'ENTITY_CONFLICT',\n `hook_received resumeId \"${ctx.params.resumeId}\" already recorded with a different payload`,\n );\n }\n const committed = await store.get<Event>(`${EVENT_KEY_PREFIX}${claim.eventId}`);\n if (\n committed?.eventType === 'hook_received' &&\n committed.correlationId === claim.hookId &&\n committed.resumeId === ctx.params.resumeId\n ) {\n return { ok: true, event: committed, releasedHooks: [] };\n }\n if (committed) {\n return failure(\n 'ENTITY_CONFLICT',\n `hook_received resumeId \"${ctx.params.resumeId}\" points to a different event`,\n );\n }\n }\n }\n if (\n (data.eventType === 'hook_disposed' || data.eventType === 'hook_received') &&\n data.correlationId\n ) {\n const existingHook = await store.get<Hook>(`${HOOK_KEY_PREFIX}${data.correlationId}`);\n if (!existingHook) {\n if (data.eventType === 'hook_disposed') {\n const released = await store.get<{ hookId: string; token: string }>(\n `${HOOK_RELEASE_MARKER_PREFIX}${data.correlationId}`,\n );\n if (released) return { ok: true, releasedHooks: [released] };\n }\n return failure('HOOK_NOT_FOUND', `Hook \"${data.correlationId}\" not found`);\n }\n }\n\n // Non-run_created events require the run to exist (after the resilient\n // start bootstrap had its chance). step_completed / step_retrying skip the\n // run read entirely — their step guard above already proves the run exists.\n if (!skipRunValidation && data.eventType !== 'run_started' && !currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n\n // ============================================================\n // EVENT + ENTITY WRITES (single transaction)\n // ============================================================\n switch (data.eventType) {\n case 'run_created': {\n const existing = await store.get<WorkflowRun>(RUN_KEY);\n if (existing) {\n // Idempotent replay: return the existing run without appending a\n // duplicate run_created event to the log.\n return { ok: true, run: existing, releasedHooks: [] };\n }\n const attributeChanges = Object.entries(data.eventData.attributes ?? {}).map(\n ([key, value]) => ({ key, value }),\n );\n validateAttributeChanges(attributeChanges, {\n allowReservedAttributes: data.eventData.allowReservedAttributes,\n });\n const run = WorkflowRunSchema.parse(\n compact({\n runId,\n deploymentId: data.eventData.deploymentId,\n workflowName: data.eventData.workflowName,\n specVersion,\n executionContext: data.eventData.executionContext,\n attributes: data.eventData.attributes,\n encryptionPublicKey: data.eventData.encryptionPublicKey,\n input: data.eventData.input,\n status: 'pending',\n output: undefined,\n error: undefined,\n startedAt: undefined,\n completedAt: undefined,\n createdAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n return {\n ok: true,\n event,\n run,\n releasedHooks: [],\n runCreated: { workflowName: data.eventData.workflowName, createdAt: now },\n };\n }\n\n case 'run_started': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n // Idempotent for concurrent invocations / queue redeliveries: if the\n // run is already running this is a replay — no duplicate event.\n if (currentRun.status === 'running') {\n const result: ApplyEventSuccess = {\n ok: true,\n run: currentRun,\n releasedHooks: [],\n maxEvents: getMaxEventsPerRun(),\n };\n if (ctx.params?.skipPreload) return result;\n const allEvents = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: getMaxEventsPerRun(), sortOrder: 'asc' },\n (event) => event.eventId,\n );\n return {\n ...result,\n events: allEvents.data,\n cursor: allEvents.cursor,\n hasMore: allEvents.hasMore,\n };\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'running',\n output: undefined,\n error: undefined,\n completedAt: undefined,\n startedAt: currentRun.startedAt ?? now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n // Preload all events so the runtime can skip the initial events.list.\n const result: ApplyEventSuccess = {\n ok: true,\n event,\n run,\n releasedHooks: [],\n runCreated: bootstrapped,\n maxEvents: getMaxEventsPerRun(),\n };\n if (ctx.params?.skipPreload) return result;\n const allEvents = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: getMaxEventsPerRun(), sortOrder: 'asc' },\n (e) => e.eventId,\n );\n return {\n ...result,\n events: allEvents.data,\n cursor: allEvents.cursor,\n hasMore: allEvents.hasMore,\n };\n }\n\n case 'run_completed': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'completed',\n output: data.eventData.output,\n error: undefined,\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n const releasedHooks = await releaseAllHooks(store);\n await releaseAllWaits(store);\n return { ok: true, event, run, releasedHooks };\n }\n\n case 'run_failed': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'failed',\n output: undefined,\n error: toStructuredError(data.eventData.error, {\n code: data.eventData.errorCode ?? readStringProp(data.eventData.error, 'code'),\n }),\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n const releasedHooks = await releaseAllHooks(store);\n await releaseAllWaits(store);\n return { ok: true, event, run, releasedHooks };\n }\n\n case 'run_cancelled': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'cancelled',\n output: undefined,\n error: undefined,\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n const releasedHooks = await releaseAllHooks(store);\n await releaseAllWaits(store);\n return { ok: true, event, run, releasedHooks };\n }\n\n case 'attr_set': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n validateAttributeChanges(data.eventData.changes, {\n existingKeys: Object.keys(currentRun.attributes),\n allowReservedAttributes: data.eventData.allowReservedAttributes,\n });\n const markerKey =\n data.correlationId && data.eventData.writer.type === 'workflow'\n ? `${ATTRIBUTE_EVENT_MARKER_PREFIX}${data.correlationId}`\n : undefined;\n if (markerKey && (await store.get<string>(markerKey)) !== undefined) {\n return failure('ENTITY_CONFLICT', `Attribute event \"${data.correlationId}\" already exists`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n attributes: applyAttributeChanges(currentRun.attributes, data.eventData.changes),\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n if (markerKey) await store.put(markerKey, event.eventId);\n await putEvent(event);\n return { ok: true, event, run, releasedHooks: [] };\n }\n\n case 'step_created': {\n const stepKey = `${STEP_KEY_PREFIX}${data.correlationId}`;\n const existing = await store.get<Step>(stepKey);\n if (existing) {\n // Core catches EntityConflictError for exactly this replay case\n // (\"Step already exists, continuing\").\n return failure('ENTITY_CONFLICT', `Step \"${data.correlationId}\" already exists`);\n }\n const step = StepSchema.parse(\n compact({\n runId,\n stepId: data.correlationId,\n stepName: data.eventData.stepName,\n status: 'pending',\n input: data.eventData.input,\n output: undefined,\n error: undefined,\n attempt: 0,\n startedAt: undefined,\n completedAt: undefined,\n retryAfter: undefined,\n createdAt: now,\n updatedAt: now,\n specVersion,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(stepKey, step);\n await store.put(\n creationIndexKey(STEP_CREATED_KEY_PREFIX, step.createdAt, step.stepId),\n step.stepId,\n );\n await putEvent(event);\n return { ok: true, event, step, releasedHooks: [] };\n }\n\n case 'step_started': {\n let step = validatedStep;\n let stepCreated = false;\n if (!step && data.eventData?.input !== undefined && data.eventData.stepName) {\n step = StepSchema.parse(\n compact({\n runId,\n stepId: data.correlationId,\n stepName: data.eventData.stepName,\n status: 'pending',\n input: data.eventData.input,\n attempt: 0,\n createdAt: now,\n updatedAt: now,\n specVersion,\n }),\n );\n const createdEvent = buildEvent({\n eventType: 'step_created',\n correlationId: data.correlationId,\n eventData: {\n stepName: data.eventData.stepName,\n workflowName: data.eventData.workflowName,\n input: data.eventData.input,\n },\n });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, step);\n await store.put(\n creationIndexKey(STEP_CREATED_KEY_PREFIX, step.createdAt, step.stepId),\n step.stepId,\n );\n await putEvent(createdEvent);\n stepCreated = true;\n }\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n if (step.retryAfter && step.retryAfter.getTime() > now.getTime()) {\n return failure(\n 'TOO_EARLY',\n `Cannot start step \"${data.correlationId}\": retryAfter timestamp has not been reached yet`,\n {\n retryAfterSeconds: Math.ceil((step.retryAfter.getTime() - now.getTime()) / 1000),\n },\n );\n }\n const updated = StepSchema.parse(\n compact({\n ...step,\n status: 'running',\n // Only set startedAt on the first start; increment attempt each start.\n startedAt: step.startedAt ?? now,\n attempt: step.attempt + 1,\n retryAfter: undefined,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return {\n ok: true,\n event,\n step: updated,\n releasedHooks: [],\n ...(stepCreated ? { stepCreated: true } : {}),\n };\n }\n\n case 'step_completed': {\n const step = validatedStep;\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n const updated = StepSchema.parse(\n compact({\n ...step,\n status: 'completed',\n output: data.eventData.result,\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return { ok: true, event, step: updated, releasedHooks: [] };\n }\n\n case 'step_failed': {\n const step = validatedStep;\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n const updated = StepSchema.parse(\n compact({\n ...step,\n status: 'failed',\n error: toStructuredError(data.eventData.error),\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return { ok: true, event, step: updated, releasedHooks: [] };\n }\n\n case 'step_retrying': {\n const step = validatedStep;\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n const updated = StepSchema.parse(\n compact({\n ...step,\n status: 'pending',\n error: toStructuredError(data.eventData.error),\n retryAfter: data.eventData.retryAfter ? new Date(data.eventData.retryAfter) : undefined,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return { ok: true, event, step: updated, releasedHooks: [] };\n }\n\n case 'hook_created': {\n const hookId = data.correlationId;\n const token = data.eventData.token;\n const holder = ctx.tokenHolder ?? null;\n const markerKey = `${HOOK_EVENT_MARKER_PREFIX}${hookId}`;\n const hookKey = `${HOOK_KEY_PREFIX}${hookId}`;\n\n if (\n ctx.hookClaimId &&\n (await store.get(hookClaimCancellationKey(ctx.hookClaimId))) !== undefined\n ) {\n return failure(\n 'HOOK_CLAIM_CANCELLED',\n `Hook reservation for \"${hookId}\" was canceled before commit`,\n );\n }\n\n if (holder && (holder.runId !== runId || holder.hookId !== hookId)) {\n // A different (runId, hookId) holds this token. Record a\n // hook_conflict event carrying conflictingRunId so the claiming\n // workflow fails deterministically when the hook is awaited. The\n // legitimate holder's KV index entry is left untouched.\n const event = buildEvent({\n eventType: 'hook_conflict',\n correlationId: hookId,\n eventData: { token, conflictingRunId: holder.runId },\n });\n await putEvent(event);\n return { ok: true, event, releasedHooks: [] };\n }\n\n const existingMarker = await store.get<string>(markerKey);\n if (existingMarker !== undefined) {\n const existingHook = await store.get<Hook>(hookKey);\n if (existingHook && !holder) {\n // Crash orphan: hook + event committed but one or both sharded\n // index writes were lost. Complete the partial write by re-indexing.\n return { ok: true, hook: existingHook, hookToIndex: existingHook, releasedHooks: [] };\n }\n // Fully-committed duplicate (or re-create after disposal): reject so\n // the runtime's concurrent-replay catch path can swallow it.\n return failure('ENTITY_CONFLICT', `Hook \"${hookId}\" already created`);\n }\n\n const hook = HookSchema.parse(\n compact({\n runId,\n hookId,\n token,\n metadata: data.eventData.metadata,\n ownerId: '',\n projectId: '',\n environment: '',\n createdAt: now,\n specVersion,\n isWebhook: data.eventData.isWebhook ?? false,\n isSystem: data.eventData.isSystem,\n tokenRetentionUntil: data.eventData.tokenRetentionUntil,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(hookKey, hook);\n await store.put(\n creationIndexKey(HOOK_CREATED_KEY_PREFIX, hook.createdAt, hook.hookId),\n hook.hookId,\n );\n await store.put(markerKey, event.eventId);\n await putEvent(event);\n return { ok: true, event, hook, hookToIndex: hook, releasedHooks: [] };\n }\n\n case 'hook_disposed': {\n const hookKey = `${HOOK_KEY_PREFIX}${data.correlationId}`;\n // Existence was validated above; read again for the token.\n const hook = await store.get<Hook>(hookKey);\n if (!hook) {\n return failure('HOOK_NOT_FOUND', `Hook \"${data.correlationId}\" not found`);\n }\n await store.delete(hookKey);\n await store.delete(creationIndexKey(HOOK_CREATED_KEY_PREFIX, hook.createdAt, hook.hookId));\n await store.put(`${HOOK_RELEASE_MARKER_PREFIX}${hook.hookId}`, {\n hookId: hook.hookId,\n token: hook.token,\n });\n const event = buildEvent({ ...data });\n await putEvent(event);\n return {\n ok: true,\n event,\n releasedHooks: [{ hookId: hook.hookId, token: hook.token }],\n };\n }\n\n case 'wait_created': {\n const waitKey = `${WAIT_KEY_PREFIX}${data.correlationId}`;\n if ((await store.get<Wait>(waitKey)) !== undefined) {\n return failure('ENTITY_CONFLICT', `Wait \"${data.correlationId}\" already exists`);\n }\n const wait = WaitSchema.parse({\n waitId: `${runId}-${data.correlationId}`,\n runId,\n status: 'waiting',\n resumeAt: data.eventData.resumeAt,\n createdAt: now,\n updatedAt: now,\n specVersion,\n });\n const event = buildEvent({ ...data });\n await store.put(waitKey, wait);\n await putEvent(event);\n return { ok: true, event, wait, releasedHooks: [] };\n }\n\n case 'wait_completed': {\n const waitKey = `${WAIT_KEY_PREFIX}${data.correlationId}`;\n const existing = await store.get<Wait>(waitKey);\n if (!existing) {\n return failure('WAIT_NOT_FOUND', `Wait \"${data.correlationId}\" not found`);\n }\n if (existing.status === 'completed') {\n return failure('ENTITY_CONFLICT', `Wait \"${data.correlationId}\" already completed`);\n }\n const event = buildEvent({ ...data });\n const wait = WaitSchema.parse({\n ...existing,\n status: 'completed',\n resumeAt: data.eventData?.resumeAt ?? existing.resumeAt,\n completedAt: now,\n updatedAt: now,\n });\n await store.put(waitKey, wait);\n await putEvent(event);\n return { ok: true, event, wait, releasedHooks: [] };\n }\n\n // hook_received and hook_conflict are event-only at the entity level.\n default: {\n const event = buildEvent({ ...data });\n await putEvent(event);\n if (data.eventType === 'hook_received' && ctx.params?.resumeId) {\n await store.put<HookResumeClaim>(`${HOOK_RESUME_CLAIM_PREFIX}${ctx.params.resumeId}`, {\n hookId: data.correlationId,\n eventId: event.eventId,\n ...(ctx.params.resumePayloadDigest\n ? { payloadDigest: ctx.params.resumePayloadDigest }\n : {}),\n });\n }\n return { ok: true, event, releasedHooks: [] };\n }\n }\n}\n\n/**\n * Complete Workflow 5's event-page response after an atomic apply. A celld\n * run is a single serialized writer, so the committed sequence is dense; a\n * stale eventCount therefore needs only the slots between the requested\n * position and the event this call committed.\n */\nexport async function finalizeEventPage(\n store: EventStore,\n outcome: ApplyEventOutcome,\n params?: CreateEventParams,\n): Promise<ApplyEventOutcome> {\n if (!outcome.ok) return outcome;\n const result: ApplyEventSuccess =\n outcome.run && outcome.maxEvents === undefined\n ? { ...outcome, maxEvents: getMaxEventsPerRun() }\n : outcome;\n if (!result.event) return result;\n\n if (params?.preloadEvents && result.event.eventType === 'hook_received') {\n return await attachHookReplayPreload(store, result);\n }\n\n if (typeof params?.sinceCursor === 'string') {\n const page = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: 100, cursor: params.sinceCursor, sortOrder: 'asc' },\n (event) => event.eventId,\n );\n return { ...result, events: page.data, cursor: page.cursor, hasMore: page.hasMore };\n }\n\n if (params?.eventCount === undefined) return result;\n const committedSlot = eventIdToSlot(result.event.eventId);\n if (committedSlot === null || committedSlot <= params.eventCount + 1) return result;\n\n const skippedCount = committedSlot - params.eventCount - 1;\n const page = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n {\n limit: skippedCount,\n cursor: params.eventCount > 0 ? slotToEventId(params.eventCount) : undefined,\n sortOrder: 'asc',\n },\n (event) => event.eventId,\n );\n const events = page.data.filter((event) => event.eventId < result.event!.eventId);\n return {\n ...result,\n events,\n cursor: null,\n hasMore: events.length < skippedCount,\n };\n}\n\n/**\n * Lazy hook resume preload: return the run and its complete replay log with\n * the hook_received write, read in the same transaction, so the runtime can\n * skip its run_started write and the index publication that follows it. The\n * runtime trusts only a complete log with a non-null cursor, so a run that is\n * not started, not running, or over the event ceiling gets the plain result.\n */\nasync function attachHookReplayPreload(\n store: EventStore,\n result: ApplyEventSuccess,\n): Promise<ApplyEventSuccess> {\n const run = await store.get<WorkflowRun>(RUN_KEY);\n if (!run?.startedAt || run.status !== 'running') return result;\n const maxEvents = getMaxEventsPerRun();\n const log = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: maxEvents, sortOrder: 'asc' },\n (event) => event.eventId,\n );\n const last = log.data.at(-1);\n if (log.hasMore || last === undefined) return result;\n return {\n ...result,\n replayRun: run,\n maxEvents,\n events: log.data,\n // events.list cursors are the last returned event ID (exclusive start).\n cursor: last.eventId,\n hasMore: false,\n };\n}\n","/**\n * RPC wire codec for the Node client <-> worker router HTTP boundary.\n *\n * Extends the shared tagged-JSON format (`{__type:'Uint8Array', data}` +\n * DATE_FIELDS revival) with explicitly tagged Dates: on Cloudflare the DO RPC\n * boundary is structured clone, which preserves EVERY Date — including ones\n * outside the well-known DATE_FIELDS (e.g. inside applyEvent outcomes and\n * user payloads). The HTTP hop must preserve them too, so Dates travel as\n * `{__type:'Date', iso}`.\n *\n * Runs on both sides of the wire, including inside the celld worker — so no\n * Node built-ins (Buffer): base64 uses the native Uint8Array methods or\n * atob/btoa.\n */\nimport { b64decode, b64encode, dateReviver } from './vendor/shared/serialization.js';\n\nfunction rpcReplacer(this: unknown, key: string, value: unknown): unknown {\n // JSON.stringify invokes Date.toJSON before the replacer sees the value;\n // recover the original from the holder object.\n const original =\n this && typeof this === 'object' ? (this as Record<string, unknown>)[key] : undefined;\n if (original instanceof Date) {\n return { __type: 'Date', iso: original.toISOString() };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8Array', data: b64encode(value) };\n }\n return value;\n}\n\nfunction rpcReviver(key: string, value: unknown): unknown {\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (obj.__type === 'Date') {\n if (typeof obj.iso !== 'string') throw new SyntaxError('Malformed Date tag');\n const date = new Date(obj.iso);\n if (Number.isNaN(date.getTime())) throw new SyntaxError('Malformed Date tag');\n return date;\n }\n if (obj.__type === 'Uint8Array') {\n if (typeof obj.data !== 'string') throw new SyntaxError('Malformed Uint8Array tag');\n try {\n return b64decode(obj.data);\n } catch {\n throw new SyntaxError('Malformed Uint8Array tag');\n }\n }\n }\n // Fallback shared-codec semantics for untagged ISO strings in DATE_FIELDS.\n return dateReviver(key, value);\n}\n\nexport function rpcStringify(value: unknown): string {\n return JSON.stringify(value, rpcReplacer);\n}\n\nexport function rpcParse<T>(text: string): T {\n return JSON.parse(text, rpcReviver) as T;\n}\n","import { isTerminalWorkflowRunStatus, type WorkflowRun } from '@workflow/world';\nimport type { IndexListOptions, IndexListPage } from './indexes.js';\n\n/** Bound cross-run fanout so large list pages cannot create an RPC burst. */\nexport const RUN_LIST_CONCURRENCY = 8;\n/** Largest page the fleet-side list accepts, matching the catalog page limit. */\nexport const MAX_RUN_LIST_LIMIT = 1000;\n\nexport type RunStatus = WorkflowRun['status'];\n\n/** Wire shape of a run listing, shared by the client and the worker router. */\nexport interface RunListRequest {\n workflowName?: string;\n statuses?: RunStatus[];\n limit: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n /** 'none' strips run input and output from the returned page. */\n resolveData?: 'none' | 'all';\n}\n\nexport interface RunListPage {\n data: WorkflowRun[];\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport interface RunListDependencies {\n listRuns(options: IndexListOptions): Promise<IndexListPage>;\n /** The authoritative run, or null when it does not exist or has expired. */\n readRun(runId: string): Promise<WorkflowRun | null>;\n}\n\ninterface RunIndexMetadata {\n runId: string;\n status: RunStatus;\n}\n\n/**\n * Run statuses only move pending -> running -> terminal, and terminal statuses\n * are immutable. An older index value may therefore safely exclude a filter\n * only when it is already terminal, or when the caller asks for pending and\n * the index has advanced beyond pending. Earlier non-terminal metadata cannot\n * exclude a later status because a post-commit index write may need replay.\n */\nfunction indexStatusExcludes(indexed: RunStatus, requested: RunStatus | undefined): boolean {\n if (requested === undefined || indexed === requested) return false;\n return isTerminalWorkflowRunStatus(indexed) || requested === 'pending';\n}\n\nexport function stripRunData(run: WorkflowRun): WorkflowRun {\n const { input: _input, output: _output, ...rest } = run;\n return rest;\n}\n\n/**\n * Page through the run catalog, verifying every candidate against its\n * authoritative run cell. Runs on the client against remote bindings, or in\n * the worker router against fleet bindings.\n */\nexport async function listRunsPage(\n deps: RunListDependencies,\n request: RunListRequest,\n): Promise<RunListPage> {\n const { statuses, limit } = request;\n const prefix = request.workflowName ? `run:${request.workflowName}:` : 'runall:';\n const reverse = request.sortOrder === 'desc';\n const matches: Array<{ key: string; run: WorkflowRun }> = [];\n let scanCursor = request.cursor;\n let exhausted = false;\n\n // Keep scanning index pages until the requested page is full. This\n // prevents status filters and stale derived entries from producing\n // short pages or cursors that skip matching runs.\n while (matches.length <= limit && !exhausted) {\n const kvList = await deps.listRuns({\n prefix,\n limit: Math.min(MAX_RUN_LIST_LIMIT, Math.max(50, limit)),\n cursor: scanCursor,\n reverse,\n });\n if (kvList.keys.length === 0) {\n exhausted = true;\n break;\n }\n\n const candidates: Array<{ key: string; metadata: RunIndexMetadata }> = [];\n for (const key of kvList.keys) {\n const metadata = JSON.parse(key.value) as RunIndexMetadata;\n // Use monotonic status metadata as a conservative prefilter,\n // then still verify every candidate against the authoritative\n // run below. Earlier metadata cannot exclude a later status.\n if (statuses?.every((status) => indexStatusExcludes(metadata.status, status))) {\n continue;\n }\n candidates.push({ key: key.name, metadata });\n }\n\n // Fetch enough candidates to prove the requested page and hasMore,\n // retaining index order while limiting concurrent cross-run reads.\n for (let offset = 0; offset < candidates.length && matches.length <= limit;) {\n const needed = limit + 1 - matches.length;\n const batch = candidates.slice(offset, offset + Math.min(RUN_LIST_CONCURRENCY, needed));\n const resolved = await Promise.all(\n batch.map(async ({ key, metadata }) => {\n const run = await deps.readRun(metadata.runId);\n return run && (statuses === undefined || statuses.includes(run.status))\n ? { key, run }\n : null;\n }),\n );\n for (const match of resolved) {\n if (match) matches.push(match);\n }\n offset += batch.length;\n }\n\n exhausted = kvList.list_complete;\n scanCursor = kvList.cursor ?? kvList.keys.at(-1)?.name;\n }\n\n const hasMore = matches.length > limit;\n const page = matches.slice(0, limit);\n return {\n data: page.map(({ run }) => (request.resolveData === 'none' ? stripRunData(run) : run)),\n cursor: hasMore ? (page.at(-1)?.key ?? null) : null,\n hasMore,\n };\n}\n","import type { RunListPage, RunListRequest } from './run-list.js';\nimport type { WorkflowRun } from '@workflow/world';\nimport type { HookTokenOwner } from './config.js';\nimport type {\n ExpireRunIndexesRequest,\n ExpireRunIndexesResult,\n ReleaseHookIndexesRequest,\n ReleaseHookIndexesResult,\n} from './retention.js';\n\nexport const RUN_CATALOG_SHARDS = 16;\nexport const HOOK_TOKEN_SHARDS = 32;\nexport const HOOK_ID_SHARDS = 32;\n\nconst INDEX_PROTOCOL_VERSION = 'v1';\nconst HOOK_RELEASE_BATCH = 64;\n\nexport interface IndexListOptions {\n prefix?: string;\n cursor?: string;\n /** Exclusive upper bound for creation-time retention scans. */\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\nexport interface IndexListPage {\n /** sourceShard is populated by the merged fleet index for exact follow-up mutation. */\n keys: Array<{ name: string; value: string; sourceShard?: string }>;\n list_complete: boolean;\n cursor?: string;\n}\n\nexport interface RunCatalogShardStub {\n upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }>;\n list(options?: IndexListOptions): Promise<IndexListPage>;\n deleteStaleGlobalRun(\n runId: string,\n key: string,\n expectedValue: string,\n ): Promise<{ deleted: boolean }>;\n expireRun(runId: string, expiredAt: number): Promise<ExpireRunIndexesResult>;\n}\n\nexport type HookClaimResult =\n | { claimed: true; claimId: string }\n | { claimed: false; holder: HookTokenOwner };\n\nexport interface HookReservation {\n claimId: string;\n tokenClaimId?: string;\n hookIdClaimId?: string;\n}\n\nexport type HookReservationResult =\n | { admitted: true; reservation: HookReservation }\n | { admitted: false; holder: HookTokenOwner };\n\nexport interface HookTokenShardStub {\n get(token: string): Promise<string | null>;\n reserve(token: string, owner: HookTokenOwner, proposedClaimId: string): Promise<HookClaimResult>;\n finalize(\n token: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }>;\n releaseClaim(token: string, owner: HookTokenOwner, claimId: string): Promise<void>;\n releaseBatch(\n hooks: Array<{ token: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }>;\n}\n\nexport interface HookIdShardStub {\n get(hookId: string): Promise<string | null>;\n reserve(hookId: string, owner: HookTokenOwner, proposedClaimId: string): Promise<HookClaimResult>;\n publish(\n hookId: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }>;\n releaseClaim(hookId: string, owner: HookTokenOwner, claimId: string): Promise<void>;\n releaseBatch(\n hooks: Array<{ hookId: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }>;\n}\n\ninterface CellIdLike {\n toString(): string;\n}\n\nexport interface CellNamespaceLike<T> {\n idFromName(name: string): CellIdLike;\n get(id: CellIdLike): T;\n}\n\nexport interface WorkflowIndexBindings {\n runCatalog: CellNamespaceLike<RunCatalogShardStub>;\n hookTokens: CellNamespaceLike<HookTokenShardStub>;\n hookIds: CellNamespaceLike<HookIdShardStub>;\n}\n\n/** High-level client used by the World storage layer and retention coordinator. */\nexport interface WorkflowIndex {\n commitRun(\n run: WorkflowRun,\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }>;\n listRuns(options?: IndexListOptions): Promise<IndexListPage>;\n /**\n * Remote only: the complete run listing performed inside the fleet. Resolves\n * to null when the worker predates the route; the caller then lists itself.\n */\n listResolvedRuns?(request: RunListRequest): Promise<RunListPage | null>;\n getHookByToken(token: string): Promise<string | null>;\n getHookById(hookId: string): Promise<string | null>;\n reserveHook(token: string, owner: HookTokenOwner): Promise<HookReservationResult>;\n finalizeHookIndexes(\n token: string,\n hookId: string,\n serializedHook: string,\n owner: HookTokenOwner,\n reservation?: HookReservation,\n ): Promise<void>;\n releaseHookReservation(\n token: string,\n owner: HookTokenOwner,\n reservation: HookReservation,\n ): Promise<void>;\n releaseHookIndexes(request: ReleaseHookIndexesRequest): Promise<ReleaseHookIndexesResult>;\n expireRun(request: ExpireRunIndexesRequest): Promise<ExpireRunIndexesResult>;\n}\n\n/** Stable FNV-1a routing hash. Collisions share a shard but never a storage key. */\nexport function stableIndexHash(value: string): number {\n let hash = 0x811c9dc5;\n for (const byte of new TextEncoder().encode(value)) {\n hash ^= byte;\n hash = Math.imul(hash, 0x01000193);\n }\n return hash >>> 0;\n}\n\nfunction shardName(domain: string, value: string, cardinality: number): string {\n const width = Math.max(2, (cardinality - 1).toString(16).length);\n const shard = stableIndexHash(value) % cardinality;\n return `${domain}:${INDEX_PROTOCOL_VERSION}:${shard.toString(16).padStart(width, '0')}`;\n}\n\nexport function runCatalogShardName(runId: string): string {\n return shardName('run-catalog', runId, RUN_CATALOG_SHARDS);\n}\n\nexport function hookTokenShardName(token: string): string {\n return shardName('hook-token', token, HOOK_TOKEN_SHARDS);\n}\n\nexport function hookIdShardName(hookId: string): string {\n return shardName('hook-id', hookId, HOOK_ID_SHARDS);\n}\n\nexport function allRunCatalogShardNames(): string[] {\n return Array.from(\n { length: RUN_CATALOG_SHARDS },\n (_, shard) => `run-catalog:${INDEX_PROTOCOL_VERSION}:${shard.toString(16).padStart(2, '0')}`,\n );\n}\n\n/** Catalog metadata for a run; the client and the worker router must agree on it. */\nexport function runIndexMetadata(run: Pick<WorkflowRun, 'runId' | 'createdAt' | 'status'>): string {\n return JSON.stringify({\n runId: run.runId,\n createdAt: run.createdAt.toISOString(),\n status: run.status,\n });\n}\n\nfunction stub<T>(namespace: CellNamespaceLike<T>, name: string): T {\n return namespace.get(namespace.idFromName(name));\n}\n\nfunction runKeys(run: Pick<WorkflowRun, 'runId' | 'workflowName' | 'createdAt'>): string[] {\n const timestamp = run.createdAt.getTime().toString().padStart(13, '0');\n return [`run:${run.workflowName}:${timestamp}:${run.runId}`, `runall:${timestamp}:${run.runId}`];\n}\n\nfunction groupByShard<T>(values: T[], route: (value: T) => string): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n for (const value of values) {\n const name = route(value);\n const group = groups.get(name);\n if (group) group.push(value);\n else groups.set(name, [value]);\n }\n return groups;\n}\n\nfunction sameOwner(left: HookTokenOwner, right: HookTokenOwner): boolean {\n return left.runId === right.runId && left.hookId === right.hookId;\n}\n\nfunction compareBytes(left: Uint8Array, right: Uint8Array): number {\n const length = Math.min(left.byteLength, right.byteLength);\n for (let index = 0; index < length; index++) {\n const difference = left[index] - right[index];\n if (difference !== 0) return difference;\n }\n return left.byteLength - right.byteLength;\n}\n\nasync function inBatches<T>(\n values: T[],\n operation: (batch: T[]) => Promise<{ deleted: number }>,\n): Promise<number> {\n let deleted = 0;\n for (let offset = 0; offset < values.length; offset += HOOK_RELEASE_BATCH) {\n deleted += (await operation(values.slice(offset, offset + HOOK_RELEASE_BATCH))).deleted;\n }\n return deleted;\n}\n\nexport function createWorkflowIndex(bindings: WorkflowIndexBindings): WorkflowIndex {\n const releaseHooks = async (request: ReleaseHookIndexesRequest): Promise<number> => {\n const tokenGroups = groupByShard(request.hooks, (hook) => hookTokenShardName(hook.token));\n const idGroups = groupByShard(request.hooks, (hook) => hookIdShardName(hook.hookId));\n const releases: Array<Promise<number>> = [];\n for (const [name, hooks] of tokenGroups) {\n const target = stub(bindings.hookTokens, name);\n releases.push(\n inBatches(\n hooks.map((hook) => ({\n token: hook.token,\n owner: { runId: request.runId, hookId: hook.hookId },\n })),\n (batch) => target.releaseBatch(batch),\n ),\n );\n }\n for (const [name, hooks] of idGroups) {\n const target = stub(bindings.hookIds, name);\n releases.push(\n inBatches(\n hooks.map((hook) => ({\n hookId: hook.hookId,\n owner: { runId: request.runId, hookId: hook.hookId },\n })),\n (batch) => target.releaseBatch(batch),\n ),\n );\n }\n return (await Promise.all(releases)).reduce((total, count) => total + count, 0);\n };\n\n return {\n async commitRun(run, serializedMetadata, publicationExpiresAt) {\n return await stub(bindings.runCatalog, runCatalogShardName(run.runId)).upsertRun(\n run.runId,\n runKeys(run),\n serializedMetadata,\n publicationExpiresAt,\n );\n },\n\n async listRuns(options) {\n const suppliedLimit = options?.limit;\n const requestedLimit =\n typeof suppliedLimit === 'number' && Number.isFinite(suppliedLimit)\n ? Math.floor(suppliedLimit)\n : 1000;\n const limit = Math.min(1000, Math.max(1, requestedLimit));\n const shardNames = allRunCatalogShardNames();\n const pages = await Promise.all(\n shardNames.map((name) =>\n stub(bindings.runCatalog, name).list({ ...options, limit: limit + 1 }),\n ),\n );\n const encoder = new TextEncoder();\n const candidates = pages\n .flatMap((shardPage, shardIndex) =>\n shardPage.keys.map((entry) => ({\n entry: { ...entry, sourceShard: shardNames[shardIndex] },\n encodedName: encoder.encode(entry.name),\n })),\n )\n .toSorted((left, right) => {\n const compared = compareBytes(left.encodedName, right.encodedName);\n return options?.reverse ? -compared : compared;\n });\n const page = candidates.slice(0, limit).map(({ entry }) => entry);\n const listComplete =\n candidates.length <= limit && pages.every((entry) => entry.list_complete);\n return {\n keys: page,\n list_complete: listComplete,\n cursor: listComplete ? undefined : page.at(-1)?.name,\n };\n },\n\n getHookByToken(token) {\n return stub(bindings.hookTokens, hookTokenShardName(token)).get(token);\n },\n\n getHookById(hookId) {\n return stub(bindings.hookIds, hookIdShardName(hookId)).get(hookId);\n },\n\n async reserveHook(token, owner) {\n const proposedClaimId = crypto.randomUUID();\n const tokenTarget = stub(bindings.hookTokens, hookTokenShardName(token));\n const tokenClaim = await tokenTarget.reserve(token, owner, proposedClaimId);\n if (!tokenClaim.claimed && !sameOwner(tokenClaim.holder, owner)) {\n return { admitted: false, holder: tokenClaim.holder };\n }\n\n const tokenClaimId = tokenClaim.claimed ? tokenClaim.claimId : undefined;\n const hookIdTarget = stub(bindings.hookIds, hookIdShardName(owner.hookId));\n const sharedClaimId = tokenClaimId ?? proposedClaimId;\n let hookIdClaim: HookClaimResult;\n try {\n hookIdClaim = await hookIdTarget.reserve(owner.hookId, owner, sharedClaimId);\n } catch (error) {\n await Promise.allSettled([\n ...(tokenClaimId ? [tokenTarget.releaseClaim(token, owner, tokenClaimId)] : []),\n hookIdTarget.releaseClaim(owner.hookId, owner, sharedClaimId),\n ]);\n throw error;\n }\n if (!hookIdClaim.claimed) {\n if (tokenClaimId) await tokenTarget.releaseClaim(token, owner, tokenClaimId);\n return { admitted: false, holder: hookIdClaim.holder };\n }\n\n const reservation: HookReservation = {\n claimId: `${tokenClaimId ?? '-'}:${hookIdClaim.claimId}`,\n tokenClaimId,\n hookIdClaimId: hookIdClaim.claimId,\n };\n return { admitted: true, reservation };\n },\n\n async finalizeHookIndexes(token, hookId, serializedHook, owner, reservation) {\n const tokenResult = await stub(bindings.hookTokens, hookTokenShardName(token)).finalize(\n token,\n serializedHook,\n owner,\n reservation?.tokenClaimId,\n );\n if (!tokenResult.stored) return;\n await stub(bindings.hookIds, hookIdShardName(hookId)).publish(\n hookId,\n serializedHook,\n owner,\n reservation?.hookIdClaimId,\n );\n },\n\n async releaseHookReservation(token, owner, reservation) {\n const releases: Array<Promise<void>> = [];\n if (reservation.tokenClaimId) {\n releases.push(\n stub(bindings.hookTokens, hookTokenShardName(token)).releaseClaim(\n token,\n owner,\n reservation.tokenClaimId,\n ),\n );\n }\n if (reservation.hookIdClaimId) {\n releases.push(\n stub(bindings.hookIds, hookIdShardName(owner.hookId)).releaseClaim(\n owner.hookId,\n owner,\n reservation.hookIdClaimId,\n ),\n );\n }\n await Promise.all(releases);\n },\n\n async releaseHookIndexes(request) {\n return { deleted: await releaseHooks(request) };\n },\n\n async expireRun(request) {\n const [catalog, hookDeletes] = await Promise.all([\n stub(bindings.runCatalog, runCatalogShardName(request.runId)).expireRun(\n request.runId,\n request.expiredAt,\n ),\n releaseHooks({ runId: request.runId, hooks: request.hooks }),\n ]);\n return { deleted: catalog.deleted + hookDeletes };\n },\n };\n}\n","/**\n * Hard-cutover stream protocol shared by the client, Worker router, and\n * StreamDO. Chunk payloads use a compact binary envelope on the public HTTP\n * boundary and Uint8Array values on the DO/storage boundary.\n */\n\nexport const STREAM_BATCH_CONTENT_TYPE = 'application/vnd.world-celld.stream-batch.v1';\n\n/**\n * Chunks per write request that every worker accepts. A client sends larger\n * batches only after a worker advertises {@link STREAM_CHUNK_LIMIT_HEADER}.\n */\nexport const MAX_STREAM_WRITE_CHUNKS = 32;\n/** A chunk remains below the 2 MiB SQLite-backed DO key/value limit. */\nexport const MAX_STREAM_CHUNK_BYTES = 1024 * 1024;\n/** Keeps serialized RPC bodies well below the 32 MiB Workers RPC limit. */\nexport const MAX_STREAM_BATCH_BYTES = 8 * 1024 * 1024;\n/** Chunks per read request that every worker accepts; see {@link MAX_STREAM_WRITE_CHUNKS}. */\nexport const MAX_STREAM_READ_CHUNKS = 32;\n/** Chunks per write or read request accepted by a worker that advertises the header below. */\nexport const NEGOTIATED_STREAM_CHUNKS = 512;\n/** Response header on stream requests: the per-request chunk limit this worker accepts. */\nexport const STREAM_CHUNK_LIMIT_HEADER = 'x-world-celld-stream-chunks';\nexport const MAX_STREAM_READ_BYTES = 8 * 1024 * 1024;\nexport const MAX_STREAM_ERROR_BYTES = 16 * 1024;\n/** Must remain below the default 30 second fleet request deadline. */\nexport const MAX_STREAM_LONG_POLL_MS = 20_000;\n\nexport type StreamTerminalState = 'open' | 'closed' | 'errored' | 'expired';\n\nexport interface StreamErrorData {\n name: string;\n message: string;\n}\n\nexport interface StreamWriteResult {\n startIndex: number;\n count: number;\n tailIndex: number;\n}\n\nexport interface StreamReadRequest {\n runId: string;\n startIndex: number;\n maxChunks: number;\n maxBytes: number;\n waitMs: number;\n}\n\nexport interface StreamReadResult {\n startIndex: number;\n tailIndex: number;\n chunks: Uint8Array[];\n state: StreamTerminalState;\n timedOut: boolean;\n error?: StreamErrorData;\n}\n\nconst WRITE_MAGIC = 0x57435357; // WCSW\nconst WRITE_ACK_MAGIC = 0x57435341; // WCSA\nconst READ_MAGIC = 0x57435352; // WCSR\nconst PROTOCOL_VERSION = 1;\nconst WRITE_HEADER_BYTES = 8;\nconst WRITE_ACK_BYTES = 16;\nconst READ_HEADER_BYTES = 28;\n\nconst STATE_TO_WIRE: Record<StreamTerminalState, number> = {\n open: 0,\n closed: 1,\n errored: 2,\n expired: 3,\n};\n\nconst WIRE_TO_STATE: readonly StreamTerminalState[] = ['open', 'closed', 'errored', 'expired'];\n\nfunction protocolError(message: string): Error {\n const error = new Error(`world-celld: invalid stream protocol: ${message}`);\n error.name = 'StreamProtocolError';\n return error;\n}\n\nfunction requireSafeIndex(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value < -1 || value > 0x7fffffff) {\n throw protocolError(`${field} is out of range`);\n }\n}\n\n/** An older worker rejects an oversized request before it touches the stream. */\nexport function isChunkLimitRejection(error: unknown): boolean {\n const candidate = error as { status?: unknown; message?: unknown } | null;\n return (\n candidate?.status === 400 &&\n typeof candidate.message === 'string' &&\n /batch exceeds \\d+ chunks|maxChunks must be (?:an integer )?between/.test(candidate.message)\n );\n}\n\nexport function validateStreamWriteChunks(chunks: readonly Uint8Array[]): number {\n if (chunks.length === 0) throw protocolError('batch must contain at least one chunk');\n if (chunks.length > NEGOTIATED_STREAM_CHUNKS) {\n throw protocolError(`batch exceeds ${NEGOTIATED_STREAM_CHUNKS} chunks`);\n }\n\n let totalBytes = 0;\n for (const chunk of chunks) {\n if (!(chunk instanceof Uint8Array)) throw protocolError('chunk is not binary data');\n if (chunk.byteLength > MAX_STREAM_CHUNK_BYTES) {\n throw protocolError(`chunk exceeds ${MAX_STREAM_CHUNK_BYTES} bytes`);\n }\n totalBytes += chunk.byteLength;\n if (totalBytes > MAX_STREAM_BATCH_BYTES) {\n throw protocolError(`batch exceeds ${MAX_STREAM_BATCH_BYTES} bytes`);\n }\n }\n return totalBytes;\n}\n\nexport function validateStreamReadRequest(request: StreamReadRequest): void {\n if (!request.runId) throw protocolError('runId is required');\n if (\n !Number.isSafeInteger(request.startIndex) ||\n request.startIndex < 0 ||\n request.startIndex > 0x7fffffff\n ) {\n throw protocolError('startIndex must be between 0 and 2147483647');\n }\n if (\n !Number.isSafeInteger(request.maxChunks) ||\n request.maxChunks < 0 ||\n request.maxChunks > NEGOTIATED_STREAM_CHUNKS\n ) {\n throw protocolError(`maxChunks must be between 0 and ${NEGOTIATED_STREAM_CHUNKS}`);\n }\n if (\n !Number.isSafeInteger(request.maxBytes) ||\n request.maxBytes < MAX_STREAM_CHUNK_BYTES ||\n request.maxBytes > MAX_STREAM_READ_BYTES\n ) {\n throw protocolError(\n `maxBytes must be between ${MAX_STREAM_CHUNK_BYTES} and ${MAX_STREAM_READ_BYTES}`,\n );\n }\n if (\n !Number.isSafeInteger(request.waitMs) ||\n request.waitMs < 0 ||\n request.waitMs > MAX_STREAM_LONG_POLL_MS\n ) {\n throw protocolError(`waitMs must be between 0 and ${MAX_STREAM_LONG_POLL_MS}`);\n }\n}\n\nexport function encodeStreamWriteBatch(chunks: readonly Uint8Array[]): Uint8Array {\n const totalBytes = validateStreamWriteChunks(chunks);\n const encoded = new Uint8Array(WRITE_HEADER_BYTES + chunks.length * 4 + totalBytes);\n const view = new DataView(encoded.buffer);\n view.setUint32(0, WRITE_MAGIC);\n view.setUint16(4, PROTOCOL_VERSION);\n view.setUint16(6, chunks.length);\n\n let offset = WRITE_HEADER_BYTES;\n for (const chunk of chunks) {\n view.setUint32(offset, chunk.byteLength);\n offset += 4;\n encoded.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return encoded;\n}\n\nexport function decodeStreamWriteBatch(encoded: Uint8Array): Uint8Array[] {\n if (encoded.byteLength < WRITE_HEADER_BYTES) throw protocolError('truncated write header');\n const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);\n if (view.getUint32(0) !== WRITE_MAGIC) throw protocolError('bad write magic');\n if (view.getUint16(4) !== PROTOCOL_VERSION) throw protocolError('unsupported write version');\n const count = view.getUint16(6);\n const chunks: Uint8Array[] = [];\n let offset = WRITE_HEADER_BYTES;\n for (let index = 0; index < count; index++) {\n if (offset + 4 > encoded.byteLength) throw protocolError('truncated chunk length');\n const length = view.getUint32(offset);\n offset += 4;\n if (offset + length > encoded.byteLength) throw protocolError('truncated chunk data');\n // Persisted DO values are structured-cloned. A view would retain the\n // complete batch backing buffer and could exceed the per-value storage\n // limit even when this individual chunk is valid.\n chunks.push(new Uint8Array(encoded.subarray(offset, offset + length)));\n offset += length;\n }\n if (offset !== encoded.byteLength) throw protocolError('trailing write data');\n validateStreamWriteChunks(chunks);\n return chunks;\n}\n\nexport function encodeStreamWriteResult(result: StreamWriteResult): Uint8Array {\n requireSafeIndex(result.startIndex, 'startIndex');\n requireSafeIndex(result.tailIndex, 'tailIndex');\n if (\n !Number.isSafeInteger(result.count) ||\n result.count < 1 ||\n result.count > NEGOTIATED_STREAM_CHUNKS\n ) {\n throw protocolError('write count is out of range');\n }\n const encoded = new Uint8Array(WRITE_ACK_BYTES);\n const view = new DataView(encoded.buffer);\n view.setUint32(0, WRITE_ACK_MAGIC);\n view.setUint16(4, PROTOCOL_VERSION);\n view.setUint16(6, result.count);\n view.setInt32(8, result.startIndex);\n view.setInt32(12, result.tailIndex);\n return encoded;\n}\n\nexport function decodeStreamWriteResult(encoded: Uint8Array): StreamWriteResult {\n if (encoded.byteLength !== WRITE_ACK_BYTES) throw protocolError('invalid write response size');\n const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);\n if (view.getUint32(0) !== WRITE_ACK_MAGIC) throw protocolError('bad write response magic');\n if (view.getUint16(4) !== PROTOCOL_VERSION) {\n throw protocolError('unsupported write response version');\n }\n const count = view.getUint16(6);\n if (count < 1 || count > NEGOTIATED_STREAM_CHUNKS) {\n throw protocolError('write response count is out of range');\n }\n const result = {\n count,\n startIndex: view.getInt32(8),\n tailIndex: view.getInt32(12),\n };\n requireSafeIndex(result.startIndex, 'startIndex');\n requireSafeIndex(result.tailIndex, 'tailIndex');\n if (result.tailIndex !== result.startIndex + result.count - 1) {\n throw protocolError('write response offsets are inconsistent');\n }\n return result;\n}\n\nexport function encodeStreamReadResult(result: StreamReadResult): Uint8Array {\n requireSafeIndex(result.startIndex, 'startIndex');\n requireSafeIndex(result.tailIndex, 'tailIndex');\n let chunkBytes = 0;\n for (const chunk of result.chunks) chunkBytes += 4 + chunk.byteLength;\n if (\n result.chunks.length > NEGOTIATED_STREAM_CHUNKS ||\n chunkBytes > MAX_STREAM_READ_BYTES + 4 * NEGOTIATED_STREAM_CHUNKS\n ) {\n throw protocolError('read result exceeds configured bounds');\n }\n\n const encoder = new TextEncoder();\n const errorName = result.error ? encoder.encode(result.error.name) : new Uint8Array();\n const errorMessage = result.error ? encoder.encode(result.error.message) : new Uint8Array();\n if (errorName.byteLength + errorMessage.byteLength > MAX_STREAM_ERROR_BYTES) {\n throw protocolError(`stream error exceeds ${MAX_STREAM_ERROR_BYTES} bytes`);\n }\n const encoded = new Uint8Array(\n READ_HEADER_BYTES + chunkBytes + errorName.byteLength + errorMessage.byteLength,\n );\n const view = new DataView(encoded.buffer);\n view.setUint32(0, READ_MAGIC);\n view.setUint8(4, PROTOCOL_VERSION);\n const state = STATE_TO_WIRE[result.state];\n if (state === undefined) throw protocolError('unknown stream state');\n view.setUint8(5, state);\n view.setUint8(6, result.timedOut ? 1 : 0);\n view.setUint8(7, 0);\n view.setInt32(8, result.startIndex);\n view.setInt32(12, result.tailIndex);\n view.setUint32(16, result.chunks.length);\n view.setUint32(20, errorName.byteLength);\n view.setUint32(24, errorMessage.byteLength);\n\n let offset = READ_HEADER_BYTES;\n for (const chunk of result.chunks) {\n view.setUint32(offset, chunk.byteLength);\n offset += 4;\n encoded.set(chunk, offset);\n offset += chunk.byteLength;\n }\n encoded.set(errorName, offset);\n offset += errorName.byteLength;\n encoded.set(errorMessage, offset);\n return encoded;\n}\n\nexport function decodeStreamReadResult(encoded: Uint8Array): StreamReadResult {\n if (encoded.byteLength < READ_HEADER_BYTES) throw protocolError('truncated read header');\n const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);\n if (view.getUint32(0) !== READ_MAGIC) throw protocolError('bad read magic');\n if (view.getUint8(4) !== PROTOCOL_VERSION) throw protocolError('unsupported read version');\n const state = WIRE_TO_STATE[view.getUint8(5)];\n if (!state) throw protocolError('unknown stream state');\n const startIndex = view.getInt32(8);\n const tailIndex = view.getInt32(12);\n requireSafeIndex(startIndex, 'startIndex');\n requireSafeIndex(tailIndex, 'tailIndex');\n const count = view.getUint32(16);\n const errorNameLength = view.getUint32(20);\n const errorMessageLength = view.getUint32(24);\n if (count > NEGOTIATED_STREAM_CHUNKS) throw protocolError('read chunk count exceeds limit');\n if (errorNameLength + errorMessageLength > MAX_STREAM_ERROR_BYTES) {\n throw protocolError('read error exceeds limit');\n }\n\n const chunks: Uint8Array[] = [];\n let offset = READ_HEADER_BYTES;\n let totalBytes = 0;\n for (let index = 0; index < count; index++) {\n if (offset + 4 > encoded.byteLength) throw protocolError('truncated read chunk length');\n const length = view.getUint32(offset);\n offset += 4;\n if (offset + length > encoded.byteLength) throw protocolError('truncated read chunk data');\n totalBytes += length;\n if (totalBytes > MAX_STREAM_READ_BYTES) throw protocolError('read bytes exceed limit');\n chunks.push(encoded.subarray(offset, offset + length));\n offset += length;\n }\n\n if (offset + errorNameLength + errorMessageLength !== encoded.byteLength) {\n throw protocolError('invalid read error payload');\n }\n const decoder = new TextDecoder();\n const error =\n errorNameLength > 0 || errorMessageLength > 0\n ? {\n name: decoder.decode(encoded.subarray(offset, offset + errorNameLength)),\n message: decoder.decode(encoded.subarray(offset + errorNameLength)),\n }\n : undefined;\n\n return {\n startIndex,\n tailIndex,\n chunks,\n state,\n timedOut: (view.getUint8(6) & 1) !== 0,\n error,\n };\n}\n\nexport function normalizeStreamError(error: unknown): StreamErrorData {\n let normalized: StreamErrorData;\n if (error instanceof Error) {\n normalized = { name: error.name || 'Error', message: error.message };\n } else if (typeof error === 'string') {\n normalized = { name: 'Error', message: error };\n } else if (\n error &&\n typeof error === 'object' &&\n typeof (error as { name?: unknown }).name === 'string' &&\n typeof (error as { message?: unknown }).message === 'string'\n ) {\n normalized = {\n name: (error as StreamErrorData).name,\n message: (error as StreamErrorData).message,\n };\n } else {\n normalized = { name: 'Error', message: String(error) };\n }\n\n // Bound persisted terminal metadata as well as its binary response frame.\n normalized.name = normalized.name.slice(0, 1024);\n normalized.message = normalized.message.slice(0, 4096);\n while (\n new TextEncoder().encode(normalized.name).byteLength +\n new TextEncoder().encode(normalized.message).byteLength >\n MAX_STREAM_ERROR_BYTES\n ) {\n normalized.message = normalized.message.slice(0, Math.max(0, normalized.message.length - 256));\n if (normalized.message.length === 0) {\n normalized.name = normalized.name.slice(0, Math.max(0, normalized.name.length - 256));\n }\n }\n return normalized;\n}\n","import { HookSchema, WorkflowRunSchema, type WorkflowRun } from '@workflow/world';\nimport type { HookTokenOwner } from '../config.js';\nimport type { HookReservation, IndexListOptions } from '../indexes.js';\nimport { MAX_RUN_LIST_LIMIT, type RunListRequest, type RunStatus } from '../run-list.js';\nimport type { ExpireRunIndexesRequest, ReleaseHookIndexesRequest } from '../retention.js';\nimport { isRecord } from '../validation.js';\nimport { parse } from '../vendor/shared/index.js';\n\nexport type IndexOperation =\n | 'runs.list'\n | 'runs.list-resolved'\n | 'runs.commit'\n | 'runs.expire'\n | 'hooks.reserve'\n | 'hooks.finalize'\n | 'hooks.release-reservation'\n | 'hooks.release';\n\nexport type ValidatedIndexRequest =\n | { operation: 'runs.list'; args: [IndexListOptions | undefined] }\n | { operation: 'runs.list-resolved'; args: [RunListRequest] }\n | { operation: 'runs.commit'; args: [WorkflowRun, string, number] }\n | { operation: 'runs.expire'; args: [ExpireRunIndexesRequest] }\n | { operation: 'hooks.reserve'; args: [string, HookTokenOwner] }\n | {\n operation: 'hooks.finalize';\n args: [string, string, string, HookTokenOwner, HookReservation | undefined];\n }\n | {\n operation: 'hooks.release-reservation';\n args: [string, HookTokenOwner, HookReservation];\n }\n | { operation: 'hooks.release'; args: [ReleaseHookIndexesRequest] };\n\nfunction invalid(message: string): never {\n const error = new Error(`invalid index RPC arguments: ${message}`);\n error.name = 'RequestValidationError';\n throw error;\n}\n\nfunction exactArgs(args: unknown[], count: number): void {\n if (args.length !== count) invalid(`expected ${count} argument(s)`);\n}\n\nfunction nonEmptyString(value: unknown, name: string): string {\n if (typeof value !== 'string' || value.length === 0)\n invalid(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction stringValue(value: unknown, name: string): string {\n if (typeof value !== 'string') invalid(`${name} must be a string`);\n return value;\n}\n\nfunction nonNegativeSafeInteger(value: unknown, name: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n invalid(`${name} must be a non-negative safe integer`);\n }\n return value as number;\n}\n\nfunction positiveSafeInteger(value: unknown, name: string): number {\n const parsed = nonNegativeSafeInteger(value, name);\n if (parsed === 0) invalid(`${name} must be a positive safe integer`);\n return parsed;\n}\n\nfunction owner(value: unknown, name = 'owner'): HookTokenOwner {\n if (!isRecord(value)) invalid(`${name} must be an object`);\n return {\n runId: nonEmptyString(value.runId, `${name}.runId`),\n hookId: nonEmptyString(value.hookId, `${name}.hookId`),\n };\n}\n\nfunction reservation(value: unknown): HookReservation {\n if (!isRecord(value)) invalid('reservation must be an object');\n const parsed: HookReservation = {\n claimId: nonEmptyString(value.claimId, 'reservation.claimId'),\n };\n if (value.tokenClaimId !== undefined) {\n parsed.tokenClaimId = nonEmptyString(value.tokenClaimId, 'reservation.tokenClaimId');\n }\n if (value.hookIdClaimId !== undefined) {\n parsed.hookIdClaimId = nonEmptyString(value.hookIdClaimId, 'reservation.hookIdClaimId');\n }\n return parsed;\n}\n\nfunction hooks(value: unknown): Array<{ hookId: string; token: string }> {\n if (!Array.isArray(value)) invalid('hooks must be an array');\n return value.map((entry, index) => {\n if (!isRecord(entry)) invalid(`hooks[${index}] must be an object`);\n return {\n hookId: nonEmptyString(entry.hookId, `hooks[${index}].hookId`),\n token: nonEmptyString(entry.token, `hooks[${index}].token`),\n };\n });\n}\n\nfunction exactProperties(value: Record<string, unknown>, allowed: string[], name: string): void {\n const unexpected = Object.keys(value).find((key) => !allowed.includes(key));\n if (unexpected !== undefined) invalid(`${name}.${unexpected} is not allowed`);\n}\n\nfunction releaseRequest(value: unknown): ReleaseHookIndexesRequest {\n if (!isRecord(value)) invalid('release request must be an object');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n };\n}\n\nfunction expireRequest(value: unknown): ExpireRunIndexesRequest {\n if (!isRecord(value)) invalid('expiry request must be an object');\n exactProperties(value, ['runId', 'hooks', 'expiredAt'], 'request');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n expiredAt: nonNegativeSafeInteger(value.expiredAt, 'request.expiredAt'),\n };\n}\n\nfunction listOptions(value: unknown): IndexListOptions | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isRecord(value)) invalid('list options must be an object');\n const parsed: IndexListOptions = {};\n for (const name of ['prefix', 'cursor', 'end'] as const) {\n if (value[name] !== undefined) parsed[name] = stringValue(value[name], `options.${name}`);\n }\n if (value.limit !== undefined) {\n const limit = value.limit;\n if (!Number.isSafeInteger(limit) || (limit as number) < 1 || (limit as number) > 1000) {\n invalid('options.limit must be an integer between 1 and 1000');\n }\n parsed.limit = limit as number;\n }\n if (value.reverse !== undefined) {\n if (typeof value.reverse !== 'boolean') invalid('options.reverse must be a boolean');\n parsed.reverse = value.reverse;\n }\n return parsed;\n}\n\nconst RUN_STATUSES = new Set<RunStatus>(['pending', 'running', 'completed', 'failed', 'cancelled']);\n\nfunction runListRequest(value: unknown): RunListRequest {\n if (!isRecord(value)) invalid('run list request must be an object');\n const limit = value.limit;\n if (\n !Number.isSafeInteger(limit) ||\n (limit as number) < 1 ||\n (limit as number) > MAX_RUN_LIST_LIMIT\n ) {\n invalid(`request.limit must be an integer between 1 and ${MAX_RUN_LIST_LIMIT}`);\n }\n const parsed: RunListRequest = { limit: limit as number };\n if (value.workflowName !== undefined) {\n parsed.workflowName = nonEmptyString(value.workflowName, 'request.workflowName');\n }\n if (value.cursor !== undefined) parsed.cursor = stringValue(value.cursor, 'request.cursor');\n if (value.statuses !== undefined) {\n if (\n !Array.isArray(value.statuses) ||\n value.statuses.length === 0 ||\n !value.statuses.every((status) => RUN_STATUSES.has(status as RunStatus))\n ) {\n invalid('request.statuses must be a non-empty array of run statuses');\n }\n parsed.statuses = value.statuses as RunStatus[];\n }\n if (value.sortOrder !== undefined) {\n if (value.sortOrder !== 'asc' && value.sortOrder !== 'desc') {\n invalid(\"request.sortOrder must be 'asc' or 'desc'\");\n }\n parsed.sortOrder = value.sortOrder;\n }\n if (value.resolveData !== undefined) {\n if (value.resolveData !== 'none' && value.resolveData !== 'all') {\n invalid(\"request.resolveData must be 'none' or 'all'\");\n }\n parsed.resolveData = value.resolveData;\n }\n return parsed;\n}\n\nfunction runCommit(args: unknown[]): ValidatedIndexRequest {\n exactArgs(args, 3);\n const parsedRun = WorkflowRunSchema.safeParse(args[0]);\n if (!parsedRun.success) invalid('run does not match WorkflowRunSchema');\n const run = parsedRun.data;\n nonEmptyString(run.runId, 'run.runId');\n nonEmptyString(run.workflowName, 'run.workflowName');\n nonEmptyString(run.deploymentId, 'run.deploymentId');\n const serializedMetadata = nonEmptyString(args[1], 'serializedMetadata');\n let metadata: unknown;\n try {\n metadata = JSON.parse(serializedMetadata);\n } catch {\n invalid('serializedMetadata must be valid JSON');\n }\n if (\n !isRecord(metadata) ||\n metadata.runId !== run.runId ||\n metadata.status !== run.status ||\n metadata.createdAt !== run.createdAt.toISOString()\n ) {\n invalid('serializedMetadata must match the committed run');\n }\n const publicationExpiresAt = positiveSafeInteger(args[2], 'publicationExpiresAt');\n return { operation: 'runs.commit', args: [run, serializedMetadata, publicationExpiresAt] };\n}\n\nfunction hookFinalize(args: unknown[]): ValidatedIndexRequest {\n if (args.length !== 4 && args.length !== 5) invalid('expected 4 or 5 arguments');\n const token = nonEmptyString(args[0], 'token');\n const hookId = nonEmptyString(args[1], 'hookId');\n const serializedHook = nonEmptyString(args[2], 'serializedHook');\n const hookOwner = owner(args[3]);\n if (hookOwner.hookId !== hookId) invalid('owner.hookId must match hookId');\n let decodedHook: unknown;\n try {\n decodedHook = parse<unknown>(serializedHook);\n } catch {\n invalid('serializedHook must be valid tagged JSON');\n }\n const parsedHook = HookSchema.safeParse(decodedHook);\n if (!parsedHook.success) invalid('serializedHook does not match HookSchema');\n if (\n parsedHook.data.runId !== hookOwner.runId ||\n parsedHook.data.hookId !== hookId ||\n parsedHook.data.token !== token ||\n !parsedHook.data.runId ||\n !parsedHook.data.hookId ||\n !parsedHook.data.token\n ) {\n invalid('serializedHook must match token, hookId, and owner');\n }\n const hookReservation =\n args[4] === undefined || args[4] === null ? undefined : reservation(args[4]);\n return {\n operation: 'hooks.finalize',\n args: [token, hookId, serializedHook, hookOwner, hookReservation],\n };\n}\n\nexport function validateIndexRequest(\n operation: IndexOperation,\n args: unknown[],\n): ValidatedIndexRequest {\n switch (operation) {\n case 'runs.list':\n if (args.length > 1) invalid('expected at most 1 argument');\n return { operation, args: [listOptions(args[0])] };\n case 'runs.list-resolved':\n exactArgs(args, 1);\n return { operation, args: [runListRequest(args[0])] };\n case 'runs.commit':\n return runCommit(args);\n case 'runs.expire':\n exactArgs(args, 1);\n return { operation, args: [expireRequest(args[0])] };\n case 'hooks.reserve':\n exactArgs(args, 2);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1])],\n };\n case 'hooks.finalize':\n return hookFinalize(args);\n case 'hooks.release-reservation':\n exactArgs(args, 3);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1]), reservation(args[2])],\n };\n case 'hooks.release':\n exactArgs(args, 1);\n return { operation, args: [releaseRequest(args[0])] };\n default:\n return invalid('unknown operation');\n }\n}\n\nexport const INDEX_OPERATIONS = new Set<IndexOperation>([\n 'runs.list',\n 'runs.list-resolved',\n 'runs.commit',\n 'runs.expire',\n 'hooks.reserve',\n 'hooks.finalize',\n 'hooks.release-reservation',\n 'hooks.release',\n]);\n","/**\n * Worker-level HTTP router: the fleet-facing RPC surface of the celld world.\n *\n * Routes:\n * GET /v1/health — liveness + spec version (unauthenticated)\n * POST /v1/rpc/{binding}/{name}/{method} — DO RPC (bearer auth)\n * POST /v1/index/{domain}/{method} — cohesive index operation\n * GET /v1/streams/{name}/chunks — bounded binary long-poll read\n * POST /v1/streams/{name}/chunks — bounded binary batch append\n *\n * Generic RPC bodies use the tagged JSON codec. Stream chunk bodies use the\n * compact binary stream protocol. Only whitelisted routes/methods dispatch.\n */\nimport { SPEC_VERSION_CURRENT, type WorkflowRun } from '@workflow/world';\nimport { type ApplyEventSuccess, parseApplyEventRequest } from '../apply-event.js';\nimport { rpcParse, rpcStringify } from '../codec.js';\nimport type { RunReadOutcome } from '../retention.js';\nimport { listRunsPage } from '../run-list.js';\nimport {\n createWorkflowIndex,\n runIndexMetadata,\n type CellNamespaceLike,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n NEGOTIATED_STREAM_CHUNKS,\n STREAM_BATCH_CONTENT_TYPE,\n STREAM_CHUNK_LIMIT_HEADER,\n decodeStreamWriteBatch,\n encodeStreamReadResult,\n encodeStreamWriteResult,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamWriteResult,\n} from '../stream-protocol.js';\nimport { authenticate } from './auth.js';\nimport { INDEX_OPERATIONS, type IndexOperation, validateIndexRequest } from './index-validation.js';\nimport {\n NATIVE_QUEUE_MAX_MESSAGE_BYTES,\n queueClaimName,\n queueOrphanName,\n queuePayloadObjectKey,\n validateNativeQueueEnvelope,\n validateNativeQueueSendOptions,\n type NativeQueueEnvelope,\n type QueuePayloadOrphan,\n type QueuePayloadRegistration,\n} from '../queue-protocol.js';\nimport type { QueuePayloadStore } from './queue-payload-store.js';\n\nexport const WORLD_NAME = 'world-celld';\nexport const WORLD_VERSION = '0.1.0';\n\n/** Minimal structural DO namespace type (celld provides the real thing). */\nexport interface DONamespaceLike {\n idFromName(name: string): { toString(): string };\n get(id: { toString(): string }): unknown;\n}\n\ninterface NativeQueueBindingLike {\n send(body: string, options?: { contentType?: 'text'; delaySeconds?: number }): Promise<unknown>;\n}\n\nexport interface QueueRunStub {\n registerQueuePayload(\n registration: QueuePayloadRegistration,\n ): Promise<{ ok: true } | { ok: false; message: string }>;\n finalizeQueuePayload(messageId: string): Promise<{ ok: true } | { ok: false; message: string }>;\n unregisterQueuePayload(messageId: string): Promise<void>;\n scheduleQueuePayloadOrphan(orphan: QueuePayloadOrphan): Promise<void>;\n cancelQueuePayloadOrphan(messageId: string): Promise<void>;\n reserveQueueMessage(params: {\n messageId: string;\n expiresAt: number;\n }): Promise<{ admitted: boolean; messageId: string }>;\n completeQueueMessage(messageId: string): Promise<void>;\n claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean; retryAt?: number }>;\n holdInflight(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }>;\n releaseInflight(messageId?: string): Promise<void>;\n}\n\nexport interface WorkerEnv {\n WORKFLOW_DB: DONamespaceLike;\n WORKFLOW_STREAMS: DONamespaceLike;\n WORKFLOW_RUN_CATALOG: DONamespaceLike;\n WORKFLOW_HOOK_TOKENS: DONamespaceLike;\n WORKFLOW_HOOK_IDS: DONamespaceLike;\n WORKFLOW_QUEUE: NativeQueueBindingLike;\n WORKFLOW_QUEUE_PAYLOADS?: QueuePayloadStore;\n WORLD_SECRET?: string;\n WORKFLOW_CALLBACK_SECRET?: string;\n WORKFLOW_RETENTION_MS?: string | number;\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n}\n\nfunction workflowIndex(env: WorkerEnv) {\n return createWorkflowIndex({\n runCatalog: env.WORKFLOW_RUN_CATALOG as CellNamespaceLike<RunCatalogShardStub>,\n hookTokens: env.WORKFLOW_HOOK_TOKENS as CellNamespaceLike<HookTokenShardStub>,\n hookIds: env.WORKFLOW_HOOK_IDS as CellNamespaceLike<HookIdShardStub>,\n });\n}\n\n/**\n * Publish a committed applyEvent outcome to the derivative indexes inside the\n * fleet, sparing the client a round trip per run mutation. Each index write is\n * idempotent under the outcome's publication lease. A failed write leaves its\n * flag unset, so the client publishes it itself exactly as it would without\n * this step; older clients ignore the flags and publish again.\n */\nasync function publishApplyEventIndexes(\n env: WorkerEnv,\n runId: string,\n outcome: unknown,\n): Promise<void> {\n if (typeof outcome !== 'object' || outcome === null) return;\n const success = outcome as { ok?: unknown } & Partial<ApplyEventSuccess>;\n if (success.ok !== true) return;\n const index = workflowIndex(env);\n const publications: Array<Promise<void>> = [];\n if (success.run && typeof success.indexPublicationExpiresAt === 'number') {\n const run = success.run;\n const lease = success.indexPublicationExpiresAt;\n publications.push(\n (async () => {\n await index.commitRun(run, runIndexMetadata(run), lease);\n success.runIndexPublished = true;\n })(),\n );\n }\n const releasedHooks = success.releasedHooks;\n if (Array.isArray(releasedHooks) && releasedHooks.length > 0) {\n publications.push(\n (async () => {\n await index.releaseHookIndexes({ runId, hooks: releasedHooks });\n success.hookIndexesReleased = true;\n })(),\n );\n }\n await Promise.allSettled(publications);\n}\n\nconst BINDINGS: Record<string, { env: keyof WorkerEnv; methods: ReadonlySet<string> }> = {\n runs: {\n env: 'WORKFLOW_DB',\n methods: new Set([\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 },\n streams: {\n env: 'WORKFLOW_STREAMS',\n methods: new Set([\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'listStreams',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ]),\n },\n 'hook-tokens': {\n env: 'WORKFLOW_HOOK_TOKENS',\n methods: new Set(['get']),\n },\n 'hook-ids': {\n env: 'WORKFLOW_HOOK_IDS',\n methods: new Set(['get']),\n },\n};\n\n/** Request body cap: oversize payloads get a clear 413 instead of an OOM. */\nconst MAX_BODY_BYTES = 32 * 1024 * 1024;\nconst MAX_STREAM_WRITE_BODY_BYTES = MAX_STREAM_BATCH_BYTES + 4 * NEGOTIATED_STREAM_CHUNKS + 1024;\nconst QUEUE_ORPHAN_GRACE_MS = 5 * 24 * 60 * 60 * 1000;\n\nfunction errorResponse(status: number, name: string, message: string): Response {\n return Response.json({ error: { name, message } }, { status });\n}\n\nfunction hasContentType(request: Request, expected: string): boolean {\n return (\n request.headers.get('content-type')?.split(';', 1)[0].trim().toLowerCase() ===\n expected.toLowerCase()\n );\n}\n\nfunction declaredContentLength(request: Request): number | null {\n const raw = request.headers.get('content-length');\n if (raw === null) return null;\n if (!/^\\d+$/.test(raw)) {\n const error = new Error('content-length must be a non-negative integer');\n error.name = 'RequestValidationError';\n throw error;\n }\n const value = Number(raw);\n if (!Number.isSafeInteger(value)) {\n const error = new Error('content-length is out of range');\n error.name = 'RequestValidationError';\n throw error;\n }\n return value;\n}\n\nfunction decodePathComponent(value: string, name: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n const error = new Error(`${name} has malformed percent encoding`);\n error.name = 'RequestValidationError';\n throw error;\n }\n}\n\nasync function readBoundedBody(request: Request): Promise<string | null> {\n if (!request.body) return '';\n const reader = request.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_BODY_BYTES) {\n await reader.cancel('RPC body exceeds configured limit').catch(() => undefined);\n return null;\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function readBoundedBytes(request: Request, maxBytes: number): Promise<Uint8Array | null> {\n if (!request.body) return new Uint8Array();\n const reader = request.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 body exceeds configured limit').catch(() => undefined);\n return null;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\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 parseRpcArguments(request: Request): Promise<unknown[] | Response> {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n return Array.isArray(parsed)\n ? parsed\n : errorResponse(400, 'BadRequest', 'body must be an argument array');\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n}\n\nfunction parseBoundedInteger(url: URL, name: string, minimum: number, maximum: number): number {\n const raw = url.searchParams.get(name);\n const value = raw !== null && /^\\d+$/.test(raw) ? Number(raw) : Number.NaN;\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n const error = new Error(`${name} must be an integer between ${minimum} and ${maximum}`);\n error.name = 'StreamProtocolError';\n throw error;\n }\n return value;\n}\n\nfunction streamResponse(body: Uint8Array): Response {\n return new Response(body, {\n status: 200,\n headers: {\n 'content-type': STREAM_BATCH_CONTENT_TYPE,\n [STREAM_CHUNK_LIMIT_HEADER]: String(NEGOTIATED_STREAM_CHUNKS),\n },\n });\n}\n\nexport function createRouter(env: WorkerEnv) {\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const parts = url.pathname.split('/').filter(Boolean);\n\n if (parts[0] !== 'v1') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (parts[1] === 'health' && parts.length === 2) {\n if (request.method !== 'GET') {\n return errorResponse(405, 'MethodNotAllowed', 'expected GET');\n }\n return Response.json({\n ok: true,\n name: WORLD_NAME,\n version: WORLD_VERSION,\n specVersion: SPEC_VERSION_CURRENT,\n });\n }\n\n const auth = await authenticate(request, env.WORLD_SECRET);\n if (!auth.ok) {\n return auth.response;\n }\n\n if (parts[1] === 'queue' && parts.length === 3) {\n const parsed = await parseRpcArguments(request);\n if (parsed instanceof Response) return parsed;\n\n if (parts[2] === 'send') {\n if (parsed.length < 1 || parsed.length > 2) {\n return errorResponse(400, 'BadRequest', 'queue send expects an envelope and options');\n }\n if (!env.WORKFLOW_QUEUE) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_QUEUE');\n }\n let envelope: NativeQueueEnvelope;\n let options;\n try {\n envelope = validateNativeQueueEnvelope(parsed[0]);\n options = validateNativeQueueSendOptions(parsed[1]);\n if (envelope.body === undefined || envelope.payloadKey !== undefined) {\n throw new TypeError('queue send requires an inline body');\n }\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n try {\n const namespace = env.WORKFLOW_DB;\n const payloadStore = env.WORKFLOW_QUEUE_PAYLOADS;\n const payloadKey = envelope.runId\n ? queuePayloadObjectKey(envelope.runId, envelope.messageId)\n : undefined;\n const brokerEnvelope: NativeQueueEnvelope = payloadKey\n ? { ...envelope, payloadKey, body: undefined }\n : envelope;\n const encoded = JSON.stringify(brokerEnvelope);\n if (new TextEncoder().encode(encoded).byteLength > NATIVE_QUEUE_MAX_MESSAGE_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `native queue envelope exceeds ${NATIVE_QUEUE_MAX_MESSAGE_BYTES} bytes`,\n );\n }\n\n const now = Date.now();\n const reservationExpiresAt =\n Math.max(now, envelope.notBefore ?? now) + QUEUE_ORPHAN_GRACE_MS;\n let claim: QueueRunStub | undefined;\n if (envelope.idempotencyKey) {\n claim = namespace.get(\n namespace.idFromName(queueClaimName(envelope.queueName, envelope.idempotencyKey)),\n ) as QueueRunStub;\n const reservation = await claim.reserveQueueMessage({\n messageId: envelope.messageId,\n expiresAt: reservationExpiresAt,\n });\n if (!reservation.admitted) {\n return new Response(rpcStringify({ messageId: reservation.messageId }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n }\n }\n\n if (envelope.runId && payloadKey) {\n if (!payloadStore) {\n return errorResponse(\n 500,\n 'WorldMisconfigured',\n 'missing binding: WORKFLOW_QUEUE_PAYLOADS',\n );\n }\n const run = namespace.get(namespace.idFromName(envelope.runId)) as QueueRunStub;\n const orphanExpiresAt = reservationExpiresAt;\n const registered = await run.registerQueuePayload({\n messageId: envelope.messageId,\n key: payloadKey,\n orphanExpiresAt,\n });\n if (!registered.ok) {\n await claim?.completeQueueMessage(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', registered.message);\n }\n const orphan = namespace.get(\n namespace.idFromName(queueOrphanName(envelope.messageId)),\n ) as QueueRunStub;\n try {\n await orphan.scheduleQueuePayloadOrphan({\n messageId: envelope.messageId,\n runId: envelope.runId,\n key: payloadKey,\n expiresAt: orphanExpiresAt,\n });\n } catch (error) {\n await run.unregisterQueuePayload(envelope.messageId);\n await claim?.completeQueueMessage(envelope.messageId);\n throw error;\n }\n try {\n await payloadStore.write(payloadKey, envelope.body, {\n runId: envelope.runId,\n messageId: envelope.messageId,\n });\n } catch (error) {\n await claim?.completeQueueMessage(envelope.messageId);\n throw error;\n }\n let finalized: Awaited<ReturnType<QueueRunStub['finalizeQueuePayload']>>;\n try {\n finalized = await run.finalizeQueuePayload(envelope.messageId);\n } catch (error) {\n await claim?.completeQueueMessage(envelope.messageId);\n throw error;\n }\n if (!finalized.ok) {\n await payloadStore.delete(payloadKey);\n await run.unregisterQueuePayload(envelope.messageId);\n await orphan.cancelQueuePayloadOrphan(envelope.messageId);\n await claim?.completeQueueMessage(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', finalized.message);\n }\n }\n await env.WORKFLOW_QUEUE.send(encoded, {\n contentType: 'text',\n ...options,\n });\n return new Response(rpcStringify({ messageId: envelope.messageId }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n const err = error as { name?: string; message?: string };\n return errorResponse(500, err.name ?? 'Error', err.message ?? String(error));\n }\n }\n\n return errorResponse(404, 'NotFound', `unknown queue operation: ${parts[2]}`);\n }\n\n if (parts[1] === 'index' && parts.length === 4) {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n for (const required of [\n 'WORKFLOW_RUN_CATALOG',\n 'WORKFLOW_HOOK_TOKENS',\n 'WORKFLOW_HOOK_IDS',\n ] as const) {\n if (!env[required]) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${required}`);\n }\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n const operation = `${parts[2]}.${parts[3]}`;\n if (!INDEX_OPERATIONS.has(operation as IndexOperation)) {\n return errorResponse(404, 'NotFound', `unknown index operation: ${operation}`);\n }\n let validated;\n try {\n validated = validateIndexRequest(operation as IndexOperation, args);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n try {\n const index = workflowIndex(env);\n let result: unknown;\n switch (validated.operation) {\n case 'runs.list':\n result = await index.listRuns(...validated.args);\n break;\n case 'runs.list-resolved': {\n const runs = env.WORKFLOW_DB;\n if (!runs) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_DB');\n }\n result = await listRunsPage(\n {\n listRuns: (options) => index.listRuns(options),\n readRun: async (runId) => {\n const stub = runs.get(runs.idFromName(runId)) as {\n getRun(): Promise<RunReadOutcome<WorkflowRun | null>>;\n };\n const outcome = await stub.getRun();\n return outcome.ok ? outcome.value : null;\n },\n },\n ...validated.args,\n );\n break;\n }\n case 'runs.commit':\n result = await index.commitRun(...validated.args);\n break;\n case 'runs.expire':\n result = await index.expireRun(...validated.args);\n break;\n case 'hooks.reserve':\n result = await index.reserveHook(...validated.args);\n break;\n case 'hooks.finalize':\n result = await index.finalizeHookIndexes(...validated.args);\n break;\n case 'hooks.release-reservation':\n result = await index.releaseHookReservation(...validated.args);\n break;\n case 'hooks.release':\n result = await index.releaseHookIndexes(...validated.args);\n break;\n }\n return new Response(rpcStringify(result ?? null), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n { status: 500 },\n );\n }\n }\n\n if (parts[1] === 'streams' && parts.length === 4 && parts[3] === 'chunks') {\n const runId = url.searchParams.get('runId');\n if (!runId) return errorResponse(400, 'BadRequest', 'runId is required');\n let name: string;\n try {\n name = decodePathComponent(parts[2], 'stream name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n try {\n if (request.method === 'POST') {\n if (!hasContentType(request, STREAM_BATCH_CONTENT_TYPE)) {\n return errorResponse(415, 'UnsupportedMediaType', STREAM_BATCH_CONTENT_TYPE);\n }\n const contentLength = declaredContentLength(request);\n if (contentLength !== null && contentLength > MAX_STREAM_WRITE_BODY_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const body = await readBoundedBytes(request, MAX_STREAM_WRITE_BODY_BYTES);\n if (body === null) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const chunks = decodeStreamWriteBatch(body);\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n };\n const result = await stub.writeChunks(runId, chunks);\n return streamResponse(encodeStreamWriteResult(result));\n }\n\n if (request.method === 'GET') {\n const readRequest = {\n runId,\n startIndex: parseBoundedInteger(url, 'startIndex', 0, 0x7fffffff),\n maxChunks: parseBoundedInteger(url, 'maxChunks', 0, NEGOTIATED_STREAM_CHUNKS),\n maxBytes: parseBoundedInteger(\n url,\n 'maxBytes',\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_READ_BYTES,\n ),\n waitMs: parseBoundedInteger(url, 'waitMs', 0, MAX_STREAM_LONG_POLL_MS),\n } satisfies StreamReadRequest;\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n };\n const result = await stub.readChunks(readRequest, request.signal);\n return streamResponse(encodeStreamReadResult(result));\n }\n\n return errorResponse(405, 'MethodNotAllowed', 'expected GET or POST');\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n {\n status:\n err?.name === 'StreamProtocolError' || err?.name === 'RequestValidationError'\n ? 400\n : 500,\n },\n );\n }\n }\n\n if (parts[1] !== 'rpc') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (parts.length !== 5) {\n return errorResponse(404, 'NotFound', 'expected POST /v1/rpc/{binding}/{name}/{method}');\n }\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n\n const [, , bindingKey, encodedName, method] = parts;\n const binding = BINDINGS[bindingKey];\n if (!binding) {\n return errorResponse(404, 'NotFound', `unknown binding: ${bindingKey}`);\n }\n if (!binding.methods.has(method)) {\n return errorResponse(404, 'NotFound', `unknown method: ${bindingKey}.${method}`);\n }\n\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let name: string;\n try {\n name = decodePathComponent(encodedName, 'Durable Object name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n const namespace = env[binding.env] as DONamespaceLike | undefined;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${binding.env}`);\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n\n if (bindingKey === 'runs' && method === 'applyEvent') {\n if (args.length !== 1) {\n return errorResponse(400, 'BadRequest', 'applyEvent expects exactly one request argument');\n }\n try {\n const applyRequest = parseApplyEventRequest(args[0]);\n if (applyRequest.runId !== name) {\n return errorResponse(\n 400,\n 'BadRequest',\n `applyEvent runId \"${applyRequest.runId}\" does not match routed run \"${name}\"`,\n );\n }\n args = [applyRequest];\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n }\n\n try {\n const stub = namespace.get(namespace.idFromName(name)) as Record<\n string,\n (...a: unknown[]) => Promise<unknown>\n >;\n const result = await stub[method](...args);\n if (bindingKey === 'runs' && method === 'applyEvent') {\n await publishApplyEventIndexes(env, name, result);\n }\n return new Response(rpcStringify(result ?? null), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n // Guard failures travel as structured outcomes, so a thrown error here\n // is exceptional (e.g. writing to a closed stream). Serialize by name\n // for client-side reconstruction.\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n { status: 500 },\n );\n }\n };\n}\n","import type { TerminalWorkflowRunStatus, WorkflowRun, WorkflowRunStatus } from '@workflow/world';\n\nexport const CLEANUP_RECORD_KEY = 'retention:cleanup';\nexport const TOMBSTONE_KEY = 'retention:tombstone';\nexport const HOOK_MARKER_PREFIX = 'retention:hook:';\nexport const TERMINAL_CLEANUP_KEY = 'terminal:cleanup';\n\nexport type CleanupPhase = 'retained' | 'index' | 'streams' | 'queues' | 'payload' | 'tombstoned';\n\nexport interface CleanupRecord {\n version: 1;\n runId: string;\n workflowName: string;\n createdAt: Date;\n /** Last status observed when cleanup was scheduled. */\n status?: WorkflowRunStatus;\n /** Present when cleanup was scheduled for a terminal run. */\n completedAt?: Date;\n /** Retained for persisted terminal-retention records created before max-age cleanup. */\n terminalStatus?: TerminalWorkflowRunStatus;\n reason?: 'terminal-retention' | 'maximum-age' | 'manual';\n dueAt: Date;\n phase: CleanupPhase;\n /** Optimistic-concurrency token for alarm/RPC work that awaits another cell. */\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n tombstonedAt?: Date;\n deletedPayloadKeys: number;\n deletedStreams: number;\n /** Queue payload objects removed from object storage during run cleanup. */\n deletedQueuePayloads: number;\n}\n\nexport interface RunTombstone {\n version: 1;\n runId: string;\n /** Last status observed before the run expired. */\n status?: WorkflowRunStatus;\n completedAt?: Date;\n terminalStatus?: TerminalWorkflowRunStatus;\n expiredAt: Date;\n tombstonedAt: Date;\n /** Final cleanup accounting retained inside the single authoritative record. */\n cleanup: CleanupRecord;\n}\n\nexport type RunLifecycleStatus = 'active' | 'terminal' | 'expired' | 'missing';\n\nexport type RunReadOutcome<T> =\n | { ok: true; value: T }\n | { ok: false; code: 'RUN_EXPIRED'; message: string; tombstone: RunTombstone };\n\nexport interface HookIndexReference {\n hookId: string;\n token: string;\n}\n\nexport interface TerminalCleanupRecord {\n version: 1;\n runId: string;\n phase: 'hooks' | 'markers' | 'waits';\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n}\n\nexport interface ReleaseHookIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n}\n\nexport interface ReleaseHookIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n expiredAt: number;\n}\n\nexport interface ExpireRunIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunStreamsResult {\n streams: string[];\n}\n\nexport interface FinalizeRunStreamsResult {\n /** Cumulative registry entries removed for this run. */\n deleted: number;\n done: boolean;\n}\n\nexport interface ExpireStreamResult {\n /** True only when this call installed the stream's expiration fence. */\n deleted: boolean;\n /** Chunk rows removed by this bounded call. */\n chunks: number;\n /** Payload bytes represented by the removed chunk rows. */\n bytes: number;\n done: boolean;\n}\n\nexport interface ScheduleCleanupRequest {\n retentionMs: number;\n}\n\nexport interface EnforceRetentionRequest extends ScheduleCleanupRequest {\n /** Cron occurrence being enforced. A run is eligible only at/before this time. */\n scheduledTime: number;\n}\n\nexport type EnforceRetentionResult =\n | { state: 'missing' | 'not-due'; cleanup: null }\n | { state: 'scheduled' | 'expired'; cleanup: CleanupRecord };\n\nexport function sortableTimestamp(date: Date): string {\n return date.getTime().toString().padStart(13, '0');\n}\n\nexport function workflowRunIndexKey(\n run: Pick<WorkflowRun, 'workflowName' | 'createdAt' | 'runId'>,\n) {\n return `run:${run.workflowName}:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function globalRunIndexKey(run: Pick<WorkflowRun, 'createdAt' | 'runId'>) {\n return `runall:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function hookMarkerKey(reference: HookIndexReference): string {\n return `${HOOK_MARKER_PREFIX}${encodeURIComponent(reference.hookId)}:${encodeURIComponent(reference.token)}`;\n}\n\nexport function cleanupTombstone(record: CleanupRecord, now: Date): RunTombstone {\n const cleanup: CleanupRecord = {\n ...record,\n phase: 'tombstoned',\n tombstonedAt: now,\n };\n return {\n version: 1,\n runId: record.runId,\n status: record.status ?? record.terminalStatus,\n terminalStatus: record.terminalStatus,\n completedAt: record.completedAt,\n expiredAt: record.dueAt,\n tombstonedAt: now,\n cleanup,\n };\n}\n\nexport function cleanupFromTombstone(tombstone: RunTombstone): CleanupRecord {\n return tombstone.cleanup;\n}\n\nexport function expiredRead<T>(tombstone: RunTombstone): RunReadOutcome<T> {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n tombstone,\n };\n}\n","import {\n createWorkflowIndex,\n type CellNamespaceLike,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n sortableTimestamp,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n} from '../retention.js';\nimport { isRecord, strictIntegerSetting } from '../validation.js';\n\nexport const DEFAULT_RETENTION_SWEEP_BATCH_SIZE = 128;\nexport const MAX_RETENTION_SWEEP_BATCH_SIZE = 1000;\nconst RETENTION_SWEEP_CONCURRENCY = 8;\n\ninterface RetentionRunStub {\n enforceRetention(request: EnforceRetentionRequest): Promise<EnforceRetentionResult>;\n}\n\ntype RetentionNamespace<T> = CellNamespaceLike<T>;\n\nexport interface RetentionSweepEnv {\n WORKFLOW_DB: RetentionNamespace<RetentionRunStub>;\n WORKFLOW_RUN_CATALOG: RetentionNamespace<RunCatalogShardStub>;\n WORKFLOW_HOOK_TOKENS: RetentionNamespace<HookTokenShardStub>;\n WORKFLOW_HOOK_IDS: RetentionNamespace<HookIdShardStub>;\n /** Fleet-wide maximum age from run creation. Zero disables the sweep. */\n WORKFLOW_RETENTION_MS?: string | number;\n /** Maximum catalog entries admitted by one cron occurrence. */\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n}\n\nexport interface RetentionSweepResult {\n disabled: boolean;\n cutoff: number | null;\n scanned: number;\n scheduled: number;\n expired: number;\n missing: number;\n notDue: number;\n invalid: number;\n /** Candidates preserved because their exact catalog value changed during the sweep. */\n preserved: number;\n}\n\nfunction requireNamespace<T>(\n name: keyof Pick<\n RetentionSweepEnv,\n 'WORKFLOW_DB' | 'WORKFLOW_RUN_CATALOG' | 'WORKFLOW_HOOK_TOKENS' | 'WORKFLOW_HOOK_IDS'\n >,\n namespace: RetentionNamespace<T> | undefined,\n): RetentionNamespace<T> {\n if (\n !namespace ||\n typeof namespace.idFromName !== 'function' ||\n typeof namespace.get !== 'function'\n ) {\n throw new Error(`world-celld retention sweep missing binding ${name}`);\n }\n return namespace;\n}\n\nfunction catalogCandidate(name: string, value: string): { runId: string; invalid: boolean } {\n const keyMatch = /^runall:\\d{13}:(.+)$/.exec(name);\n if (!keyMatch?.[1]) {\n throw new Error('world-celld: run catalog entry has an invalid global key');\n }\n const runId = keyMatch[1];\n try {\n const parsed: unknown = JSON.parse(value);\n return { runId, invalid: !isRecord(parsed) || parsed.runId !== runId };\n } catch {\n return { runId, invalid: true };\n }\n}\n\n/**\n * Discover and fence one bounded page of workflows older than the configured\n * maximum age. RunDO alarms finish the persisted, idempotent deletion phases.\n */\nexport async function runRetentionSweep(\n scheduledTime: number,\n env: RetentionSweepEnv,\n): Promise<RetentionSweepResult> {\n if (!Number.isSafeInteger(scheduledTime) || scheduledTime < 0) {\n throw new Error('world-celld: scheduledTime must be a non-negative safe integer');\n }\n const retentionMs = strictIntegerSetting(\n 'world-celld: WORKFLOW_RETENTION_MS',\n env.WORKFLOW_RETENTION_MS,\n 0,\n 0,\n );\n if (retentionMs === 0 || scheduledTime < retentionMs) {\n return {\n disabled: retentionMs === 0,\n cutoff: retentionMs === 0 ? null : scheduledTime - retentionMs,\n scanned: 0,\n scheduled: 0,\n expired: 0,\n missing: 0,\n notDue: 0,\n invalid: 0,\n preserved: 0,\n };\n }\n const batchSize = strictIntegerSetting(\n 'world-celld: WORKFLOW_RETENTION_BATCH_SIZE',\n env.WORKFLOW_RETENTION_BATCH_SIZE,\n DEFAULT_RETENTION_SWEEP_BATCH_SIZE,\n 1,\n MAX_RETENTION_SWEEP_BATCH_SIZE,\n );\n const cutoff = scheduledTime - retentionMs;\n const runNamespace = requireNamespace('WORKFLOW_DB', env.WORKFLOW_DB);\n const catalogNamespace = requireNamespace('WORKFLOW_RUN_CATALOG', env.WORKFLOW_RUN_CATALOG);\n const index = createWorkflowIndex({\n runCatalog: catalogNamespace,\n hookTokens: requireNamespace('WORKFLOW_HOOK_TOKENS', env.WORKFLOW_HOOK_TOKENS),\n hookIds: requireNamespace('WORKFLOW_HOOK_IDS', env.WORKFLOW_HOOK_IDS),\n });\n const page = await index.listRuns({\n prefix: 'runall:',\n end: `runall:${sortableTimestamp(new Date(cutoff + 1))}:`,\n limit: batchSize,\n });\n\n const result: RetentionSweepResult = {\n disabled: false,\n cutoff,\n scanned: page.keys.length,\n scheduled: 0,\n expired: 0,\n missing: 0,\n notDue: 0,\n invalid: 0,\n preserved: 0,\n };\n const failures: unknown[] = [];\n for (let offset = 0; offset < page.keys.length; offset += RETENTION_SWEEP_CONCURRENCY) {\n const candidates = page.keys.slice(offset, offset + RETENTION_SWEEP_CONCURRENCY);\n const settled = await Promise.allSettled(\n candidates.map(async (entry) => {\n const { runId, invalid } = catalogCandidate(entry.name, entry.value);\n if (!entry.sourceShard) {\n throw new Error('world-celld: merged run catalog entry omitted its source shard');\n }\n const catalog = catalogNamespace.get(catalogNamespace.idFromName(entry.sourceShard));\n if (invalid) {\n const deleted = await catalog.deleteStaleGlobalRun(runId, entry.name, entry.value);\n return { state: 'invalid', preserved: !deleted.deleted } as const;\n }\n const run = runNamespace.get(runNamespace.idFromName(runId));\n const outcome = await run.enforceRetention({ retentionMs, scheduledTime });\n if (outcome.state === 'missing' || outcome.state === 'not-due') {\n const deleted = await catalog.deleteStaleGlobalRun(runId, entry.name, entry.value);\n return { state: outcome.state, preserved: !deleted.deleted };\n }\n return { state: outcome.state, preserved: false };\n }),\n );\n for (const outcome of settled) {\n if (outcome.status === 'rejected') {\n failures.push(outcome.reason);\n } else {\n result[outcome.value.state === 'not-due' ? 'notDue' : outcome.value.state]++;\n if (outcome.value.preserved) result.preserved++;\n }\n }\n }\n if (failures.length > 0) {\n throw new AggregateError(\n failures,\n `world-celld retention sweep failed for ${failures.length} run(s)`,\n );\n }\n return result;\n}\n","/**\n * Provider-neutral storage used for run-bearing native Queue payloads.\n *\n * celld v0.4 exposes a namespace in the fleet's existing object store through\n * the Workers R2-compatible binding shape. Keep that platform shape here so\n * queue and retention code depend only on QueuePayloadStore.\n */\nexport interface QueuePayloadStore {\n write(key: string, value: string, metadata: { runId: string; messageId: string }): Promise<void>;\n read(key: string): Promise<string | null>;\n delete(keys: string | string[]): Promise<void>;\n}\n\nexport interface QueuePayloadObjectStorageBinding {\n put(\n key: string,\n value: string,\n options?: { customMetadata?: Record<string, string> },\n ): Promise<unknown>;\n get(key: string): Promise<{ text(): Promise<string> } | null>;\n delete(keys: string | string[]): Promise<void>;\n}\n\nexport function createQueuePayloadStore(\n binding: QueuePayloadObjectStorageBinding,\n): QueuePayloadStore {\n return {\n async write(key, value, metadata) {\n await binding.put(key, value, { customMetadata: metadata });\n },\n async read(key) {\n return (await binding.get(key))?.text() ?? null;\n },\n async delete(keys) {\n await binding.delete(keys);\n },\n };\n}\n\nexport async function deleteQueuePayloadObjects(\n binding: Pick<QueuePayloadObjectStorageBinding, 'delete'>,\n keys: string | string[],\n): Promise<void> {\n await binding.delete(keys);\n}\n","import type { Hook } from '@workflow/world';\nimport type { HookTokenOwner } from '../../config.js';\nimport type { CellNamespaceLike } from '../../indexes.js';\nimport type { RunLifecycleStatus } from '../../retention.js';\nimport { parse } from '../../vendor/shared/index.js';\n\ninterface RunLifecycleStub {\n getLifecycleStatus(): Promise<RunLifecycleStatus>;\n}\n\nexport interface HookIndexEnv {\n WORKFLOW_DB?: CellNamespaceLike<RunLifecycleStub>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\nexport function sameOwner(left: HookTokenOwner, right: HookTokenOwner): boolean {\n return left.runId === right.runId && left.hookId === right.hookId;\n}\n\nexport function ownerFromSerializedHook(raw: string): HookTokenOwner {\n const hook = parse<Hook>(raw);\n return { runId: hook.runId, hookId: hook.hookId };\n}\n\nexport function indexKey(prefix: string, value: string): string {\n return `${prefix}:${encodeURIComponent(value)}`;\n}\n\nexport async function runIsActive(env: HookIndexEnv, runId: string): Promise<boolean> {\n const namespace = env.WORKFLOW_DB;\n if (!namespace) throw new Error('world-celld hook index missing WORKFLOW_DB binding');\n const target = namespace.get(namespace.idFromName(runId));\n return (await target.getLifecycleStatus()) === 'active';\n}\n","import type { HookTokenOwner } from '../../config.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n indexKey,\n ownerFromSerializedHook,\n runIsActive,\n sameOwner,\n type HookIndexEnv,\n} from './hook-index-shared.js';\nimport {\n HOOK_CLAIM_LEASE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n} from '../../lifecycle.js';\n\nconst MAX_RELEASE_BATCH = 64;\nconst CLAIM_DEADLINE_PREFIX = 'claim-deadline:';\n\ninterface HookClaim {\n owner: HookTokenOwner;\n claimId: string;\n reservedAt: number;\n expiresAt: number;\n deadlineKey: string;\n}\n\ninterface ClaimDeadline {\n hookId: string;\n claimId: string;\n expiresAt: number;\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction recordKey(hookId: string): string {\n return indexKey('hookid', hookId);\n}\n\nfunction claimKey(hookId: string): string {\n return indexKey('claim', hookId);\n}\n\nfunction claimDeadlineKey(hookId: string, expiresAt: number): string {\n return `${CLAIM_DEADLINE_PREFIX}${pad(expiresAt)}:${encodeURIComponent(hookId)}`;\n}\n\n/** Hook-ID ownership and lookup shard; every hook ID has one transaction domain. */\nexport class HookIdDO extends DurableObject<HookIndexEnv> {\n private now(): number {\n return typeof this.env.clock === 'function' ? this.env.clock() : Date.now();\n }\n\n async get(hookId: string): Promise<string | null> {\n const raw = await this.ctx.storage.get<string>(recordKey(hookId));\n if (!raw) return null;\n const owner = ownerFromSerializedHook(raw);\n return (await runIsActive(this.env, owner.runId)) ? raw : null;\n }\n\n async reserve(\n hookId: string,\n owner: HookTokenOwner,\n proposedClaimId: string,\n ): Promise<{ claimed: true; claimId: string } | { claimed: false; holder: HookTokenOwner }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(hookId);\n const claim = claimKey(hookId);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined) {\n return { claimed: false, holder: ownerFromSerializedHook(indexed) };\n }\n let existing = values.get(claim) as HookClaim | undefined;\n const now = this.now();\n if (existing && existing.expiresAt <= now) {\n await txn.delete([claim, existing.deadlineKey]);\n existing = undefined;\n }\n if (existing !== undefined && !sameOwner(existing.owner, owner)) {\n return { claimed: false, holder: existing.owner };\n }\n if (existing === undefined || existing.claimId !== proposedClaimId) {\n if (existing) await txn.delete(existing.deadlineKey);\n const expiresAt = now + HOOK_CLAIM_LEASE_MS;\n const deadlineKey = claimDeadlineKey(hookId, expiresAt);\n await txn.put(claim, {\n owner,\n claimId: proposedClaimId,\n reservedAt: now,\n expiresAt,\n deadlineKey,\n } satisfies HookClaim);\n await txn.put<ClaimDeadline>(deadlineKey, { hookId, claimId: proposedClaimId, expiresAt });\n await this.armAtMost(txn, expiresAt);\n return { claimed: true, claimId: proposedClaimId };\n }\n return { claimed: true, claimId: existing.claimId };\n });\n }\n\n async publish(\n hookId: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }> {\n if (!(await runIsActive(this.env, owner.runId))) {\n await this.releaseBatch([{ hookId, owner }]);\n return { stored: false };\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(hookId);\n const claim = claimKey(hookId);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined && !sameOwner(ownerFromSerializedHook(indexed), owner)) {\n throw new Error(`Hook id ${hookId} is owned by another hook`);\n }\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (existingClaim && existingClaim.expiresAt <= this.now()) {\n await txn.delete([claim, existingClaim.deadlineKey]);\n return { stored: false };\n }\n if (\n existingClaim !== undefined &&\n (!sameOwner(existingClaim.owner, owner) || existingClaim.claimId !== claimId)\n ) {\n throw new Error(`Hook id ${hookId} is reserved by another hook`);\n }\n if (indexed === undefined && existingClaim === undefined) {\n throw new Error(`Hook id ${hookId} has no active reservation`);\n }\n await txn.put(record, serializedHook);\n if (existingClaim !== undefined) await txn.delete([claim, existingClaim.deadlineKey]);\n return { stored: true };\n });\n }\n\n async releaseClaim(hookId: string, owner: HookTokenOwner, claimId: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const key = claimKey(hookId);\n const claim = await txn.get<HookClaim>(key);\n if (claim && sameOwner(claim.owner, owner) && claim.claimId === claimId) {\n await txn.delete([key, claim.deadlineKey]);\n }\n });\n }\n\n async releaseBatch(\n hooks: Array<{ hookId: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }> {\n if (hooks.length > MAX_RELEASE_BATCH) throw new Error('Hook id release batch is too large');\n if (hooks.length === 0) return { deleted: 0 };\n return await this.ctx.storage.transaction(async (txn) => {\n const keys = hooks.flatMap(({ hookId }) => [recordKey(hookId), claimKey(hookId)]);\n const values = await txn.get<string | HookClaim>(keys);\n const deletes: string[] = [];\n const deadlineDeletes: string[] = [];\n for (const { hookId, owner } of hooks) {\n const record = recordKey(hookId);\n const claim = claimKey(hookId);\n const indexed = values.get(record) as string | undefined;\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (indexed !== undefined && sameOwner(ownerFromSerializedHook(indexed), owner)) {\n deletes.push(record);\n }\n if (existingClaim !== undefined && sameOwner(existingClaim.owner, owner)) {\n deletes.push(claim);\n deadlineDeletes.push(existingClaim.deadlineKey);\n }\n }\n const deleted = deletes.length === 0 ? 0 : await txn.delete(deletes);\n if (deadlineDeletes.length > 0) await txn.delete(deadlineDeletes);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactClaims();\n } catch {\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectTransaction, at: number): Promise<void> {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async compactClaims(): Promise<void> {\n const now = this.now();\n await this.ctx.storage.transaction(async (txn) => {\n const due = await txn.list<ClaimDeadline>({\n prefix: CLAIM_DEADLINE_PREFIX,\n end: `${CLAIM_DEADLINE_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const claims = await txn.get<HookClaim>(page.map(([, item]) => claimKey(item.hookId)));\n const deletes = page.flatMap(([deadline, item]) => {\n const key = claimKey(item.hookId);\n const claim = claims.get(key);\n return claim?.claimId === item.claimId && claim.expiresAt <= now\n ? [deadline, key]\n : [deadline];\n });\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<ClaimDeadline>({ prefix: CLAIM_DEADLINE_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.expiresAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type { HookTokenOwner } from '../../config.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n indexKey,\n ownerFromSerializedHook,\n runIsActive,\n sameOwner,\n type HookIndexEnv,\n} from './hook-index-shared.js';\nimport {\n HOOK_CLAIM_LEASE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n} from '../../lifecycle.js';\n\ninterface HookClaim {\n owner: HookTokenOwner;\n claimId: string;\n reservedAt: number;\n expiresAt: number;\n deadlineKey: string;\n}\n\nconst MAX_RELEASE_BATCH = 64;\nconst CLAIM_DEADLINE_PREFIX = 'claim-deadline:';\n\ninterface ClaimDeadline {\n token: string;\n claimId: string;\n expiresAt: number;\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction recordKey(token: string): string {\n return indexKey('hook', token);\n}\n\nfunction claimKey(token: string): string {\n return indexKey('claim', token);\n}\n\nfunction claimDeadlineKey(token: string, expiresAt: number): string {\n return `${CLAIM_DEADLINE_PREFIX}${pad(expiresAt)}:${encodeURIComponent(token)}`;\n}\n\n/** Token-ownership shard. A token hashes to exactly one shard and transaction domain. */\nexport class HookTokenDO extends DurableObject<HookIndexEnv> {\n private now(): number {\n return typeof this.env.clock === 'function' ? this.env.clock() : Date.now();\n }\n\n async get(token: string): Promise<string | null> {\n const raw = await this.ctx.storage.get<string>(recordKey(token));\n if (!raw) return null;\n const owner = ownerFromSerializedHook(raw);\n return (await runIsActive(this.env, owner.runId)) ? raw : null;\n }\n\n async reserve(\n token: string,\n owner: HookTokenOwner,\n proposedClaimId: string,\n ): Promise<{ claimed: true; claimId: string } | { claimed: false; holder: HookTokenOwner }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(token);\n const claim = claimKey(token);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined) {\n return { claimed: false, holder: ownerFromSerializedHook(indexed) };\n }\n let existing = values.get(claim) as HookClaim | undefined;\n const now = this.now();\n if (existing && existing.expiresAt <= now) {\n await txn.delete([claim, existing.deadlineKey]);\n existing = undefined;\n }\n if (existing !== undefined && !sameOwner(existing.owner, owner)) {\n return { claimed: false, holder: existing.owner };\n }\n if (existing === undefined) {\n const expiresAt = now + HOOK_CLAIM_LEASE_MS;\n const deadlineKey = claimDeadlineKey(token, expiresAt);\n await txn.put(claim, {\n owner,\n claimId: proposedClaimId,\n reservedAt: now,\n expiresAt,\n deadlineKey,\n } satisfies HookClaim);\n await txn.put<ClaimDeadline>(deadlineKey, { token, claimId: proposedClaimId, expiresAt });\n await this.armAtMost(txn, expiresAt);\n return { claimed: true, claimId: proposedClaimId };\n }\n return { claimed: true, claimId: existing.claimId };\n });\n }\n\n async finalize(\n token: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }> {\n if (!(await runIsActive(this.env, owner.runId))) {\n await this.releaseBatch([{ token, owner }]);\n return { stored: false };\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(token);\n const claim = claimKey(token);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined && !sameOwner(ownerFromSerializedHook(indexed), owner)) {\n throw new Error(`Hook token ${token} is owned by another hook`);\n }\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (existingClaim && existingClaim.expiresAt <= this.now()) {\n await txn.delete([claim, existingClaim.deadlineKey]);\n return { stored: false };\n }\n if (\n existingClaim !== undefined &&\n (!sameOwner(existingClaim.owner, owner) || existingClaim.claimId !== claimId)\n ) {\n throw new Error(`Hook token ${token} is reserved by another hook`);\n }\n if (indexed === undefined && existingClaim === undefined) {\n throw new Error(`Hook token ${token} has no active reservation`);\n }\n await txn.put(record, serializedHook);\n if (existingClaim !== undefined) await txn.delete([claim, existingClaim.deadlineKey]);\n return { stored: true };\n });\n }\n\n async releaseClaim(token: string, owner: HookTokenOwner, claimId: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const key = claimKey(token);\n const claim = await txn.get<HookClaim>(key);\n if (claim && sameOwner(claim.owner, owner) && claim.claimId === claimId) {\n await txn.delete([key, claim.deadlineKey]);\n }\n });\n }\n\n async releaseBatch(\n hooks: Array<{ token: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }> {\n if (hooks.length > MAX_RELEASE_BATCH) throw new Error('Hook token release batch is too large');\n if (hooks.length === 0) return { deleted: 0 };\n return await this.ctx.storage.transaction(async (txn) => {\n const keys = hooks.flatMap(({ token }) => [recordKey(token), claimKey(token)]);\n const values = await txn.get<string | HookClaim>(keys);\n const deletes: string[] = [];\n const deadlineDeletes: string[] = [];\n for (const { token, owner } of hooks) {\n const record = recordKey(token);\n const claim = claimKey(token);\n const indexed = values.get(record) as string | undefined;\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (indexed !== undefined && sameOwner(ownerFromSerializedHook(indexed), owner)) {\n deletes.push(record);\n }\n if (existingClaim !== undefined && sameOwner(existingClaim.owner, owner)) {\n deletes.push(claim);\n deadlineDeletes.push(existingClaim.deadlineKey);\n }\n }\n const deleted = deletes.length === 0 ? 0 : await txn.delete(deletes);\n if (deadlineDeletes.length > 0) await txn.delete(deadlineDeletes);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactClaims();\n } catch {\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectTransaction, at: number): Promise<void> {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async compactClaims(): Promise<void> {\n const now = this.now();\n await this.ctx.storage.transaction(async (txn) => {\n const due = await txn.list<ClaimDeadline>({\n prefix: CLAIM_DEADLINE_PREFIX,\n end: `${CLAIM_DEADLINE_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const claims = await txn.get<HookClaim>(page.map(([, item]) => claimKey(item.token)));\n const deletes = page.flatMap(([deadline, item]) => {\n const key = claimKey(item.token);\n const claim = claims.get(key);\n return claim?.claimId === item.claimId && claim.expiresAt <= now\n ? [deadline, key]\n : [deadline];\n });\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<ClaimDeadline>({ prefix: CLAIM_DEADLINE_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.expiresAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type { ExpireRunIndexesResult } from '../../retention.js';\nimport type { IndexListOptions, IndexListPage } from '../../indexes.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n CATALOG_FENCE_GRACE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS,\n} from '../../lifecycle.js';\n\nconst MAX_INDEX_LIST_SIZE = 1001;\nconst EXPIRY_GC_PREFIX = 'expiry-gc:';\nconst CATALOG_KEYS_PREFIX = 'catalog-keys:';\n\ninterface RunCatalogEnv {\n clock?: () => number;\n}\n\ninterface CatalogExpiryFence {\n expiredAt: number;\n compactAt: number;\n}\n\ninterface CatalogExpiryGc {\n runId: string;\n compactAt: number;\n}\n\ninterface CatalogKeys {\n keys: [string, string];\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction expiredKey(runId: string): string {\n return `expired:${runId}`;\n}\n\nfunction catalogKeysKey(runId: string): string {\n return `${CATALOG_KEYS_PREFIX}${encodeURIComponent(runId)}`;\n}\n\nfunction canonicalCatalogKeys(runId: string, keys: unknown): [string, string] {\n if (!Array.isArray(keys) || keys.length !== 2 || keys.some((key) => typeof key !== 'string')) {\n throw new Error('Run catalog commit requires exactly two string keys');\n }\n const suffix = `:${runId}`;\n const workflowMatch = /^run:(.+):(\\d{13}):/.exec(keys[0]);\n if (\n workflowMatch === null ||\n !keys[0].endsWith(suffix) ||\n keys[0] !== `run:${workflowMatch[1]}:${workflowMatch[2]}${suffix}` ||\n keys[1] !== `runall:${workflowMatch[2]}${suffix}`\n ) {\n throw new Error('Run catalog commit requires the canonical run key pair');\n }\n return [keys[0], keys[1]];\n}\n\nfunction expiryGcKey(runId: string, compactAt: number): string {\n return `${EXPIRY_GC_PREFIX}${pad(compactAt)}:${encodeURIComponent(runId)}`;\n}\n\n/** One of a fixed set of run-catalog shards, routed by the stable run ID hash. */\nexport class RunCatalogDO extends DurableObject {\n private now(): number {\n const clock = (this.env as RunCatalogEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n async upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }> {\n const canonicalKeys = canonicalCatalogKeys(runId, keys);\n return await this.ctx.storage.transaction(async (txn) => {\n const recordKey = catalogKeysKey(runId);\n const existing = await txn.get<string | CatalogKeys>([\n expiredKey(runId),\n canonicalKeys[0],\n canonicalKeys[1],\n recordKey,\n ]);\n if (existing.get(expiredKey(runId)) !== undefined) return { stored: false };\n const now = this.now();\n if (\n !Number.isSafeInteger(publicationExpiresAt) ||\n publicationExpiresAt <= now ||\n publicationExpiresAt > now + MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS\n ) {\n return { stored: false };\n }\n const record = existing.get(recordKey) as CatalogKeys | undefined;\n if (\n existing.get(canonicalKeys[0]) === serializedMetadata &&\n existing.get(canonicalKeys[1]) === serializedMetadata &&\n record?.keys.length === canonicalKeys.length &&\n record.keys.every((key, index) => key === canonicalKeys[index])\n ) {\n // An idempotent republication (e.g. a run_started replay) changes\n // nothing, so it stays a read-only transaction.\n return { stored: true };\n }\n await txn.put({\n [canonicalKeys[0]]: serializedMetadata,\n [canonicalKeys[1]]: serializedMetadata,\n [catalogKeysKey(runId)]: { keys: canonicalKeys } satisfies CatalogKeys,\n });\n return { stored: true };\n });\n }\n\n async list(options: IndexListOptions = {}): Promise<IndexListPage> {\n const suppliedLimit = options.limit;\n const requestedLimit =\n typeof suppliedLimit === 'number' && Number.isFinite(suppliedLimit)\n ? Math.floor(suppliedLimit)\n : MAX_INDEX_LIST_SIZE;\n const limit = Math.min(MAX_INDEX_LIST_SIZE, Math.max(1, requestedLimit));\n const entries = await this.ctx.storage.list<string>({\n // The shard also owns internal expiry metadata. An unprefixed catalog\n // read means all public run/runall entries, never internal records.\n prefix: options.prefix || 'run',\n ...(options.reverse\n ? { reverse: true, end: options.cursor ?? options.end }\n : { startAfter: options.cursor, end: options.end }),\n limit: limit + 1,\n });\n const page = Array.from(entries).slice(0, limit);\n const listComplete = entries.size <= limit;\n return {\n keys: page.map(([name, value]) => ({ name, value })),\n list_complete: listComplete,\n cursor: listComplete ? undefined : page.at(-1)?.[0],\n };\n }\n\n /** Compare-and-delete one rejected retention discovery candidate. */\n async deleteStaleGlobalRun(\n runId: string,\n key: string,\n expectedValue: string,\n ): Promise<{ deleted: boolean }> {\n if (!key.startsWith('runall:') || !key.endsWith(`:${runId}`)) {\n throw new Error('Stale run catalog deletion requires the exact global run key');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get<string>(key)) !== expectedValue) return { deleted: false };\n return { deleted: await txn.delete(key) };\n });\n }\n\n async expireRun(runId: string, expiredAt: number): Promise<ExpireRunIndexesResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const storedKeysKey = catalogKeysKey(runId);\n const storedKeys = await txn.get<CatalogKeys>(storedKeysKey);\n if (storedKeys === undefined) return { deleted: 0 };\n const canonicalKeys = canonicalCatalogKeys(runId, storedKeys.keys);\n const marker = expiredKey(runId);\n const existing = await txn.get<CatalogExpiryFence>(marker);\n const compactAt = existing?.compactAt ?? this.now() + CATALOG_FENCE_GRACE_MS;\n await txn.put<CatalogExpiryFence>(marker, { expiredAt, compactAt });\n await txn.put<CatalogExpiryGc>(expiryGcKey(runId, compactAt), { runId, compactAt });\n await this.armAtMost(txn, compactAt);\n const deleted = await txn.delete(canonicalKeys);\n await txn.delete(storedKeysKey);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactExpiryFences();\n } catch {\n // Cloudflare retries only six times. Persist a fresh alarm edge so a\n // transient storage failure cannot abandon compaction permanently.\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectStorage | DurableObjectTransaction, at: number) {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async compactExpiryFences(): Promise<void> {\n const now = this.now();\n await this.ctx.storage.transaction(async (txn) => {\n const due = await txn.list<CatalogExpiryGc>({\n prefix: EXPIRY_GC_PREFIX,\n end: `${EXPIRY_GC_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const markerKeys = page.map(([, item]) => expiredKey(item.runId));\n const markers = await txn.get<CatalogExpiryFence>(markerKeys);\n const deletes = page.flatMap(([key, item], index) => {\n const marker = markers.get(markerKeys[index]);\n return marker?.compactAt === item.compactAt ? [key, markerKeys[index]] : [key];\n });\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<CatalogExpiryGc>({ prefix: EXPIRY_GC_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.compactAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type {\n ExpireRunStreamsResult,\n ExpireStreamResult,\n FinalizeRunStreamsResult,\n} from '../../retention.js';\nimport {\n MAX_STREAM_CHUNK_BYTES,\n normalizeStreamError,\n validateStreamReadRequest,\n validateStreamWriteChunks,\n type StreamErrorData,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamTerminalState,\n type StreamWriteResult,\n} from '../../stream-protocol.js';\nimport { DurableObject } from '../do-base.js';\n\ninterface StreamMeta {\n /** Number of durable chunks (also the next chunk index). */\n count: number;\n state: StreamTerminalState;\n ownerRunId?: string;\n error?: StreamErrorData;\n expiredAt?: number;\n expiredChunkCount?: number;\n payloadDeleted?: boolean;\n}\n\ninterface StreamWaiter {\n resolve(reason: 'change' | 'timeout'): void;\n timer: ReturnType<typeof setTimeout>;\n signal?: AbortSignal;\n onAbort?: () => void;\n}\n\ninterface RegistryExpiry {\n expiredAt: number;\n deleted: number;\n}\n\nconst META_KEY = 'meta';\nconst CHUNK_KEY_PREFIX = 'chunk:';\nconst CHUNK_SIZE_KEY_PREFIX = 'chunk-size:';\n/** Registry keys used when this DO instance acts as a per-run stream index. */\nconst STREAM_REGISTRY_PREFIX = 'stream:';\nconst REGISTRY_OWNER_KEY = 'registry:owner';\nconst REGISTRY_EXPIRED_KEY = 'registry:expired';\n/** Each chunk occupies a payload key and a size key, deleted in calls of at most 128 keys. */\nconst DEFAULT_EXPIRE_CHUNK_LIMIT = 64;\nconst MAX_EXPIRE_CHUNK_LIMIT = 256;\nconst DELETE_BATCH_KEYS = 128;\n/** Bound storage deletion work as well as item count; one oversized chunk still makes progress. */\nconst DEFAULT_EXPIRE_BYTE_LIMIT = 16 * 1024 * 1024;\nconst MAX_EXPIRE_BYTE_LIMIT = DEFAULT_EXPIRE_BYTE_LIMIT;\nconst MAX_STREAM_INDEX = 0x7fffffff;\n/** One storage get or put call accepts at most 128 keys. */\nconst STORAGE_BATCH_KEYS = 128;\n\nfunction boundedLimit(value: number | undefined, fallback: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(1, Math.min(maximum, Math.floor(value)));\n}\n\nfunction emptyMeta(): StreamMeta {\n return { count: 0, state: 'open' };\n}\n\nfunction validateMeta(meta: unknown): StreamMeta {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n throw new Error('Invalid persisted stream metadata');\n }\n const candidate = meta as Partial<StreamMeta>;\n if (\n !Number.isSafeInteger(candidate.count) ||\n candidate.count! < 0 ||\n candidate.count! > MAX_STREAM_INDEX ||\n !['open', 'closed', 'errored', 'expired'].includes(candidate.state as StreamTerminalState) ||\n (candidate.ownerRunId !== undefined && typeof candidate.ownerRunId !== 'string') ||\n (candidate.payloadDeleted !== undefined && typeof candidate.payloadDeleted !== 'boolean')\n ) {\n throw new Error('Invalid persisted stream metadata');\n }\n const error = candidate.error;\n if (\n (error !== undefined &&\n (!error ||\n typeof error !== 'object' ||\n typeof error.name !== 'string' ||\n typeof error.message !== 'string')) ||\n (candidate.state === 'errored') !== (error !== undefined)\n ) {\n throw new Error('Invalid persisted stream error metadata');\n }\n return candidate as StreamMeta;\n}\n\n/** Zero-padding keeps storage.list() results in stream offset order. */\nfunction chunkKey(index: number): string {\n return `${CHUNK_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction chunkSizeKey(index: number): string {\n return `${CHUNK_SIZE_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction indexFromChunkSizeKey(key: string): number {\n const suffix = key.slice(CHUNK_SIZE_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk size key \"${key}\"`);\n }\n return index;\n}\n\nfunction indexFromChunkKey(key: string): number {\n const suffix = key.slice(CHUNK_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk key \"${key}\"`);\n }\n return index;\n}\n\nfunction validateChunkSize(size: unknown, index: number): number {\n if (\n typeof size !== 'number' ||\n !Number.isSafeInteger(size) ||\n size < 0 ||\n size > MAX_STREAM_CHUNK_BYTES\n ) {\n throw new Error(`Invalid persisted stream chunk size at index ${index}`);\n }\n return size;\n}\n\nfunction compactChunk(chunk: Uint8Array): Uint8Array {\n return chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength\n ? chunk\n : new Uint8Array(chunk);\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');\n}\n\n/**\n * Durable Object backing workflow streams.\n *\n * Stream cells persist binary chunks under monotonic offset keys. Public\n * reads are bounded long polls, and writes append a bounded ordered batch in\n * one storage transaction. Per-run registry cells retain their existing role.\n */\nexport class StreamDO extends DurableObject {\n private meta: StreamMeta | undefined;\n private metaLoad: Promise<StreamMeta> | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private changeVersion = 0;\n private readonly waiters = new Set<StreamWaiter>();\n\n /** Multi-key read split into calls within the per-call key limit. */\n private async getMany<T>(keys: string[]): Promise<Map<string, T>> {\n if (keys.length <= STORAGE_BATCH_KEYS) return await this.ctx.storage.get<T>(keys);\n const groups: string[][] = [];\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_KEYS) {\n groups.push(keys.slice(offset, offset + STORAGE_BATCH_KEYS));\n }\n const merged = new Map<string, T>();\n for (const result of await Promise.all(groups.map((group) => this.ctx.storage.get<T>(group)))) {\n for (const [key, value] of result) merged.set(key, value);\n }\n return merged;\n }\n\n private async getMeta(): Promise<StreamMeta> {\n if (this.meta) return this.meta;\n this.metaLoad ??= this.ctx.storage.get<StreamMeta>(META_KEY).then((meta) => {\n const loaded = meta === undefined ? emptyMeta() : validateMeta(meta);\n this.meta = loaded;\n return loaded;\n });\n try {\n return await this.metaLoad;\n } catch (error) {\n this.metaLoad = undefined;\n throw error;\n }\n }\n\n private assertOwner(meta: StreamMeta, runId: string): void {\n if (!runId) throw new Error('Stream runId is required');\n if (meta.ownerRunId !== undefined && meta.ownerRunId !== runId) {\n throw new Error(`Stream is owned by workflow run \"${meta.ownerRunId}\"`);\n }\n }\n\n private assertWritable(meta: StreamMeta, runId: string): void {\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state === 'closed') throw new Error('Cannot write to a closed stream');\n if (meta.state === 'errored') throw new Error('Cannot write to an errored stream');\n }\n\n private runMutation<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.mutationTail.then(operation, operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private wakeReaders(): void {\n this.changeVersion += 1;\n for (const waiter of Array.from(this.waiters)) waiter.resolve('change');\n }\n\n private waitForChange(\n observedVersion: number,\n waitMs: number,\n signal?: AbortSignal,\n ): Promise<'change' | 'timeout'> {\n if (signal?.aborted) return Promise.reject(abortReason(signal));\n\n return new Promise<'change' | 'timeout'>((resolve, reject) => {\n let settled = false;\n const waiter: StreamWaiter = {\n timer: setTimeout(() => finish('timeout'), waitMs),\n signal,\n resolve: (reason) => finish(reason),\n };\n\n const cleanup = () => {\n clearTimeout(waiter.timer);\n this.waiters.delete(waiter);\n if (waiter.signal && waiter.onAbort) {\n waiter.signal.removeEventListener('abort', waiter.onAbort);\n }\n };\n const finish = (reason: 'change' | 'timeout') => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(reason);\n };\n waiter.onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(abortReason(signal!));\n };\n\n this.waiters.add(waiter);\n signal?.addEventListener('abort', waiter.onAbort, { once: true });\n\n // A writer may have committed after the caller inspected metadata but\n // before this waiter was installed. The generation check closes that\n // lost-wakeup window without another storage read.\n if (this.changeVersion !== observedVersion) finish('change');\n });\n }\n\n private async readSnapshot(\n request: StreamReadRequest,\n timedOut: boolean,\n ): Promise<StreamReadResult> {\n const meta = await this.getMeta();\n this.assertOwner(meta, request.runId);\n\n const available =\n meta.state === 'expired'\n ? 0\n : Math.max(0, Math.min(request.maxChunks, meta.count - request.startIndex));\n const chunks: Uint8Array[] = [];\n if (available > 0) {\n const indexes = Array.from({ length: available }, (_, offset) => request.startIndex + offset);\n const sizeKeys = indexes.map(chunkSizeKey);\n const storedSizes = await this.getMany<number>(sizeKeys);\n const selectedIndexes: number[] = [];\n const selectedSizes: number[] = [];\n let bytes = 0;\n for (const index of indexes) {\n const size = validateChunkSize(storedSizes.get(chunkSizeKey(index)), index);\n if (bytes + size > request.maxBytes) break;\n selectedIndexes.push(index);\n selectedSizes.push(size);\n bytes += size;\n }\n\n const payloadKeys = selectedIndexes.map(chunkKey);\n const storedChunks = await this.getMany<Uint8Array>(payloadKeys);\n for (let offset = 0; offset < payloadKeys.length; offset++) {\n const chunk = storedChunks.get(payloadKeys[offset]);\n if (!(chunk instanceof Uint8Array) || chunk.byteLength !== selectedSizes[offset]) {\n throw new Error(`Invalid persisted stream chunk at index ${selectedIndexes[offset]}`);\n }\n chunks.push(chunk);\n }\n }\n\n return {\n startIndex: request.startIndex,\n tailIndex: meta.count - 1,\n chunks,\n state: meta.state,\n timedOut,\n error: meta.error,\n };\n }\n\n /** Append one bounded binary batch with contiguous indexes. */\n async writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult> {\n validateStreamWriteChunks(chunks);\n const storedChunks = chunks.map(compactChunk);\n return await this.runMutation(async () => {\n const committed = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertWritable(meta, runId);\n const startIndex = meta.count;\n if (startIndex + chunks.length > MAX_STREAM_INDEX) {\n throw new Error('Stream offset limit exceeded');\n }\n const nextMeta: StreamMeta = {\n count: startIndex + chunks.length,\n state: 'open',\n ownerRunId: runId,\n };\n const entries: Array<[string, StreamMeta | Uint8Array | number]> = [[META_KEY, nextMeta]];\n for (let offset = 0; offset < storedChunks.length; offset++) {\n const index = startIndex + offset;\n entries.push([chunkKey(index), storedChunks[offset]]);\n entries.push([chunkSizeKey(index), storedChunks[offset].byteLength]);\n }\n // One transaction, written in groups within the per-call key limit.\n for (let offset = 0; offset < entries.length; offset += STORAGE_BATCH_KEYS) {\n await txn.put(Object.fromEntries(entries.slice(offset, offset + STORAGE_BATCH_KEYS)));\n }\n return {\n meta: nextMeta,\n result: {\n startIndex,\n count: chunks.length,\n tailIndex: nextMeta.count - 1,\n } satisfies StreamWriteResult,\n };\n });\n this.meta = committed.meta;\n this.metaLoad = Promise.resolve(committed.meta);\n this.wakeReaders();\n return committed.result;\n });\n }\n\n /**\n * Return available binary chunks and terminal metadata in one bounded\n * operation, waiting at most waitMs when the requested offset is idle.\n */\n async readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult> {\n validateStreamReadRequest(request);\n const observedVersion = this.changeVersion;\n const immediate = await this.readSnapshot(request, false);\n if (\n immediate.chunks.length > 0 ||\n immediate.state !== 'open' ||\n request.waitMs === 0 ||\n request.maxChunks === 0\n ) {\n return immediate;\n }\n\n const reason = await this.waitForChange(observedVersion, request.waitMs, signal);\n return await this.readSnapshot(request, reason === 'timeout');\n }\n\n /** Close idempotently; the first terminal state wins. */\n async closeStream(runId: string): Promise<void> {\n await this.runMutation(async () => {\n const nextMeta = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const closed: StreamMeta = { ...meta, ownerRunId: runId, state: 'closed' };\n await txn.put(META_KEY, closed);\n return closed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Persist a terminal stream failure and wake every pending reader. */\n async failStream(runId: string, error: StreamErrorData | string): Promise<void> {\n const normalized = normalizeStreamError(error);\n await this.runMutation(async () => {\n const nextMeta = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const failed: StreamMeta = {\n ...meta,\n ownerRunId: runId,\n state: 'errored',\n error: normalized,\n };\n await txn.put(META_KEY, failed);\n return failed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Register a stream name against this per-run registry instance. */\n async registerStream(runId: string, name: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error(`Workflow run \"${runId}\" has expired`);\n }\n const owner = await txn.get<string>(REGISTRY_OWNER_KEY);\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n await txn.put(REGISTRY_OWNER_KEY, runId);\n await txn.put(`${STREAM_REGISTRY_PREFIX}${name}`, true);\n });\n }\n\n async listStreams(): Promise<string[]> {\n if ((await this.ctx.storage.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error('Workflow run streams have expired');\n }\n const entries = await this.ctx.storage.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX });\n return Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length));\n }\n\n /** Fence a run's registry before any stream cells are removed. */\n async expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult> {\n const limit = boundedLimit(options?.limit, 16, 128);\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n await txn.put({\n [REGISTRY_OWNER_KEY]: runId,\n [REGISTRY_EXPIRED_KEY]: expiry ?? { expiredAt, deleted: 0 },\n });\n const entries = await txn.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX, limit });\n return {\n streams: Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length)),\n };\n });\n }\n\n /** Remove completed registry entries in a bounded, retry-safe batch. */\n async finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n if (owner !== runId || expiry === undefined) {\n throw new Error(`Stream registry for workflow run \"${runId}\" is not expired`);\n }\n const keys = Array.from(new Set(streams.map((name) => `${STREAM_REGISTRY_PREFIX}${name}`)));\n const removed = keys.length === 0 ? 0 : await txn.delete(keys);\n const deleted = expiry.deleted + removed;\n await txn.put<RegistryExpiry>(REGISTRY_EXPIRED_KEY, { ...expiry, deleted });\n const remaining = await txn.list({ prefix: STREAM_REGISTRY_PREFIX, limit: 1 });\n return { deleted, done: remaining.size === 0 };\n });\n }\n\n /**\n * Fence the stream and delete one bounded page. Listing size keys avoids\n * loading payloads, and the transaction makes a crash retry resume safely.\n */\n async expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult> {\n const limit = boundedLimit(options?.limit, DEFAULT_EXPIRE_CHUNK_LIMIT, MAX_EXPIRE_CHUNK_LIMIT);\n const byteLimit = boundedLimit(\n options?.byteLimit,\n DEFAULT_EXPIRE_BYTE_LIMIT,\n MAX_EXPIRE_BYTE_LIMIT,\n );\n return await this.runMutation(async () => {\n const result = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n const firstFence = meta.state !== 'expired';\n\n const candidates = await txn.list<number>({\n prefix: CHUNK_SIZE_KEY_PREFIX,\n limit: limit + 1,\n });\n const page: Array<{ index: number; size: number }> = [];\n let bytes = 0;\n for (const [key, storedSize] of Array.from(candidates).slice(0, limit)) {\n const index = indexFromChunkSizeKey(key);\n const size = validateChunkSize(storedSize, index);\n if (page.length > 0 && bytes + size > byteLimit) break;\n page.push({ index, size });\n bytes += size;\n }\n\n let payloadFallback = false;\n if (candidates.size === 0) {\n const payloads = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n const first = payloads.entries().next().value;\n if (first) {\n const [key, payload] = first;\n page.push({\n index: indexFromChunkKey(key),\n size: payload instanceof Uint8Array ? payload.byteLength : 0,\n });\n bytes = page[0].size;\n payloadFallback = true;\n }\n }\n\n const keys = page.flatMap(({ index }) => [chunkKey(index), chunkSizeKey(index)]);\n for (let offset = 0; offset < keys.length; offset += DELETE_BATCH_KEYS) {\n await txn.delete(keys.slice(offset, offset + DELETE_BATCH_KEYS));\n }\n let done = candidates.size === page.length;\n if (payloadFallback) {\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n } else if (done && candidates.size > 0) {\n // A corrupt/missing size index can otherwise make cleanup report\n // completion while leaving an orphan payload. Verify once after the\n // final staged size-index page; healthy pages return an empty list.\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n }\n if (done && page.length === 0 && meta.state === 'expired' && meta.payloadDeleted) {\n return {\n meta,\n result: { deleted: false, chunks: 0, bytes: 0, done: true },\n };\n }\n const nextMeta: StreamMeta = {\n ...meta,\n count: done ? 0 : meta.count,\n ownerRunId: runId,\n state: 'expired',\n error: undefined,\n expiredAt: meta.expiredAt ?? expiredAt,\n expiredChunkCount: meta.expiredChunkCount ?? meta.count,\n payloadDeleted: done,\n };\n await txn.put(META_KEY, nextMeta);\n return {\n meta: nextMeta,\n result: {\n deleted: firstFence,\n chunks: page.length,\n bytes,\n done,\n } satisfies ExpireStreamResult,\n };\n });\n\n this.meta = result.meta;\n this.metaLoad = Promise.resolve(result.meta);\n this.wakeReaders();\n return result.result;\n });\n }\n}\n","import { DurableObject } from '../do-base.js';\nimport {\n createWorkflowIndex,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n type WorkflowIndex,\n} from '../../indexes.js';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { isTerminalWorkflowRunStatus, slotToEventId, WorkflowRunSchema } from '@workflow/world';\nimport {\n applyEvent,\n finalizeEventPage,\n hookClaimCancellationKey,\n type ApplyEventOutcome,\n type ApplyEventRequest,\n EVENT_KEY_PREFIX,\n type EventStore,\n HOOK_CREATED_KEY_PREFIX,\n HOOK_KEY_PREFIX,\n listByCreationTime,\n listByPrefix,\n parseApplyEventRequest,\n STEP_CREATED_KEY_PREFIX,\n STEP_KEY_PREFIX,\n WAIT_KEY_PREFIX,\n} from '../../apply-event.js';\nimport {\n CLEANUP_RECORD_KEY,\n type CleanupRecord,\n cleanupFromTombstone,\n cleanupTombstone,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n type ExpireRunStreamsResult,\n type ExpireStreamResult,\n type FinalizeRunStreamsResult,\n expiredRead,\n HOOK_MARKER_PREFIX,\n type HookIndexReference,\n hookMarkerKey,\n type RunReadOutcome,\n type RunLifecycleStatus,\n type RunTombstone,\n type ScheduleCleanupRequest,\n TERMINAL_CLEANUP_KEY,\n type TerminalCleanupRecord,\n TOMBSTONE_KEY,\n} from '../../retention.js';\nimport { MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS } from '../../lifecycle.js';\nimport { isNonNegativeSafeInteger, isPositiveSafeInteger, isRecord } from '../../validation.js';\nimport {\n QUEUE_PAYLOAD_REGISTRY_PREFIX,\n queuePayloadRegistryKey,\n type QueuePayloadOrphan,\n type QueuePayloadRegistration,\n} from '../../queue-protocol.js';\nimport {\n deleteQueuePayloadObjects,\n type QueuePayloadObjectStorageBinding,\n} from '../queue-payload-store.js';\n\ninterface CellId {\n toString(): string;\n}\n\ninterface CellNamespace<T> {\n idFromName(name: string): CellId;\n get(id: CellId): T;\n}\n\ninterface StreamCleanupStub {\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\ninterface WorkflowRunDOEnv {\n WORKFLOW_DB?: CellNamespace<{ unregisterQueuePayload(messageId: string): Promise<void> }>;\n WORKFLOW_RUN_CATALOG?: CellNamespace<RunCatalogShardStub>;\n WORKFLOW_HOOK_TOKENS?: CellNamespace<HookTokenShardStub>;\n WORKFLOW_HOOK_IDS?: CellNamespace<HookIdShardStub>;\n WORKFLOW_STREAMS?: CellNamespace<StreamCleanupStub>;\n WORKFLOW_QUEUE_PAYLOADS?: Pick<QueuePayloadObjectStorageBinding, 'delete'>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\nconst EVENT_SEQUENCE_KEY = 'event_sequence';\nconst STORAGE_BATCH_SIZE = 128;\nconst PAYLOAD_DELETE_BATCH = STORAGE_BATCH_SIZE;\nconst HOOK_MARKER_PAGE_SIZE = 64;\nconst TERMINAL_HOOK_PAGE_SIZE = 64;\nconst TERMINAL_WAIT_PAGE_SIZE = STORAGE_BATCH_SIZE;\nconst STREAMS_PER_CLEANUP_PAGE = 16;\n/** StreamDO deletes a page in 128-key calls within one transaction. */\nconst STREAM_CHUNKS_PER_CLEANUP_PAGE = 256;\nconst STREAM_BYTES_PER_CLEANUP_PAGE = 16 * 1024 * 1024;\nconst QUEUE_PAYLOADS_PER_CLEANUP_PAGE = STORAGE_BATCH_SIZE;\nconst CLEANUP_RETRY_MAX_MS = 60 * 60 * 1000;\nconst MAX_DATE_MS = 8_640_000_000_000_000;\nconst QUEUE_ORPHAN_KEY = 'queue-orphan';\nconst QUEUE_RESERVATION_KEY = 'queue-reservation';\ntype TerminalRun = Extract<WorkflowRun, { status: 'completed' | 'failed' | 'cancelled' }>;\n\nfunction validateCleanupRequest(request: unknown, allowDisabled: boolean): ScheduleCleanupRequest {\n if (!isRecord(request)) {\n throw new Error('world-celld retention request must be an object');\n }\n const validRetention = allowDisabled\n ? isNonNegativeSafeInteger(request.retentionMs)\n : isPositiveSafeInteger(request.retentionMs);\n if (!validRetention) {\n throw new Error(\n `world-celld retentionMs must be a ${allowDisabled ? 'non-negative' : 'positive'} safe integer`,\n );\n }\n return request as unknown as ScheduleCleanupRequest;\n}\n\nfunction retentionDeadline(baseMs: number, retentionMs: number, runId: string): number {\n const dueAtMs = baseMs + retentionMs;\n if (!Number.isSafeInteger(dueAtMs) || dueAtMs > MAX_DATE_MS) {\n throw new Error(`world-celld retention deadline is out of range for ${runId}`);\n }\n return dueAtMs;\n}\n\nfunction cleanupRecord(\n run: WorkflowRun,\n dueAt: Date,\n reason: NonNullable<CleanupRecord['reason']>,\n): CleanupRecord {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n return {\n version: 1,\n runId: run.runId,\n workflowName: run.workflowName,\n createdAt: run.createdAt,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason,\n dueAt,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueuePayloads: 0,\n };\n}\n\n/**\n * Adapt DO storage (or a transaction) to the {@link EventStore} interface\n * shared with the test mocks. No casts: the methods line up structurally,\n * this just pins the subset we rely on.\n */\nfunction storeFrom(storage: DurableObjectStorage | DurableObjectTransaction): EventStore {\n return {\n get: (key) => storage.get(key),\n getMany: (keys) => storage.get(keys),\n put: (key, value) => storage.put(key, value),\n delete: (key) => storage.delete(key),\n deleteMany: (keys) => storage.delete(keys),\n list: (options) => storage.list(options),\n deferTerminalCleanup: true,\n };\n}\n\nfunction hookCreationIndexKey(hook: Hook): string {\n return `${HOOK_CREATED_KEY_PREFIX}${hook.createdAt.toISOString()}:${hook.hookId}`;\n}\n\nasync function putStorageEntries(\n storage: DurableObjectTransaction,\n entries: Iterable<readonly [string, unknown]>,\n): Promise<void> {\n const all = Array.from(entries);\n for (let offset = 0; offset < all.length; offset += STORAGE_BATCH_SIZE) {\n await storage.put(Object.fromEntries(all.slice(offset, offset + STORAGE_BATCH_SIZE)));\n }\n}\n\ninterface InflightClaim {\n messageId: string;\n expiresAt: number;\n retryAt?: number;\n}\n\ntype QueueMessageReservation = InflightClaim;\n\ninterface QueuePayloadOrphanState extends QueuePayloadOrphan {\n generation: number;\n deleting: boolean;\n}\n\n/**\n * Durable Object for managing a single workflow run's state.\n *\n * All event-sourced writes go through {@link applyEvent} inside a single\n * storage transaction: guard checks, the event append, and the entity\n * mutation are atomic even if the DO is evicted mid-operation.\n *\n * Instances named `claim:<queueName>:<idempotencyKey>` reserve one message ID\n * at publication time and serialize its deliveries until completion.\n */\nexport class WorkflowRunDO extends DurableObject {\n private now(): number {\n const clock = (this.env as WorkflowRunDOEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n private tombstoneFrom(\n values: Map<string, RunTombstone | CleanupRecord>,\n now = this.now(),\n ): RunTombstone | null {\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) return tombstone;\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (!cleanup || (cleanup.phase === 'retained' && cleanup.dueAt.getTime() > now)) return null;\n return cleanupTombstone(cleanup, cleanup.tombstonedAt ?? cleanup.dueAt);\n }\n\n private async retentionState(\n storage: DurableObjectStorage | DurableObjectTransaction,\n now = this.now(),\n options?: { withEventSequence?: boolean },\n ): Promise<{ cleanup?: CleanupRecord; tombstone: RunTombstone | null; eventSequence: number }> {\n const keys = [TOMBSTONE_KEY, CLEANUP_RECORD_KEY];\n if (options?.withEventSequence) keys.push(EVENT_SEQUENCE_KEY);\n const values = await storage.get<RunTombstone | CleanupRecord | number>(keys);\n return {\n cleanup: values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined,\n tombstone: this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>, now),\n eventSequence: (values.get(EVENT_SEQUENCE_KEY) as number | undefined) ?? 0,\n };\n }\n\n private async read<T>(\n reader: (storage: DurableObjectTransaction) => Promise<T>,\n ): Promise<RunReadOutcome<T>> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) return expiredRead(tombstone);\n return { ok: true, value: await reader(txn) };\n });\n }\n\n private async readKey<T>(key: string): Promise<RunReadOutcome<T | null>> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | T>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n key,\n ]);\n const tombstone = this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>);\n if (tombstone) return expiredRead<T | null>(tombstone);\n return { ok: true, value: (values.get(key) as T | undefined) ?? null };\n });\n }\n\n /** Apply an event and capture all retention metadata in the same transaction. */\n async applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome> {\n request = parseApplyEventRequest(request);\n if (this.ctx.id.name !== undefined && request.runId !== this.ctx.id.name) {\n throw new TypeError(\n `applyEvent runId \"${request.runId}\" does not match durable object \"${this.ctx.id.name}\"`,\n );\n }\n if (request.cleanup !== undefined) validateCleanupRequest(request.cleanup, true);\n return await this.ctx.storage.transaction(async (txn) => {\n const now = new Date(this.now());\n const retention = await this.retentionState(txn, now.getTime(), { withEventSequence: true });\n const { tombstone } = retention;\n if (tombstone) {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${request.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n\n const storedSequence = retention.eventSequence;\n let eventSequence = storedSequence;\n const outcome = await applyEvent(storeFrom(txn), {\n ...request,\n nextEventId: () => slotToEventId(++eventSequence),\n now,\n });\n if (!outcome.ok) return outcome;\n\n // An idempotent replay appends nothing; leaving the sequence untouched\n // keeps its transaction read-only, so it skips the durable commit.\n if (eventSequence !== storedSequence) await txn.put(EVENT_SEQUENCE_KEY, eventSequence);\n const hookReferences: HookIndexReference[] = outcome.hookToIndex\n ? [\n {\n hookId: outcome.hookToIndex.hookId,\n token: outcome.hookToIndex.token,\n },\n ...outcome.releasedHooks,\n ]\n : outcome.releasedHooks;\n await putStorageEntries(\n txn,\n hookReferences.map((reference) => [hookMarkerKey(reference), reference] as const),\n );\n\n const retentionMs = request.cleanup?.retentionMs ?? 0;\n if (\n retentionMs > 0 &&\n outcome.run &&\n isTerminalWorkflowRunStatus(outcome.run.status) &&\n !retention.cleanup\n ) {\n const terminalRun = outcome.run as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(terminalRun.completedAt.getTime(), retentionMs, terminalRun.runId),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, 'terminal-retention');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(dueAt);\n outcome.run = run;\n }\n if (outcome.run && isTerminalWorkflowRunStatus(outcome.run.status)) {\n const terminalCleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (!terminalCleanup) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n version: 1,\n runId: outcome.run.runId,\n phase: 'hooks',\n generation: 0,\n attempts: 0,\n });\n }\n await txn.setAlarm(this.now() + 1);\n }\n if (outcome.run) {\n outcome.indexPublicationExpiresAt = now.getTime() + MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS;\n }\n return finalizeEventPage(storeFrom(txn), outcome, request.params);\n });\n }\n\n /**\n * Resolve an ambiguous hook-creation RPC in the same serialization domain as\n * applyEvent. If the hook is absent, the exact reservation is durably fenced\n * before the caller releases its token and hook-ID claims.\n */\n async resolveHookTokenClaim(request: {\n hookId: string;\n token: string;\n claimId: string;\n }): Promise<{ committed: boolean }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n // Once the authoritative expiry record exists (including the logical\n // tombstone at dueAt), a lost-response resolver must not recreate\n // unbounded per-claim state next to the tombstone.\n if (tombstone) return { committed: false };\n const hook = await txn.get<Hook>(`${HOOK_KEY_PREFIX}${request.hookId}`);\n if (hook?.token === request.token) return { committed: true };\n await txn.put(hookClaimCancellationKey(request.claimId), {\n hookId: request.hookId,\n token: request.token,\n canceledAt: this.now(),\n });\n return { committed: false };\n });\n }\n\n async getRun(): Promise<RunReadOutcome<WorkflowRun | null>> {\n return this.readKey<WorkflowRun>('run');\n }\n\n /** Single authoritative lifecycle answer used after derivative compaction. */\n async getLifecycleStatus(): Promise<RunLifecycleStatus> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | WorkflowRun>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n 'run',\n ]);\n if (this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>)) {\n return 'expired';\n }\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return 'missing';\n return isTerminalWorkflowRunStatus(run.status) ? 'terminal' : 'active';\n });\n }\n\n async getStep(stepId: string): Promise<RunReadOutcome<Step | null>> {\n return this.readKey<Step>(`${STEP_KEY_PREFIX}${stepId}`);\n }\n\n async listSteps(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Step[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Step>(storeFrom(txn), STEP_CREATED_KEY_PREFIX, STEP_KEY_PREFIX, {\n limit: params?.limit ?? 20,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getEvent(eventId: string): Promise<RunReadOutcome<Event | null>> {\n return this.readKey<Event>(`${EVENT_KEY_PREFIX}${eventId}`);\n }\n\n async listEvents(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Event[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByPrefix<Event>(\n storeFrom(txn),\n EVENT_KEY_PREFIX,\n {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n },\n (event) => event.eventId,\n ),\n );\n }\n\n async listHooks(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Hook[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Hook>(storeFrom(txn), HOOK_CREATED_KEY_PREFIX, HOOK_KEY_PREFIX, {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getCleanupStatus(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | RunTombstone>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (cleanup) return cleanup;\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n return tombstone ? cleanupFromTombstone(tombstone) : null;\n }\n\n /** Explicitly schedule an existing terminal run, used for opt-in backfills. */\n async scheduleCleanup(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<\n CleanupRecord | RunTombstone | TerminalCleanupRecord | WorkflowRun\n >([CLEANUP_RECORD_KEY, TOMBSTONE_KEY, TERMINAL_CLEANUP_KEY, 'run']);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (existing) return existing;\n if (values.get(TOMBSTONE_KEY)) return null;\n const current = values.get('run') as WorkflowRun | undefined;\n if (!current || !isTerminalWorkflowRunStatus(current.status)) return null;\n const terminalRun = current as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(\n terminalRun.completedAt.getTime(),\n request.retentionMs,\n terminalRun.runId,\n ),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, 'manual');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(\n values.get(TERMINAL_CLEANUP_KEY) || dueAt.getTime() <= this.now() ? this.now() + 1 : dueAt,\n );\n return cleanup;\n });\n }\n\n /**\n * Apply the fleet-wide maximum-age policy to one authoritative run.\n *\n * The catalog is only a discovery index: eligibility is rechecked from the\n * RunDO's own createdAt. Once eligible, the cleanup deadline immediately\n * becomes an authoritative write/read fence, including for active runs.\n */\n async enforceRetention(request: EnforceRetentionRequest): Promise<EnforceRetentionResult> {\n validateCleanupRequest(request, false);\n if (!Number.isSafeInteger(request.scheduledTime) || request.scheduledTime < 0) {\n throw new Error('world-celld retention scheduledTime must be a non-negative safe integer');\n }\n\n const result = await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<CleanupRecord | RunTombstone | WorkflowRun>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n 'run',\n ]);\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) {\n return {\n state: 'expired',\n cleanup: cleanupFromTombstone(tombstone),\n } satisfies EnforceRetentionResult;\n }\n\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return { state: 'missing', cleanup: null } satisfies EnforceRetentionResult;\n const dueAtMs = retentionDeadline(run.createdAt.getTime(), request.retentionMs, run.runId);\n if (dueAtMs > request.scheduledTime) {\n return { state: 'not-due', cleanup: null } satisfies EnforceRetentionResult;\n }\n\n const dueAt = new Date(dueAtMs);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n let cleanup = existing;\n if (!cleanup) {\n cleanup = cleanupRecord(run, dueAt, 'maximum-age');\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n } else if (cleanup.phase === 'retained' && dueAtMs < cleanup.dueAt.getTime()) {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n cleanup = {\n ...cleanup,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason: 'maximum-age',\n dueAt,\n generation: cleanup.generation + 1,\n };\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n }\n await txn.setAlarm(this.now() + 1);\n return {\n state: cleanup.dueAt.getTime() <= this.now() ? 'expired' : 'scheduled',\n cleanup,\n } satisfies EnforceRetentionResult;\n });\n\n // Remove the discovery index before returning when possible. The\n // remaining stream/queue/payload pages continue through the run's alarm.\n if (result.state === 'scheduled' || result.state === 'expired') {\n for (let page = 0; page < 2; page++) {\n const cleanup = await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (cleanup?.phase !== 'retained' && cleanup?.phase !== 'index') break;\n await this.executeScheduledCleanupPage();\n }\n return {\n ...result,\n cleanup: (await this.getCleanupStatus()) ?? result.cleanup,\n };\n }\n return result;\n }\n\n async cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n if (!(await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY))) {\n await this.scheduleCleanup(request);\n }\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase === 'tombstoned') return;\n const dueAt = new Date(this.now());\n const run = await txn.get<WorkflowRun>('run');\n if (run) await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n dueAt,\n generation: cleanup.generation + 1,\n });\n await txn.setAlarm(this.now() + 1);\n });\n await this.executeScheduledCleanupPage();\n return this.getCleanupStatus();\n }\n\n async rearmCleanup(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | TerminalCleanupRecord>([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n if (terminalCleanup) {\n await this.ctx.storage.setAlarm(this.now() + 1);\n } else if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n } else {\n await this.ctx.storage.setAlarm(Math.max(this.now() + 1, cleanup.dueAt.getTime()));\n }\n return cleanup ?? null;\n }\n\n async alarm(): Promise<void> {\n await this.executeScheduledCleanupPage();\n }\n\n private namespace<T>(name: keyof WorkflowRunDOEnv): CellNamespace<T> {\n const namespace = (this.env as WorkflowRunDOEnv)?.[name];\n if (!namespace || typeof namespace === 'function') {\n throw new Error(`world-celld retention missing binding ${name}`);\n }\n return namespace as CellNamespace<T>;\n }\n\n private workflowIndex(): WorkflowIndex {\n return createWorkflowIndex({\n runCatalog: this.namespace<RunCatalogShardStub>('WORKFLOW_RUN_CATALOG'),\n hookTokens: this.namespace<HookTokenShardStub>('WORKFLOW_HOOK_TOKENS'),\n hookIds: this.namespace<HookIdShardStub>('WORKFLOW_HOOK_IDS'),\n });\n }\n\n private async setCleanupPhase(\n expected: CleanupRecord,\n next: CleanupRecord['phase'],\n updates: Partial<CleanupRecord> = {},\n continueAt?: number,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n ...updates,\n phase: next,\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n if (continueAt !== undefined) await txn.setAlarm(continueAt);\n });\n }\n\n private async executeScheduledCleanupPage(): Promise<void> {\n const values = await this.ctx.storage.get<\n CleanupRecord | TerminalCleanupRecord | InflightClaim | QueuePayloadOrphanState | WorkflowRun\n >([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n 'claim',\n QUEUE_RESERVATION_KEY,\n QUEUE_ORPHAN_KEY,\n 'run',\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n const claim = values.get('claim') as InflightClaim | undefined;\n const reservation = values.get(QUEUE_RESERVATION_KEY) as QueueMessageReservation | undefined;\n const queueOrphan = values.get(QUEUE_ORPHAN_KEY) as QueuePayloadOrphanState | undefined;\n\n if (queueOrphan) {\n const leased = await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (!current) return null;\n if (current.expiresAt > this.now()) {\n await txn.setAlarm(current.expiresAt);\n return null;\n }\n if (current.deleting) return current;\n const next: QueuePayloadOrphanState = {\n ...current,\n generation: current.generation + 1,\n deleting: true,\n };\n await txn.put(QUEUE_ORPHAN_KEY, next);\n return next;\n });\n if (!leased) return;\n const bucket = (this.env as WorkflowRunDOEnv)?.WORKFLOW_QUEUE_PAYLOADS;\n const runs = (this.env as WorkflowRunDOEnv)?.WORKFLOW_DB;\n if (!bucket || !runs) {\n throw new Error('world-celld queue orphan cleanup is missing required bindings');\n }\n await deleteQueuePayloadObjects(bucket, leased.key);\n const run = runs.get(runs.idFromName(leased.runId));\n await run.unregisterQueuePayload(leased.messageId);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (\n current?.messageId !== leased.messageId ||\n current.generation !== leased.generation ||\n !current.deleting\n ) {\n return;\n }\n await txn.delete(QUEUE_ORPHAN_KEY);\n await txn.deleteAlarm();\n });\n return;\n }\n\n if (claim || reservation) {\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n let nextClaim = current.get('claim');\n let nextReservation = current.get(QUEUE_RESERVATION_KEY);\n const now = this.now();\n if (nextClaim && nextClaim.expiresAt <= now) {\n await txn.delete('claim');\n nextClaim = undefined;\n }\n if (nextReservation && nextReservation.expiresAt <= now) {\n await txn.delete(QUEUE_RESERVATION_KEY);\n nextReservation = undefined;\n }\n const nextAlarm = Math.min(\n nextClaim?.expiresAt ?? Number.POSITIVE_INFINITY,\n nextReservation?.expiresAt ?? Number.POSITIVE_INFINITY,\n );\n if (Number.isFinite(nextAlarm)) await txn.setAlarm(nextAlarm);\n else await txn.deleteAlarm();\n });\n return;\n }\n\n // Once retention is due it is the lifecycle authority. Do not make an\n // expired run wait behind terminal hook/wait disposal; payload cleanup\n // removes that derivative state later in the same bounded state machine.\n if (cleanup && cleanup.phase !== 'tombstoned' && cleanup.dueAt.getTime() <= this.now()) {\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n return;\n }\n\n if (terminalCleanup) {\n try {\n await this.executeTerminalCleanup(terminalCleanup);\n } catch (error) {\n await this.recordTerminalCleanupFailure(error, terminalCleanup);\n }\n return;\n }\n\n if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n return;\n }\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n }\n\n private async executeCleanup(cleanup: CleanupRecord): Promise<void> {\n if (cleanup.phase === 'retained') {\n if (cleanup.dueAt.getTime() > this.now()) {\n await this.ctx.storage.setAlarm(cleanup.dueAt);\n return;\n }\n await this.setCleanupPhase(cleanup, 'index', {}, this.now() + 1);\n return;\n }\n\n if (cleanup.phase === 'index') {\n await this.deleteIndexPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'streams') {\n await this.deleteStreamPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'queues') {\n await this.deleteQueuePage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'payload') {\n await this.deletePayloadBatch();\n }\n }\n\n private async executeTerminalCleanup(cleanup: TerminalCleanupRecord): Promise<void> {\n if (cleanup.phase === 'hooks' && (await this.completeSmallTerminalCleanup(cleanup))) return;\n if (cleanup.phase === 'hooks') {\n await this.deleteTerminalHookPage(cleanup);\n } else if (cleanup.phase === 'markers') {\n await this.deleteTerminalHookMarkerPage(cleanup);\n } else {\n await this.deleteTerminalWaitPage(cleanup);\n }\n }\n\n /**\n * Most runs end with a handful of hooks and waits. When every terminal\n * phase fits in one page, release the hook indexes once and delete hooks,\n * markers, and waits in a single transaction instead of one alarm and one\n * transaction per phase. Returns false, having changed nothing locally, when\n * any phase needs paging; the paged phases then run as before.\n */\n private async completeSmallTerminalCleanup(cleanup: TerminalCleanupRecord): Promise<boolean> {\n const [hookEntries, markerEntries] = await Promise.all([\n this.ctx.storage.list<Hook>({ prefix: HOOK_KEY_PREFIX, limit: TERMINAL_HOOK_PAGE_SIZE + 1 }),\n this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n }),\n ]);\n if (hookEntries.size > TERMINAL_HOOK_PAGE_SIZE || markerEntries.size > HOOK_MARKER_PAGE_SIZE) {\n return false;\n }\n const hooks = Array.from(hookEntries.values());\n const references = new Map<string, HookIndexReference>();\n for (const reference of [\n ...hooks.map((hook) => ({ hookId: hook.hookId, token: hook.token })),\n ...markerEntries.values(),\n ]) {\n references.set(`${reference.hookId}\\u0000${reference.token}`, reference);\n }\n if (references.size > 0) {\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: Array.from(references.values()),\n });\n }\n\n return await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n // Another pass owns the record now; there is nothing left to do here.\n return true;\n }\n const waits = await txn.list({ prefix: WAIT_KEY_PREFIX, limit: TERMINAL_WAIT_PAGE_SIZE + 1 });\n if (waits.size > TERMINAL_WAIT_PAGE_SIZE) return false;\n const keys = [\n ...hooks.flatMap((hook) => [\n `${HOOK_KEY_PREFIX}${hook.hookId}`,\n hookCreationIndexKey(hook),\n ]),\n ...markerEntries.keys(),\n ...waits.keys(),\n ];\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n await txn.delete(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n await txn.delete(TERMINAL_CLEANUP_KEY);\n const retention = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (retention && retention.phase !== 'tombstoned') {\n await txn.setAlarm(Math.max(this.now() + 1, retention.dueAt.getTime()));\n } else {\n await txn.deleteAlarm();\n }\n return true;\n });\n }\n\n private async deleteTerminalHookPage(cleanup: TerminalCleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<Hook>({\n prefix: HOOK_KEY_PREFIX,\n limit: TERMINAL_HOOK_PAGE_SIZE + 1,\n });\n const page = Array.from(entries.values()).slice(0, TERMINAL_HOOK_PAGE_SIZE);\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: page.map((hook) => ({ hookId: hook.hookId, token: hook.token })),\n });\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const keys = page.flatMap((hook) => [\n `${HOOK_KEY_PREFIX}${hook.hookId}`,\n hookCreationIndexKey(hook),\n ]);\n if (keys.length > 0) await txn.delete(keys);\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n phase: entries.size <= TERMINAL_HOOK_PAGE_SIZE ? 'markers' : 'hooks',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteTerminalHookMarkerPage(cleanup: TerminalCleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n });\n const page = Array.from(entries).slice(0, HOOK_MARKER_PAGE_SIZE);\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: page.map(([, reference]) => reference),\n });\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const keys = page.map(([key]) => key);\n if (keys.length > 0) await txn.delete(keys);\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n phase: entries.size <= HOOK_MARKER_PAGE_SIZE ? 'waits' : 'markers',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteTerminalWaitPage(cleanup: TerminalCleanupRecord): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const entries = await txn.list({\n prefix: WAIT_KEY_PREFIX,\n limit: TERMINAL_WAIT_PAGE_SIZE + 1,\n });\n const keys = Array.from(entries.keys()).slice(0, TERMINAL_WAIT_PAGE_SIZE);\n if (keys.length > 0) await txn.delete(keys);\n\n if (entries.size > TERMINAL_WAIT_PAGE_SIZE) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n return;\n }\n\n await txn.delete(TERMINAL_CLEANUP_KEY);\n const retention = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (retention && retention.phase !== 'tombstoned') {\n await txn.setAlarm(Math.max(this.now() + 1, retention.dueAt.getTime()));\n } else {\n await txn.deleteAlarm();\n }\n });\n }\n\n private async deleteIndexPage(cleanup: CleanupRecord): Promise<void> {\n const hookEntries = await this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n });\n const hookMarkers = Array.from(hookEntries).slice(0, HOOK_MARKER_PAGE_SIZE);\n await this.workflowIndex().expireRun({\n runId: cleanup.runId,\n hooks: hookMarkers.map(([, value]) => value),\n expiredAt: cleanup.dueAt.getTime(),\n });\n const markerKeys = hookMarkers.map(([key]) => key);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'index' || current.generation !== cleanup.generation) return;\n if (markerKeys.length > 0) await txn.delete(markerKeys);\n if (hookEntries.size <= HOOK_MARKER_PAGE_SIZE) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n phase: 'streams',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n } else {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n }\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteStreamPage(cleanup: CleanupRecord): Promise<void> {\n const streamsNamespace = this.namespace<StreamCleanupStub>('WORKFLOW_STREAMS');\n const registry = streamsNamespace.get(\n streamsNamespace.idFromName(`run-streams:${cleanup.runId}`),\n );\n const { streams } = await registry.expireRegistry(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: STREAMS_PER_CLEANUP_PAGE,\n });\n const completed: string[] = [];\n let remainingChunks = STREAM_CHUNKS_PER_CLEANUP_PAGE;\n let remainingBytes = STREAM_BYTES_PER_CLEANUP_PAGE;\n for (const name of streams) {\n if (remainingChunks <= 0 || remainingBytes <= 0) break;\n const stream = streamsNamespace.get(streamsNamespace.idFromName(`stream:${name}`));\n const result = await stream.expireStream(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: remainingChunks,\n byteLimit: remainingBytes,\n });\n remainingChunks -= result.chunks;\n remainingBytes -= result.bytes;\n if (result.done) completed.push(name);\n }\n const registryResult = await registry.finalizeRegistry(cleanup.runId, completed);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'streams' || current.generation !== cleanup.generation) return;\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedStreams: registryResult.deleted,\n phase: registryResult.done ? 'queues' : 'streams',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteQueuePage(cleanup: CleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<QueuePayloadRegistration>({\n prefix: QUEUE_PAYLOAD_REGISTRY_PREFIX,\n limit: QUEUE_PAYLOADS_PER_CLEANUP_PAGE + 1,\n });\n const page = Array.from(entries).slice(0, QUEUE_PAYLOADS_PER_CLEANUP_PAGE);\n const bucket = (this.env as WorkflowRunDOEnv)?.WORKFLOW_QUEUE_PAYLOADS;\n if (!bucket) {\n throw new Error('world-celld retention missing binding WORKFLOW_QUEUE_PAYLOADS');\n }\n if (page.length > 0) {\n await deleteQueuePayloadObjects(\n bucket,\n page.map(([, registration]) => registration.key),\n );\n }\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'queues' || current.generation !== cleanup.generation) return;\n if (page.length > 0) await txn.delete(page.map(([key]) => key));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedQueuePayloads: current.deletedQueuePayloads + page.length,\n phase: entries.size <= QUEUE_PAYLOADS_PER_CLEANUP_PAGE ? 'payload' : 'queues',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deletePayloadBatch(): Promise<boolean> {\n return await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase !== 'payload') return true;\n const entries = await txn.list({ limit: PAYLOAD_DELETE_BATCH + 3, noCache: true });\n const keys = Array.from(entries.keys())\n .filter((key) => key !== CLEANUP_RECORD_KEY && key !== TOMBSTONE_KEY)\n .slice(0, PAYLOAD_DELETE_BATCH);\n const now = new Date(this.now());\n await txn.put(TOMBSTONE_KEY, cleanupTombstone(cleanup, now));\n if (keys.length > 0) await txn.delete(keys);\n\n if (keys.length > 0) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n deletedPayloadKeys: cleanup.deletedPayloadKeys + keys.length,\n generation: cleanup.generation + 1,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n return false;\n }\n\n const completed: CleanupRecord = {\n ...cleanup,\n phase: 'tombstoned',\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n tombstonedAt: now,\n };\n await txn.put(TOMBSTONE_KEY, cleanupTombstone(completed, now));\n await txn.delete(CLEANUP_RECORD_KEY);\n await txn.deleteAlarm();\n return true;\n });\n }\n\n private async recordCleanupFailure(error: unknown, expected: CleanupRecord): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation ||\n cleanup.phase === 'tombstoned'\n ) {\n return;\n }\n const attempts = cleanup.attempts + 1;\n const delay = Math.min(CLEANUP_RETRY_MAX_MS, 1000 * 2 ** Math.min(attempts - 1, 12));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n generation: cleanup.generation + 1,\n attempts,\n lastError: error instanceof Error ? error.message : String(error),\n lastAttemptAt: new Date(this.now()),\n });\n await txn.setAlarm(this.now() + delay);\n });\n }\n\n private async recordTerminalCleanupFailure(\n error: unknown,\n expected: TerminalCleanupRecord,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n const attempts = cleanup.attempts + 1;\n const delay = Math.min(CLEANUP_RETRY_MAX_MS, 1000 * 2 ** Math.min(attempts - 1, 12));\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...cleanup,\n generation: cleanup.generation + 1,\n attempts,\n lastError: error instanceof Error ? error.message : String(error),\n lastAttemptAt: new Date(this.now()),\n });\n await txn.setAlarm(this.now() + delay);\n });\n }\n\n async registerQueuePayload(\n registration: QueuePayloadRegistration,\n ): Promise<{ ok: true } | { ok: false; message: string }> {\n if (\n !registration ||\n typeof registration.messageId !== 'string' ||\n registration.messageId.length === 0 ||\n typeof registration.key !== 'string' ||\n registration.key.length === 0 ||\n !isNonNegativeSafeInteger(registration.orphanExpiresAt)\n ) {\n throw new TypeError('world-celld queue payload registration is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n await txn.put(queuePayloadRegistryKey(registration.messageId), registration);\n return { ok: true };\n });\n }\n\n async finalizeQueuePayload(\n messageId: string,\n ): Promise<{ ok: true } | { ok: false; message: string }> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload messageId must be a non-empty string');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n const registration = await txn.get<QueuePayloadRegistration>(\n queuePayloadRegistryKey(messageId),\n );\n return registration\n ? { ok: true }\n : {\n ok: false,\n message: 'workflow queue payload registration was removed before publication',\n };\n });\n }\n\n async unregisterQueuePayload(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload messageId must be a non-empty string');\n }\n await this.ctx.storage.delete(queuePayloadRegistryKey(messageId));\n }\n\n async scheduleQueuePayloadOrphan(orphan: QueuePayloadOrphan): Promise<void> {\n if (\n !orphan ||\n typeof orphan.messageId !== 'string' ||\n orphan.messageId.length === 0 ||\n typeof orphan.runId !== 'string' ||\n orphan.runId.length === 0 ||\n typeof orphan.key !== 'string' ||\n orphan.key.length === 0 ||\n !isNonNegativeSafeInteger(orphan.expiresAt)\n ) {\n throw new TypeError('world-celld queue payload orphan is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (existing && existing.messageId !== orphan.messageId) {\n throw new Error('world-celld queue payload orphan identity mismatch');\n }\n if (existing?.deleting) {\n throw new Error('world-celld queue payload orphan deletion is in progress');\n }\n const next: QueuePayloadOrphanState = {\n ...orphan,\n expiresAt: Math.max(existing?.expiresAt ?? 0, orphan.expiresAt),\n generation: (existing?.generation ?? 0) + 1,\n deleting: false,\n };\n await txn.put<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY, next);\n await txn.setAlarm(next.expiresAt);\n });\n }\n\n async cancelQueuePayloadOrphan(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload orphan messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (!existing || existing.messageId !== messageId) return;\n await txn.delete(QUEUE_ORPHAN_KEY);\n await txn.deleteAlarm();\n });\n }\n\n async reserveQueueMessage(params: {\n messageId: string;\n expiresAt: number;\n }): Promise<{ admitted: boolean; messageId: string }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.expiresAt)\n ) {\n throw new TypeError('world-celld queue message reservation is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>([QUEUE_RESERVATION_KEY, 'claim']);\n const existing = values.get(QUEUE_RESERVATION_KEY);\n const claim = values.get('claim');\n const now = this.now();\n if (existing && existing.expiresAt > now && existing.messageId !== params.messageId) {\n await txn.setAlarm(Math.min(existing.expiresAt, claim?.expiresAt ?? existing.expiresAt));\n return { admitted: false, messageId: existing.messageId };\n }\n const reservation: QueueMessageReservation = {\n messageId: params.messageId,\n expiresAt: Math.max(existing?.expiresAt ?? 0, params.expiresAt),\n };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n await txn.setAlarm(\n Math.min(reservation.expiresAt, claim?.expiresAt ?? reservation.expiresAt),\n );\n return { admitted: true, messageId: params.messageId };\n });\n }\n\n async completeQueueMessage(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>([QUEUE_RESERVATION_KEY, 'claim']);\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n let claim = values.get('claim');\n if (reservation?.messageId === messageId) {\n await txn.delete(QUEUE_RESERVATION_KEY);\n reservation = undefined;\n }\n if (claim?.messageId === messageId) {\n await txn.delete('claim');\n claim = undefined;\n }\n const nextAlarm = Math.min(\n reservation?.expiresAt ?? Number.POSITIVE_INFINITY,\n claim?.expiresAt ?? Number.POSITIVE_INFINITY,\n );\n if (Number.isFinite(nextAlarm)) await txn.setAlarm(nextAlarm);\n else await txn.deleteAlarm();\n });\n }\n\n async claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean; retryAt?: number }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isPositiveSafeInteger(params.staleMs)\n ) {\n throw new TypeError('world-celld queue claim is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n const reservation = values.get(QUEUE_RESERVATION_KEY);\n const now = this.now();\n if (existing && existing.expiresAt > now) {\n if (existing.messageId !== params.messageId) return { claimed: false };\n if (existing.retryAt === undefined || existing.retryAt > now) {\n return { claimed: false, retryAt: existing.retryAt ?? existing.expiresAt };\n }\n }\n const expiresAt = now + params.staleMs;\n await txn.put<InflightClaim>('claim', { messageId: params.messageId, expiresAt });\n await txn.setAlarm(Math.min(expiresAt, reservation?.expiresAt ?? expiresAt));\n return { claimed: true };\n });\n }\n\n async holdInflight(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.retryAt) ||\n !isNonNegativeSafeInteger(params.expiresAt) ||\n (params.reservationExpiresAt !== undefined &&\n !isNonNegativeSafeInteger(params.reservationExpiresAt))\n ) {\n throw new TypeError('world-celld queue claim hold is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n if (!existing || existing.messageId !== params.messageId) return { held: false };\n const expiresAt = Math.max(existing.expiresAt, params.expiresAt);\n await txn.put<InflightClaim>('claim', { ...existing, retryAt: params.retryAt, expiresAt });\n if (\n reservation?.messageId === params.messageId &&\n params.reservationExpiresAt !== undefined &&\n params.reservationExpiresAt > reservation.expiresAt\n ) {\n reservation = { ...reservation, expiresAt: params.reservationExpiresAt };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n }\n await txn.setAlarm(Math.min(expiresAt, reservation?.expiresAt ?? expiresAt));\n return { held: true };\n });\n }\n\n async releaseInflight(messageId?: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n const reservation = values.get(QUEUE_RESERVATION_KEY);\n if (!existing || (messageId !== undefined && existing.messageId !== messageId)) return;\n await txn.delete('claim');\n if (reservation) await txn.setAlarm(reservation.expiresAt);\n else await txn.deleteAlarm();\n });\n }\n}\n","/**\n * celld worker entry: exports the Durable Object (cell) classes and the\n * default fetch router. This module (and everything it imports) must stay\n * free of Node built-ins — it runs inside celld's workerd runtime.\n */\n\nimport { WorkerEntrypoint } from './do-base.js';\nimport { deliverQueueMessage, type QueueDeliveryResult } from './queue-delivery.js';\nimport { createRouter, type WorkerEnv } from './router.js';\nimport { runRetentionSweep, type RetentionSweepEnv } from './retention-sweep.js';\nimport {\n createQueuePayloadStore,\n type QueuePayloadObjectStorageBinding,\n} from './queue-payload-store.js';\n\nexport { HookIdDO } from './durable-objects/HookIdDO.js';\nexport { HookTokenDO } from './durable-objects/HookTokenDO.js';\nexport { RunCatalogDO } from './durable-objects/RunCatalogDO.js';\nexport { StreamDO } from './durable-objects/StreamDO.js';\nexport { WorkflowRunDO } from './durable-objects/WorkflowRunDO.js';\nexport { createRouter, type WorkerEnv } from './router.js';\n\ninterface ScheduledControllerLike {\n scheduledTime: number;\n cron: string;\n}\n\ntype CelldWorkerEnv = Omit<WorkerEnv, 'WORKFLOW_QUEUE_PAYLOADS'> & {\n WORKFLOW_QUEUE_PAYLOADS?: QueuePayloadObjectStorageBinding;\n};\n\nasync function scheduled(controller: ScheduledControllerLike, env: CelldWorkerEnv): Promise<void> {\n const result = await runRetentionSweep(\n controller.scheduledTime,\n env as unknown as RetentionSweepEnv,\n );\n if (result.scanned > 0) {\n console.info('world-celld retention sweep', {\n cron: controller.cron,\n ...result,\n });\n }\n}\n\nexport default {\n async fetch(request: Request, env: CelldWorkerEnv): Promise<Response> {\n return createRouter({\n ...env,\n WORKFLOW_QUEUE_PAYLOADS: env.WORKFLOW_QUEUE_PAYLOADS\n ? createQueuePayloadStore(env.WORKFLOW_QUEUE_PAYLOADS)\n : undefined,\n })(request);\n },\n scheduled,\n};\n\n/** Only the companion consumer binds this internal delivery entrypoint. */\nexport class QueueDeliveryRpc extends WorkerEntrypoint<CelldWorkerEnv> {\n deliver(secret: unknown, envelope: unknown, attempt: unknown): Promise<QueueDeliveryResult> {\n return deliverQueueMessage(\n {\n ...this.env,\n WORKFLOW_QUEUE_PAYLOADS: this.env.WORKFLOW_QUEUE_PAYLOADS\n ? createQueuePayloadStore(this.env.WORKFLOW_QUEUE_PAYLOADS)\n : undefined,\n },\n secret,\n envelope,\n attempt,\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker.js","names":["STORAGE_BATCH_SIZE","sameOwner","isRecord","isRecord","MAX_RELEASE_BATCH","CLAIM_DEADLINE_PREFIX","pad","recordKey","claimKey","claimDeadlineKey","pad","isRecord"],"sources":["../src/worker/auth.ts","../src/worker/queue-claims.ts","../src/worker/queue-delivery.ts","../src/vendor/shared/serialization.ts","../src/vendor/shared/util.ts","../src/apply-event.ts","../src/codec.ts","../src/run-list.ts","../src/indexes.ts","../src/stream-protocol.ts","../src/worker/index-validation.ts","../src/worker/router.ts","../src/retention.ts","../src/worker/retention-sweep.ts","../src/worker/queue-payload-store.ts","../src/worker/durable-objects/hook-index-shared.ts","../src/worker/durable-objects/HookIdDO.ts","../src/worker/durable-objects/HookTokenDO.ts","../src/worker/durable-objects/RunCatalogDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"sourcesContent":["/**\n * Bearer-token auth for the worker router.\n *\n * Fails closed: when the WORLD_SECRET var is not configured, every protected\n * route returns 503 instead of forwarding unauthenticated traffic (the\n * eve-ambient celld-worker pattern).\n */\n\n/**\n * Constant-time string comparison via SHA-256 digests (digest-then-compare\n * is length-independent). crypto.subtle is global in both workerd and Node.\n */\nexport async function timingSafeEqual(a: string, b: string): Promise<boolean> {\n const enc = new TextEncoder();\n const [da, db] = await Promise.all([\n crypto.subtle.digest('SHA-256', enc.encode(a)),\n crypto.subtle.digest('SHA-256', enc.encode(b)),\n ]);\n const va = new Uint8Array(da);\n const vb = new Uint8Array(db);\n let diff = 0;\n for (let i = 0; i < va.length; i++) {\n diff |= va[i] ^ vb[i];\n }\n return diff === 0;\n}\n\nexport type AuthResult = { ok: true } | { ok: false; response: Response };\n\nexport async function authenticate(\n request: Request,\n secret: string | undefined,\n): Promise<AuthResult> {\n if (!secret) {\n return {\n ok: false,\n response: Response.json(\n { error: { name: 'WorldNotConfigured', message: 'WORLD_SECRET is not configured' } },\n { status: 503 },\n ),\n };\n }\n\n const header = request.headers.get('authorization') ?? '';\n const token = header.startsWith('Bearer ') ? header.slice('Bearer '.length) : '';\n if (!token || !(await timingSafeEqual(token, secret))) {\n return {\n ok: false,\n response: Response.json(\n { error: { name: 'Unauthorized', message: 'invalid or missing bearer token' } },\n { status: 401 },\n ),\n };\n }\n\n return { ok: true };\n}\n","/**\n * Idempotency claims for Queue messages. A claim lives either in its own\n * claim cell (named by queue and idempotency key) or, for run-bearing\n * messages whose envelope says so, as an entry in the run's own cell.\n */\nimport { queueClaimName, type NativeQueueEnvelope } from '../queue-protocol.js';\nimport type { QueueRunStub } from './router.js';\n\nexport interface QueueClaimHandle {\n /** Take the in-flight claim; `expired` only for run-scoped claims of an expired run. */\n claim(\n messageId: string,\n staleMs: number,\n ): Promise<{ expired?: boolean; claimed: boolean; retryAt?: number }>;\n hold(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }>;\n release(messageId: string): Promise<void>;\n abandonReservation(messageId: string): Promise<void>;\n confirmPublication(messageId: string, expiresAt: number): Promise<void>;\n complete(messageId: string): Promise<void>;\n}\n\nexport function cellQueueClaim(cell: QueueRunStub): QueueClaimHandle {\n return {\n claim: (messageId, staleMs) => cell.claimInflight({ messageId, staleMs }),\n hold: (params) => cell.holdInflight(params),\n release: (messageId) => cell.releaseInflight(messageId),\n abandonReservation: (messageId) => cell.abandonQueueMessageReservation(messageId),\n confirmPublication: (messageId, expiresAt) =>\n cell.confirmQueueMessagePublication({ messageId, expiresAt }),\n complete: (messageId) => cell.completeQueueMessage(messageId),\n };\n}\n\nexport function runQueueClaim(run: QueueRunStub, claimName: string): QueueClaimHandle {\n return {\n claim: async (messageId, staleMs) => {\n const result = await run.claimRunQueueMessage({ claimName, messageId, staleMs });\n return result.expired ? { expired: true, claimed: false } : result;\n },\n hold: (params) => run.holdRunQueueMessage({ claimName, ...params }),\n release: (messageId) => run.releaseRunQueueMessage({ claimName, messageId }),\n abandonReservation: (messageId) =>\n run.abandonRunQueueMessageReservation({ claimName, messageId }),\n confirmPublication: (messageId, expiresAt) =>\n run.confirmRunQueueMessagePublication({ claimName, messageId, expiresAt }),\n complete: (messageId) => run.completeRunQueueMessage({ claimName, messageId }),\n };\n}\n\n/** The claim a delivered envelope was reserved under, if it has an idempotency key. */\nexport function deliveryQueueClaim(\n envelope: NativeQueueEnvelope,\n runStub: (name: string) => QueueRunStub,\n): QueueClaimHandle | undefined {\n if (!envelope.idempotencyKey) return undefined;\n const claimName = queueClaimName(envelope.queueName, envelope.idempotencyKey);\n return envelope.claimScope === 'run' && envelope.runId\n ? runQueueClaim(runStub(envelope.runId), claimName)\n : cellQueueClaim(runStub(claimName));\n}\n","/** Internal delivery contract. No Request/Response objects cross the RPC boundary. */\nimport {\n QUEUE_CLAIM_STALE_MS,\n queueOrphanName,\n validateNativeQueueEnvelope,\n} from '../queue-protocol.js';\nimport { queueDelayDeadline } from '../validation.js';\nimport { timingSafeEqual } from './auth.js';\nimport { deliveryQueueClaim } from './queue-claims.js';\nimport type { QueueRunStub, WorkerEnv } from './router.js';\n\nexport type QueueDeliveryResult =\n | { kind: 'complete' }\n | { kind: 'suspend'; timeoutSeconds: number }\n | { kind: 'retry' };\n\nexport type QueueDeliveryEnv = Pick<\n WorkerEnv,\n 'WORKFLOW_DB' | 'WORKFLOW_QUEUE_PAYLOADS' | 'WORLD_SECRET' | 'WORKFLOW_CALLBACK_SECRET'\n>;\n\nconst MAX_QUEUE_DELIVERY_RESPONSE_BYTES = 64 * 1024;\nconst QUEUE_ORPHAN_GRACE_MS = 5 * 24 * 60 * 60 * 1000;\nconst PERMANENT_QUEUE_STATUSES = new Set([404, 409, 410, 422]);\nasync function readResponseText(response: Response): Promise<string> {\n if (!response.body) return '';\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_QUEUE_DELIVERY_RESPONSE_BYTES) {\n await reader.cancel('queue delivery response is too large').catch(() => undefined);\n throw new Error('workflow queue handler response exceeds configured limit');\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n}\n\n/** Validate at the service boundary; callers cannot bypass auth via RPC. */\nexport async function deliverQueueMessage(\n env: QueueDeliveryEnv,\n secret: unknown,\n input: unknown,\n attempt: unknown,\n): Promise<QueueDeliveryResult> {\n if (!env.WORLD_SECRET) throw new Error('WORLD_SECRET is not configured');\n if (typeof secret !== 'string' || !secret || !(await timingSafeEqual(secret, env.WORLD_SECRET))) {\n throw new Error('Unauthorized Queue delivery');\n }\n const envelope = validateNativeQueueEnvelope(input);\n if (!Number.isSafeInteger(attempt) || (attempt as number) < 1) {\n throw new TypeError('queue delivery attempt must be a positive safe integer');\n }\n if (!env.WORKFLOW_DB) throw new Error('missing binding: WORKFLOW_DB');\n\n const namespace = env.WORKFLOW_DB;\n const payloadStore = env.WORKFLOW_QUEUE_PAYLOADS;\n const runStub = (name: string) => namespace.get(namespace.idFromName(name)) as QueueRunStub;\n const claim = deliveryQueueClaim(envelope, runStub);\n let claimed = false;\n\n async function releaseClaim(): Promise<void> {\n if (claimed) await claim!.release(envelope.messageId);\n }\n async function unregisterPayload(): Promise<void> {\n if (envelope.runId) {\n await runStub(envelope.runId).unregisterQueuePayload(envelope.messageId);\n await runStub(queueOrphanName(envelope.messageId)).cancelQueuePayloadOrphan(\n envelope.messageId,\n );\n }\n }\n\n try {\n // A run-bearing body carried inline has no payload object for retention\n // to delete, so the run cell answers whether the run has expired. The\n // read overlaps the claim and adds no round trip; a run-scoped claim\n // answers it in the same transaction.\n let admission: ReturnType<QueueRunStub['getQueueAdmission']> | undefined;\n if (envelope.runId && !envelope.payloadKey && envelope.claimScope !== 'run') {\n admission = runStub(envelope.runId).getQueueAdmission();\n admission.catch(() => undefined);\n }\n if (claim) {\n const result = await claim.claim(envelope.messageId, QUEUE_CLAIM_STALE_MS);\n // A run-scoped claim of an expired run: same outcome as a deleted body.\n if (result.expired) return { kind: 'complete' };\n if (!result.claimed) {\n const now = Date.now();\n if (result.retryAt !== undefined && result.retryAt > now) {\n return {\n kind: 'suspend',\n timeoutSeconds: Math.max(1, Math.ceil((result.retryAt - now) / 1000)),\n };\n }\n return { kind: 'complete' };\n }\n claimed = true;\n }\n\n if (admission && !(await admission).ok) {\n // Same outcome as an offloaded body that retention already deleted.\n await claim?.complete(envelope.messageId);\n return { kind: 'complete' };\n }\n\n let body = envelope.body;\n if (envelope.payloadKey) {\n if (!payloadStore) throw new Error('missing binding: WORKFLOW_QUEUE_PAYLOADS');\n body = (await payloadStore.read(envelope.payloadKey)) ?? undefined;\n if (body === undefined) {\n await unregisterPayload();\n await claim?.complete(envelope.messageId);\n return { kind: 'complete' };\n }\n }\n\n const headers: Record<string, string> = {\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(attempt),\n };\n if (env.WORKFLOW_CALLBACK_SECRET) {\n headers['x-workflow-callback-secret'] = env.WORKFLOW_CALLBACK_SECRET;\n }\n const callback = await fetch(\n `${envelope.targetBaseUrl.replace(/\\/$/, '')}/.well-known/workflow/v1/flow`,\n { method: 'POST', headers, body, signal: AbortSignal.timeout(300_000) },\n );\n if (callback.ok || PERMANENT_QUEUE_STATUSES.has(callback.status)) {\n await callback.body?.cancel().catch(() => undefined);\n if (envelope.payloadKey) {\n await payloadStore!.delete(envelope.payloadKey);\n await unregisterPayload();\n }\n // Do not acknowledge until cleanup and completion are durably accepted.\n await claim?.complete(envelope.messageId);\n return { kind: 'complete' };\n }\n\n if (callback.status === 503) {\n const responseBody = await readResponseText(callback);\n const timeoutSeconds = (JSON.parse(responseBody) as { timeoutSeconds?: unknown })\n .timeoutSeconds;\n const notBefore = queueDelayDeadline(Date.now(), timeoutSeconds, 1, QUEUE_CLAIM_STALE_MS);\n if (notBefore === null) throw new Error('workflow queue suspension deadline is invalid');\n if (envelope.payloadKey && envelope.runId) {\n await runStub(queueOrphanName(envelope.messageId)).scheduleQueuePayloadOrphan({\n messageId: envelope.messageId,\n runId: envelope.runId,\n key: envelope.payloadKey,\n expiresAt: notBefore + QUEUE_ORPHAN_GRACE_MS,\n });\n }\n if (claim) {\n await claim.hold({\n messageId: envelope.messageId,\n retryAt: notBefore,\n expiresAt: notBefore + QUEUE_CLAIM_STALE_MS,\n reservationExpiresAt: notBefore + QUEUE_ORPHAN_GRACE_MS,\n });\n }\n // Validation proves a positive safe integer delay.\n return {\n kind: 'suspend',\n timeoutSeconds: timeoutSeconds as number,\n };\n }\n\n await callback.body?.cancel().catch(() => undefined);\n await releaseClaim();\n claimed = false;\n return { kind: 'retry' };\n } catch (error) {\n // A failed read, callback, or cleanup must not turn into an acknowledgement.\n await releaseClaim();\n throw error;\n }\n}\n","/** Standard Date fields used across all worlds */\nexport const DATE_FIELDS = new Set([\n 'createdAt',\n 'updatedAt',\n 'startedAt',\n 'completedAt',\n 'retryAfter',\n] as const);\n\n/**\n * JSON reviver that converts ISO date strings to Date objects.\n * Use with JSON.parse(json, dateReviver).\n */\nexport function dateReviver(key: string, value: unknown): unknown {\n if (\n DATE_FIELDS.has(key as typeof DATE_FIELDS extends Set<infer T> ? T : never) &&\n typeof value === 'string'\n ) {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date;\n }\n return value;\n}\n\n/**\n * Base64 helpers. Modified vs upstream: implemented without Buffer so this\n * module is safe inside the celld worker bundle (workerd has no Buffer\n * global). Uses the native Uint8Array base64 methods where the runtime has\n * them (Node >= 25, current V8) and falls back to atob/btoa elsewhere.\n */\nconst nativeToBase64 = (\n Uint8Array.prototype as Uint8Array & { toBase64?: (this: Uint8Array) => string }\n).toBase64;\nconst nativeFromBase64 = (Uint8Array as { fromBase64?: (text: string) => Uint8Array }).fromBase64;\n\n/** Small enough to stay far below engine argument-count limits and fast to spread. */\nconst FALLBACK_ENCODE_CHUNK = 0x1000;\n\n/** @internal Exported for tests; use b64encode. */\nexport function b64encodeFallback(bytes: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < bytes.length; i += FALLBACK_ENCODE_CHUNK) {\n bin += String.fromCharCode.apply(\n null,\n bytes.subarray(i, i + FALLBACK_ENCODE_CHUNK) as unknown as number[],\n );\n }\n return btoa(bin);\n}\n\n/** @internal Exported for tests; use b64decode. */\nexport function b64decodeFallback(text: string): Uint8Array {\n const bin = atob(text);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) {\n out[i] = bin.charCodeAt(i);\n }\n return out;\n}\n\nexport function b64encode(bytes: Uint8Array): string {\n return nativeToBase64 ? nativeToBase64.call(bytes) : b64encodeFallback(bytes);\n}\n\nexport function b64decode(text: string): Uint8Array {\n return nativeFromBase64 ? nativeFromBase64(text) : b64decodeFallback(text);\n}\n\n/**\n * JSON replacer that encodes Uint8Array as a tagged object with base64 data.\n */\nexport function uint8ArrayReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Uint8Array) {\n return {\n __type: 'Uint8Array',\n data: b64encode(value),\n };\n }\n return value;\n}\n\n/**\n * JSON reviver that decodes tagged Uint8Array objects and ISO date strings.\n * Supports both:\n * - New format: { __type: 'Uint8Array', data: '<base64>' }\n * - Legacy format: { __uint8array: true, data: [1, 2, 3] }\n */\nexport function uint8ArrayReviver(key: string, value: unknown): unknown {\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n // New format: base64-encoded\n if (obj.__type === 'Uint8Array') {\n if (typeof obj.data !== 'string') throw new SyntaxError('Malformed Uint8Array tag');\n try {\n return b64decode(obj.data);\n } catch {\n throw new SyntaxError('Malformed Uint8Array tag');\n }\n }\n // Legacy format: number array (backwards compat with NATS JetStream data)\n if (obj.__uint8array === true) {\n if (\n !Array.isArray(obj.data) ||\n !obj.data.every((byte) => Number.isInteger(byte) && byte >= 0 && byte <= 255)\n ) {\n throw new SyntaxError('Malformed legacy Uint8Array tag');\n }\n return new Uint8Array(obj.data);\n }\n }\n return dateReviver(key, value);\n}\n\n/** Stringify with Uint8Array support. */\nexport function stringify(value: unknown): string {\n return JSON.stringify(value, uint8ArrayReplacer);\n}\n\n/** Parse with Uint8Array and Date support. */\nexport function parse<T>(text: string): T {\n return JSON.parse(text, uint8ArrayReviver) as T;\n}\n\n/** Deep clone using structuredClone */\nexport function deepClone<T>(value: T): T {\n return structuredClone(value);\n}\n","export class Mutex {\n promise: Promise<unknown> = Promise.resolve();\n andThen<T>(fn: () => Promise<T> | T): Promise<T> {\n this.promise = this.promise.then(\n () => fn(),\n () => fn(),\n );\n return this.promise as Promise<T>;\n }\n}\n\nexport function compact<T extends object>(obj: T) {\n const value = {} as {\n [key in keyof T]: null extends T[key] ? undefined | NonNullable<T[key]> : T[key];\n };\n for (const key in obj) {\n if (obj[key] !== null) {\n value[key] = obj[key] as any;\n } else {\n value[key] = undefined as any;\n }\n }\n return value;\n}\n\n/**\n * Reference counting helper for managing resource lifecycle\n */\nexport class Rc {\n private count = 0;\n private disposeFn?: () => void | Promise<void>;\n\n constructor(disposeFn?: () => void | Promise<void>) {\n this.disposeFn = disposeFn;\n }\n\n inc(): void {\n this.count++;\n }\n\n async dec(): Promise<void> {\n this.count--;\n if (this.count === 0 && this.disposeFn) {\n await this.disposeFn();\n }\n }\n\n getCount(): number {\n return this.count;\n }\n}\n","/**\n * Transactional event-application core shared by the real WorkflowRunDO and\n * the in-memory test mocks.\n *\n * All guard checks, the event append, and the entity mutation happen against a\n * single {@link EventStore}. The Durable Object wraps a call to\n * {@link applyEvent} in `ctx.storage.transaction()`, so the whole operation is\n * atomic; the mocks run it against an in-memory store.\n *\n * Guard semantics are ported from the upstream `@workflow/world-local` /\n * `@workflow/world-postgres` reference implementations (Workflow 5 contract):\n * - run_started on a terminal run -> RunExpiredError\n * - terminal transitions on a terminal run -> EntityConflictError\n * - run_cancelled is idempotent on an already-cancelled run\n * - duplicate step_created / hook_created -> EntityConflictError\n * - step events on a terminal step -> EntityConflictError\n * - step_started before step.retryAfter -> TooEarlyError\n * - error/output/completedAt are cleared whenever a run re-enters a\n * non-final status (WorkflowRunSchema is a discriminated union)\n *\n * Errors are returned as structured outcomes (never thrown) because custom\n * error classes do not survive the Durable Object RPC boundary with their\n * `name` intact — and `@workflow/errors` matches errors by name via `.is()`.\n * The storage layer converts outcomes back into the typed errors.\n */\n\nimport type {\n CreateEventParams,\n CreateEventRequest,\n Event,\n Hook,\n RunCreatedEventRequest,\n Step,\n Wait,\n WorkflowRun,\n} from '@workflow/world';\nimport {\n applyAttributeChanges,\n CreateEventSchema,\n eventIdToSlot,\n EventSchema,\n getMaxEventsPerRun,\n HookSchema,\n isChildEntityCreationEvent,\n isTerminalStepStatus,\n isTerminalWorkflowRunStatus,\n SPEC_VERSION_CURRENT,\n slotToEventId,\n StepSchema,\n validateAttributeChanges,\n WaitSchema,\n WorkflowRunSchema,\n} from '@workflow/world';\nimport { compact } from './util.js';\nimport type { ScheduleCleanupRequest } from './retention.js';\n\n/** Storage key for the run entity. */\nconst RUN_KEY = 'run';\n/** Key prefixes for per-entity storage. */\nexport const EVENT_KEY_PREFIX = 'event:';\nexport const STEP_KEY_PREFIX = 'step:';\nexport const HOOK_KEY_PREFIX = 'hook:';\nexport const WAIT_KEY_PREFIX = 'wait:';\nexport const STEP_CREATED_KEY_PREFIX = 'stepcreated:';\nexport const HOOK_CREATED_KEY_PREFIX = 'hookcreated:';\n/**\n * Marker recording that a hook_created event was committed for a hookId.\n * Mirrors postgres' `workflow_events_entity_creation_unique` partial index:\n * it outlives hook disposal so a replayed hook_created after dispose is\n * rejected as a duplicate instead of resurrecting the hook.\n */\nconst HOOK_EVENT_MARKER_PREFIX = 'hookevent:';\n/** Durable repair record for idempotent post-commit hook-index release. */\nconst HOOK_RELEASE_MARKER_PREFIX = 'hookreleased:';\n/** Exact ambiguous reservations canceled by a serialized RunDO resolution. */\nexport const HOOK_CLAIM_CANCELLATION_PREFIX = 'hookclaimcancelled:';\n/** Workflow-authored attr_set correlation claims. */\nconst ATTRIBUTE_EVENT_MARKER_PREFIX = 'attrevent:';\n/** Durable lazy-hook resume claims, scoped by the containing run DO. */\nconst HOOK_RESUME_CLAIM_PREFIX = 'hookresume:';\n\ninterface HookResumeClaim {\n hookId: string;\n eventId: string;\n payloadDigest?: string;\n}\n\nexport interface EventStoreListOptions {\n prefix: string;\n /** Exclusive lower bound (full key). */\n startAfter?: string;\n /** Exclusive upper bound (full key). */\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\n/**\n * Minimal transactional key-value surface, satisfied by\n * `DurableObjectTransaction` / `DurableObjectStorage` and by the in-memory\n * test-mock store. Keys list in lexicographic order (reversed when\n * `reverse: true`).\n */\nexport interface EventStore {\n get<T>(key: string): Promise<T | undefined>;\n /** Optional native multi-key read (128 keys per Durable Object call). */\n getMany?<T>(keys: string[]): Promise<Map<string, T>>;\n put<T>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<boolean>;\n /** Optional native multi-key delete. */\n deleteMany?(keys: string[]): Promise<number>;\n list<T>(options: EventStoreListOptions): Promise<Map<string, T>>;\n /**\n * Celld-only capability: terminal entity cleanup is persisted and paged by\n * WorkflowRunDO alarms instead of running inside the event transaction.\n */\n deferTerminalCleanup?: boolean;\n}\n\nconst STORAGE_BATCH_SIZE = 128;\nconst MAX_ENTITY_PAGE_SIZE = 1000;\n\nasync function getMany<T>(store: EventStore, keys: string[]): Promise<Map<string, T>> {\n if (store.getMany) {\n const result = new Map<string, T>();\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n const page = await store.getMany<T>(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n for (const entry of page) result.set(...entry);\n }\n return result;\n }\n const values = await Promise.all(keys.map((key) => store.get<T>(key)));\n return new Map(\n keys.flatMap((key, index) =>\n values[index] === undefined ? [] : ([[key, values[index] as T]] as Array<[string, T]>),\n ),\n );\n}\n\nasync function deleteMany(store: EventStore, keys: string[]): Promise<number> {\n if (store.deleteMany) {\n let deleted = 0;\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n deleted += await store.deleteMany(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n return deleted;\n }\n const results = await Promise.all(keys.map((key) => store.delete(key)));\n return results.filter(Boolean).length;\n}\n\nexport interface ApplyEventRequest {\n /** The effective run id (already resolved / generated by the caller). */\n runId: string;\n data: CreateEventRequest | RunCreatedEventRequest;\n /** Workflow 5 event-log position and preload options. */\n params?: CreateEventParams;\n /**\n * Current holder of the hook token per the sharded token-ownership index\n * (hook_created only). `null` means the token is unclaimed.\n */\n tokenHolder?: { runId: string; hookId: string } | null;\n /** Exact token/ID reservation fenced on ambiguous-delivery resolution. */\n hookClaimId?: string;\n /** Internal world-celld retention policy captured with the event. */\n cleanup?: ScheduleCleanupRequest;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Validate and canonicalize the untyped fleet-facing applyEvent envelope.\n * This runs before a RunDO transaction starts; in particular, malformed hook\n * events cannot allocate a sequence or touch hook/entity storage.\n */\nexport function parseApplyEventRequest(value: unknown): ApplyEventRequest {\n if (!isRecord(value)) throw new TypeError('applyEvent request must be an object');\n if (typeof value.runId !== 'string' || value.runId.length === 0) {\n throw new TypeError('applyEvent runId must be a non-empty string');\n }\n\n const data = CreateEventSchema.parse(isRecord(value.data) ? compact(value.data) : value.data);\n const params = value.params;\n if (params !== undefined) {\n if (!isRecord(params)) throw new TypeError('applyEvent params must be an object');\n if (\n params.occurredAt !== undefined &&\n (!(params.occurredAt instanceof Date) || Number.isNaN(params.occurredAt.getTime()))\n ) {\n throw new TypeError('applyEvent params.occurredAt must be a valid Date');\n }\n for (const key of ['resumeId', 'resumePayloadDigest', 'sinceCursor'] as const) {\n if (params[key] !== undefined && typeof params[key] !== 'string') {\n throw new TypeError(`applyEvent params.${key} must be a string`);\n }\n }\n if (\n params.eventCount !== undefined &&\n (typeof params.eventCount !== 'number' ||\n !Number.isSafeInteger(params.eventCount) ||\n params.eventCount < 0)\n ) {\n throw new TypeError('applyEvent params.eventCount must be a non-negative safe integer');\n }\n for (const key of ['skipPreload', 'preloadEvents'] as const) {\n if (params[key] !== undefined && params[key] !== true) {\n throw new TypeError(`applyEvent params.${key} must be true when present`);\n }\n }\n }\n\n let tokenHolder: ApplyEventRequest['tokenHolder'];\n if (value.tokenHolder === null) {\n tokenHolder = null;\n } else if (value.tokenHolder !== undefined) {\n if (\n !isRecord(value.tokenHolder) ||\n typeof value.tokenHolder.runId !== 'string' ||\n value.tokenHolder.runId.length === 0 ||\n typeof value.tokenHolder.hookId !== 'string' ||\n value.tokenHolder.hookId.length === 0\n ) {\n throw new TypeError('applyEvent tokenHolder must contain non-empty runId and hookId strings');\n }\n tokenHolder = { runId: value.tokenHolder.runId, hookId: value.tokenHolder.hookId };\n }\n\n if (\n value.hookClaimId !== undefined &&\n (typeof value.hookClaimId !== 'string' || value.hookClaimId.length === 0)\n ) {\n throw new TypeError('applyEvent hookClaimId must be a non-empty string');\n }\n\n return {\n runId: value.runId,\n data,\n ...(params === undefined ? {} : { params }),\n ...(value.tokenHolder === undefined ? {} : { tokenHolder }),\n ...(value.hookClaimId === undefined ? {} : { hookClaimId: value.hookClaimId }),\n ...(value.cleanup === undefined ? {} : { cleanup: value.cleanup as ScheduleCleanupRequest }),\n };\n}\n\nexport type ApplyEventErrorCode =\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\nexport interface ApplyEventFailure {\n ok: false;\n code: ApplyEventErrorCode;\n message: string;\n /** Seconds until retry is allowed (TOO_EARLY only). */\n retryAfterSeconds?: number;\n /** The run's spec version (RUN_NOT_SUPPORTED only). */\n runSpecVersion?: number;\n}\n\nexport interface ApplyEventSuccess {\n ok: true;\n /** Absent for idempotent replays that record no new event. */\n event?: Event;\n run?: WorkflowRun;\n step?: Step;\n hook?: Hook;\n wait?: Wait;\n /** True when a lazy step_started atomically created its step. */\n stepCreated?: true;\n /** Hooks whose token and ID indexes must be released. */\n releasedHooks: Array<{ hookId: string; token: string }>;\n /** Set when a run entity was created (run_created or resilient bootstrap). */\n runCreated?: { workflowName: string; createdAt: Date };\n /** Set when the sharded hook indexes must be (re)written. */\n hookToIndex?: Hook;\n /** All events (ascending), preloaded for run_started responses. */\n events?: Event[];\n /** Pagination metadata required whenever events are returned. */\n cursor?: string | null;\n hasMore?: boolean;\n /** Server-owned event ceiling advertised on run lifecycle writes. */\n maxEvents?: number;\n /** Deadline for publishing this authoritative mutation to derivative indexes. */\n indexPublicationExpiresAt?: number;\n /** Set by the worker router after it published `run` to the run catalog. */\n runIndexPublished?: true;\n /** Set by the worker router after it released `releasedHooks` from the hook indexes. */\n hookIndexesReleased?: true;\n /**\n * The unchanged run returned with a `preloadEvents` hook_received replay\n * log. It is not a run mutation, so it carries no index publication.\n */\n replayRun?: WorkflowRun;\n}\n\nexport type ApplyEventOutcome = ApplyEventSuccess | ApplyEventFailure;\n\ninterface ApplyEventContext extends ApplyEventRequest {\n nextEventId(): string;\n now: Date;\n}\n\nfunction failure(\n code: ApplyEventErrorCode,\n message: string,\n extra?: Pick<ApplyEventFailure, 'retryAfterSeconds' | 'runSpecVersion'>,\n): ApplyEventFailure {\n return { ok: false, code, message, ...extra };\n}\n\nexport function hookClaimCancellationKey(claimId: string): string {\n return `${HOOK_CLAIM_CANCELLATION_PREFIX}${encodeURIComponent(claimId)}`;\n}\n\nfunction readStringProp(value: unknown, key: string): string | undefined {\n if (value !== null && typeof value === 'object') {\n const prop = (value as Record<string, unknown>)[key];\n if (typeof prop === 'string') return prop;\n }\n return undefined;\n}\n\n/**\n * Map a run failure eventData.error (which may be a string, an Error-shaped\n * object, or anything else) to the structured error stored on runs.\n * Matches upstream: string errors keep their text, errorCode is preserved.\n */\nfunction toStructuredError(\n error: unknown,\n opts?: { stack?: string; code?: string },\n): { message: string; stack?: string; code?: string } {\n const message =\n typeof error === 'string' ? error : (readStringProp(error, 'message') ?? 'Unknown error');\n return {\n message,\n stack: opts?.stack ?? readStringProp(error, 'stack'),\n code: opts?.code ?? readStringProp(error, 'code'),\n };\n}\n\n/**\n * Shared cursor pagination over a key prefix. Fetches `limit + 1` entries to\n * detect `hasMore` without ever skipping the boundary entry (the cursor is\n * derived from the last *returned* item, not the peeked one).\n */\nexport async function listByPrefix<T>(\n store: EventStore,\n prefix: string,\n params: { limit: number; cursor?: string; sortOrder?: 'asc' | 'desc' },\n getId: (item: T) => string,\n): Promise<{ data: T[]; cursor: string | null; hasMore: boolean }> {\n const { limit, cursor, sortOrder = 'asc' } = params;\n const options: EventStoreListOptions =\n sortOrder === 'desc'\n ? { prefix, reverse: true, limit: limit + 1, end: cursor ? `${prefix}${cursor}` : undefined }\n : { prefix, limit: limit + 1, startAfter: cursor ? `${prefix}${cursor}` : undefined };\n const entries = await store.list<T>(options);\n const values = Array.from(entries.values());\n const hasMore = values.length > limit;\n const data = values.slice(0, limit);\n const last = data.at(-1);\n return {\n data,\n cursor: hasMore && last !== undefined ? getId(last) : null,\n hasMore,\n };\n}\n\nfunction creationIndexKey(prefix: string, createdAt: Date, id: string): string {\n return `${prefix}${createdAt.toISOString()}:${id}`;\n}\n\n/**\n * Cursor pagination over an explicit creation-time index. Entity ids are\n * values rather than key suffixes, so caller-supplied ids cannot disturb the\n * requested ordering.\n */\nexport async function listByCreationTime<T>(\n store: EventStore,\n indexPrefix: string,\n entityPrefix: string,\n params: { limit: number; cursor?: string; sortOrder?: 'asc' | 'desc' },\n): Promise<{ data: T[]; cursor: string | null; hasMore: boolean }> {\n const requestedLimit = Number.isFinite(params.limit) ? Math.floor(params.limit) : 1;\n const limit = Math.min(MAX_ENTITY_PAGE_SIZE, Math.max(1, requestedLimit));\n const { cursor, sortOrder = 'asc' } = params;\n const entries = await store.list<string>(\n sortOrder === 'desc'\n ? {\n prefix: indexPrefix,\n reverse: true,\n limit: limit + 1,\n end: cursor ? `${indexPrefix}${cursor}` : undefined,\n }\n : {\n prefix: indexPrefix,\n limit: limit + 1,\n startAfter: cursor ? `${indexPrefix}${cursor}` : undefined,\n },\n );\n const page = Array.from(entries.entries()).slice(0, limit);\n const entityKeys = page.map(([, id]) => `${entityPrefix}${id}`);\n const entities = await getMany<T>(store, entityKeys);\n const data = entityKeys.flatMap((key) => {\n const item = entities.get(key);\n return item === undefined ? [] : [item];\n });\n const hasMore = entries.size > limit;\n const lastKey = page.at(-1)?.[0];\n return {\n data,\n cursor: hasMore && lastKey ? lastKey.slice(indexPrefix.length) : null,\n hasMore,\n };\n}\n\n/** Delete all hook entities for the run, returning the released tokens. */\nasync function releaseAllHooks(\n store: EventStore,\n): Promise<Array<{ hookId: string; token: string }>> {\n if (store.deferTerminalCleanup) return [];\n const hooks = await store.list<Hook>({ prefix: HOOK_KEY_PREFIX });\n const released: Array<{ hookId: string; token: string }> = [];\n const keys: string[] = [];\n for (const hook of hooks.values()) {\n keys.push(`${HOOK_KEY_PREFIX}${hook.hookId}`);\n keys.push(creationIndexKey(HOOK_CREATED_KEY_PREFIX, hook.createdAt, hook.hookId));\n released.push({ hookId: hook.hookId, token: hook.token });\n }\n await deleteMany(store, keys);\n return released;\n}\n\n/** Delete all persisted waits once their owning run becomes terminal. */\nasync function releaseAllWaits(store: EventStore): Promise<void> {\n if (store.deferTerminalCleanup) return;\n const waits = await store.list<Wait>({ prefix: WAIT_KEY_PREFIX });\n await deleteMany(store, Array.from(waits.keys()));\n}\n\nexport async function applyEvent(\n store: EventStore,\n ctx: ApplyEventContext,\n): Promise<ApplyEventOutcome> {\n const { runId, data, now } = ctx;\n const specVersion = data.specVersion ?? SPEC_VERSION_CURRENT;\n\n if (specVersion !== SPEC_VERSION_CURRENT) {\n return failure(\n 'RUN_NOT_SUPPORTED',\n `Run \"${runId}\" uses unsupported specVersion ${specVersion}; this world requires ${SPEC_VERSION_CURRENT}`,\n { runSpecVersion: specVersion },\n );\n }\n\n /** Build and validate the stored event BEFORE anything is persisted. */\n const buildEvent = (record: Record<string, unknown>): Event => {\n const withMeta: Record<string, unknown> = {\n ...record,\n runId,\n eventId: ctx.nextEventId(),\n createdAt: now,\n occurredAt: ctx.params?.occurredAt,\n resumeId: ctx.params?.resumeId,\n specVersion,\n };\n if (record.eventType !== 'hook_received') {\n delete withMeta.resumeId;\n }\n if (record.eventType === 'run_started') {\n delete withMeta.eventData;\n }\n if (\n record.eventType === 'step_started' &&\n withMeta.eventData !== null &&\n typeof withMeta.eventData === 'object'\n ) {\n const { input: _input, ...eventData } = withMeta.eventData as Record<string, unknown>;\n withMeta.eventData = eventData;\n }\n return EventSchema.parse(compact(withMeta));\n };\n\n const putEvent = async (event: Event): Promise<void> => {\n await store.put(`${EVENT_KEY_PREFIX}${event.eventId}`, event);\n };\n\n // ============================================================\n // VALIDATION: current run state (skipped for run_created and for\n // step_completed / step_retrying, matching upstream — those only operate\n // on running steps regardless of run state).\n // ============================================================\n let currentRun: WorkflowRun | undefined;\n const skipRunValidation =\n data.eventType === 'run_created' ||\n data.eventType === 'step_completed' ||\n data.eventType === 'step_retrying';\n if (!skipRunValidation) {\n currentRun = await store.get<WorkflowRun>(RUN_KEY);\n }\n\n // ============================================================\n // RESILIENT START: run_started on a non-existent run bootstraps the run\n // from the message's runInput (spec >= 3 queue transport).\n // ============================================================\n let bootstrapped: ApplyEventSuccess['runCreated'];\n if (data.eventType === 'run_started' && !currentRun && data.eventData) {\n const {\n deploymentId,\n workflowName,\n input,\n executionContext,\n attributes,\n allowReservedAttributes,\n encryptionPublicKey,\n } = data.eventData;\n if (deploymentId && workflowName && input !== undefined) {\n const attributeChanges = Object.entries(attributes ?? {}).map(([key, value]) => ({\n key,\n value,\n }));\n validateAttributeChanges(attributeChanges, { allowReservedAttributes });\n const createdRun = WorkflowRunSchema.parse(\n compact({\n runId,\n deploymentId,\n workflowName,\n specVersion,\n executionContext,\n attributes,\n encryptionPublicKey,\n input,\n status: 'pending',\n output: undefined,\n error: undefined,\n startedAt: undefined,\n completedAt: undefined,\n createdAt: now,\n updatedAt: now,\n }),\n );\n const runCreatedEvent = buildEvent({\n eventType: 'run_created',\n eventData: {\n deploymentId,\n workflowName,\n input,\n executionContext,\n attributes,\n allowReservedAttributes,\n encryptionPublicKey,\n },\n });\n await store.put(RUN_KEY, createdRun);\n await putEvent(runCreatedEvent);\n currentRun = createdRun;\n bootstrapped = { workflowName, createdAt: now };\n }\n }\n\n // ============================================================\n // WORKFLOW 5 PROTOCOL BOUNDARY\n // ============================================================\n if (currentRun && currentRun.specVersion !== SPEC_VERSION_CURRENT) {\n return failure(\n 'RUN_NOT_SUPPORTED',\n `Run \"${runId}\" uses unsupported specVersion ${currentRun.specVersion}; this world requires ${SPEC_VERSION_CURRENT}`,\n { runSpecVersion: currentRun.specVersion },\n );\n }\n\n // ============================================================\n // GUARDS: terminal run state\n // ============================================================\n if (currentRun && isTerminalWorkflowRunStatus(currentRun.status)) {\n // Idempotent: run_cancelled on an already-cancelled run records the event\n // and returns the current state.\n if (data.eventType === 'run_cancelled' && currentRun.status === 'cancelled') {\n const event = buildEvent({ ...data });\n await putEvent(event);\n return { ok: true, event, run: currentRun, releasedHooks: [] };\n }\n if (data.eventType === 'run_started') {\n return failure(\n 'RUN_EXPIRED',\n `Workflow run \"${runId}\" is already in terminal state \"${currentRun.status}\"`,\n );\n }\n if (\n data.eventType === 'run_completed' ||\n data.eventType === 'run_failed' ||\n data.eventType === 'run_cancelled'\n ) {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot transition run from terminal state \"${currentRun.status}\"`,\n );\n }\n if (isChildEntityCreationEvent(data)) {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot create new entities on run in terminal state \"${currentRun.status}\"`,\n );\n }\n if (data.eventType === 'attr_set') {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot set attributes on run in terminal state \"${currentRun.status}\"`,\n );\n }\n }\n\n // ============================================================\n // GUARDS: step ordering and terminal state\n // ============================================================\n let validatedStep: Step | undefined;\n if (\n data.eventType === 'step_started' ||\n data.eventType === 'step_completed' ||\n data.eventType === 'step_failed' ||\n data.eventType === 'step_retrying'\n ) {\n const lazyStepStart = data.eventType === 'step_started' && isChildEntityCreationEvent(data);\n validatedStep = await store.get<Step>(`${STEP_KEY_PREFIX}${data.correlationId}`);\n if (!validatedStep) {\n if (!lazyStepStart) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n } else if (lazyStepStart) {\n return failure('ENTITY_CONFLICT', `Step \"${data.correlationId}\" already exists`);\n }\n if (validatedStep && isTerminalStepStatus(validatedStep.status)) {\n return failure(\n 'ENTITY_CONFLICT',\n `Cannot modify step in terminal state \"${validatedStep.status}\"`,\n );\n }\n // On terminal runs, only in-flight steps may still record progress.\n if (\n currentRun &&\n isTerminalWorkflowRunStatus(currentRun.status) &&\n validatedStep &&\n validatedStep.status !== 'running'\n ) {\n return failure(\n 'RUN_EXPIRED',\n `Cannot modify non-running step on run in terminal state \"${currentRun.status}\"`,\n );\n }\n }\n\n // ============================================================\n // GUARDS: hook event ordering\n // ============================================================\n if (data.eventType === 'hook_received' && ctx.params?.resumeId) {\n const claim = await store.get<HookResumeClaim>(\n `${HOOK_RESUME_CLAIM_PREFIX}${ctx.params.resumeId}`,\n );\n if (claim) {\n if (claim.hookId !== data.correlationId) {\n return failure(\n 'ENTITY_CONFLICT',\n `hook_received resumeId \"${ctx.params.resumeId}\" already recorded for a different hook`,\n );\n }\n if (\n claim.payloadDigest &&\n ctx.params.resumePayloadDigest &&\n claim.payloadDigest !== ctx.params.resumePayloadDigest\n ) {\n return failure(\n 'ENTITY_CONFLICT',\n `hook_received resumeId \"${ctx.params.resumeId}\" already recorded with a different payload`,\n );\n }\n const committed = await store.get<Event>(`${EVENT_KEY_PREFIX}${claim.eventId}`);\n if (\n committed?.eventType === 'hook_received' &&\n committed.correlationId === claim.hookId &&\n committed.resumeId === ctx.params.resumeId\n ) {\n return { ok: true, event: committed, releasedHooks: [] };\n }\n if (committed) {\n return failure(\n 'ENTITY_CONFLICT',\n `hook_received resumeId \"${ctx.params.resumeId}\" points to a different event`,\n );\n }\n }\n }\n if (\n (data.eventType === 'hook_disposed' || data.eventType === 'hook_received') &&\n data.correlationId\n ) {\n const existingHook = await store.get<Hook>(`${HOOK_KEY_PREFIX}${data.correlationId}`);\n if (!existingHook) {\n if (data.eventType === 'hook_disposed') {\n const released = await store.get<{ hookId: string; token: string }>(\n `${HOOK_RELEASE_MARKER_PREFIX}${data.correlationId}`,\n );\n if (released) return { ok: true, releasedHooks: [released] };\n }\n return failure('HOOK_NOT_FOUND', `Hook \"${data.correlationId}\" not found`);\n }\n }\n\n // Non-run_created events require the run to exist (after the resilient\n // start bootstrap had its chance). step_completed / step_retrying skip the\n // run read entirely — their step guard above already proves the run exists.\n if (!skipRunValidation && data.eventType !== 'run_started' && !currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n\n // ============================================================\n // EVENT + ENTITY WRITES (single transaction)\n // ============================================================\n switch (data.eventType) {\n case 'run_created': {\n const existing = await store.get<WorkflowRun>(RUN_KEY);\n if (existing) {\n // Idempotent replay: return the existing run without appending a\n // duplicate run_created event to the log.\n return { ok: true, run: existing, releasedHooks: [] };\n }\n const attributeChanges = Object.entries(data.eventData.attributes ?? {}).map(\n ([key, value]) => ({ key, value }),\n );\n validateAttributeChanges(attributeChanges, {\n allowReservedAttributes: data.eventData.allowReservedAttributes,\n });\n const run = WorkflowRunSchema.parse(\n compact({\n runId,\n deploymentId: data.eventData.deploymentId,\n workflowName: data.eventData.workflowName,\n specVersion,\n executionContext: data.eventData.executionContext,\n attributes: data.eventData.attributes,\n encryptionPublicKey: data.eventData.encryptionPublicKey,\n input: data.eventData.input,\n status: 'pending',\n output: undefined,\n error: undefined,\n startedAt: undefined,\n completedAt: undefined,\n createdAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n return {\n ok: true,\n event,\n run,\n releasedHooks: [],\n runCreated: { workflowName: data.eventData.workflowName, createdAt: now },\n };\n }\n\n case 'run_started': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n // Idempotent for concurrent invocations / queue redeliveries: if the\n // run is already running this is a replay — no duplicate event.\n if (currentRun.status === 'running') {\n const result: ApplyEventSuccess = {\n ok: true,\n run: currentRun,\n releasedHooks: [],\n maxEvents: getMaxEventsPerRun(),\n };\n if (ctx.params?.skipPreload) return result;\n const allEvents = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: getMaxEventsPerRun(), sortOrder: 'asc' },\n (event) => event.eventId,\n );\n return {\n ...result,\n events: allEvents.data,\n cursor: allEvents.cursor,\n hasMore: allEvents.hasMore,\n };\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'running',\n output: undefined,\n error: undefined,\n completedAt: undefined,\n startedAt: currentRun.startedAt ?? now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n // Preload all events so the runtime can skip the initial events.list.\n const result: ApplyEventSuccess = {\n ok: true,\n event,\n run,\n releasedHooks: [],\n runCreated: bootstrapped,\n maxEvents: getMaxEventsPerRun(),\n };\n if (ctx.params?.skipPreload) return result;\n const allEvents = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: getMaxEventsPerRun(), sortOrder: 'asc' },\n (e) => e.eventId,\n );\n return {\n ...result,\n events: allEvents.data,\n cursor: allEvents.cursor,\n hasMore: allEvents.hasMore,\n };\n }\n\n case 'run_completed': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'completed',\n output: data.eventData.output,\n error: undefined,\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n const releasedHooks = await releaseAllHooks(store);\n await releaseAllWaits(store);\n return { ok: true, event, run, releasedHooks };\n }\n\n case 'run_failed': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'failed',\n output: undefined,\n error: toStructuredError(data.eventData.error, {\n code: data.eventData.errorCode ?? readStringProp(data.eventData.error, 'code'),\n }),\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n const releasedHooks = await releaseAllHooks(store);\n await releaseAllWaits(store);\n return { ok: true, event, run, releasedHooks };\n }\n\n case 'run_cancelled': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n status: 'cancelled',\n output: undefined,\n error: undefined,\n completedAt: now,\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n await putEvent(event);\n const releasedHooks = await releaseAllHooks(store);\n await releaseAllWaits(store);\n return { ok: true, event, run, releasedHooks };\n }\n\n case 'attr_set': {\n if (!currentRun) {\n return failure('RUN_NOT_FOUND', `Workflow run \"${runId}\" not found`);\n }\n validateAttributeChanges(data.eventData.changes, {\n existingKeys: Object.keys(currentRun.attributes),\n allowReservedAttributes: data.eventData.allowReservedAttributes,\n });\n const markerKey =\n data.correlationId && data.eventData.writer.type === 'workflow'\n ? `${ATTRIBUTE_EVENT_MARKER_PREFIX}${data.correlationId}`\n : undefined;\n if (markerKey && (await store.get<string>(markerKey)) !== undefined) {\n return failure('ENTITY_CONFLICT', `Attribute event \"${data.correlationId}\" already exists`);\n }\n const run = WorkflowRunSchema.parse(\n compact({\n ...currentRun,\n attributes: applyAttributeChanges(currentRun.attributes, data.eventData.changes),\n updatedAt: now,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(RUN_KEY, run);\n if (markerKey) await store.put(markerKey, event.eventId);\n await putEvent(event);\n return { ok: true, event, run, releasedHooks: [] };\n }\n\n case 'step_created': {\n const stepKey = `${STEP_KEY_PREFIX}${data.correlationId}`;\n const existing = await store.get<Step>(stepKey);\n if (existing) {\n // Core catches EntityConflictError for exactly this replay case\n // (\"Step already exists, continuing\").\n return failure('ENTITY_CONFLICT', `Step \"${data.correlationId}\" already exists`);\n }\n const step = StepSchema.parse(\n compact({\n runId,\n stepId: data.correlationId,\n stepName: data.eventData.stepName,\n status: 'pending',\n input: data.eventData.input,\n output: undefined,\n error: undefined,\n attempt: 0,\n startedAt: undefined,\n completedAt: undefined,\n retryAfter: undefined,\n createdAt: now,\n updatedAt: now,\n specVersion,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(stepKey, step);\n await store.put(\n creationIndexKey(STEP_CREATED_KEY_PREFIX, step.createdAt, step.stepId),\n step.stepId,\n );\n await putEvent(event);\n return { ok: true, event, step, releasedHooks: [] };\n }\n\n case 'step_started': {\n let step = validatedStep;\n let stepCreated = false;\n if (!step && data.eventData?.input !== undefined && data.eventData.stepName) {\n step = StepSchema.parse(\n compact({\n runId,\n stepId: data.correlationId,\n stepName: data.eventData.stepName,\n status: 'pending',\n input: data.eventData.input,\n attempt: 0,\n createdAt: now,\n updatedAt: now,\n specVersion,\n }),\n );\n const createdEvent = buildEvent({\n eventType: 'step_created',\n correlationId: data.correlationId,\n eventData: {\n stepName: data.eventData.stepName,\n workflowName: data.eventData.workflowName,\n input: data.eventData.input,\n },\n });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, step);\n await store.put(\n creationIndexKey(STEP_CREATED_KEY_PREFIX, step.createdAt, step.stepId),\n step.stepId,\n );\n await putEvent(createdEvent);\n stepCreated = true;\n }\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n if (step.retryAfter && step.retryAfter.getTime() > now.getTime()) {\n return failure(\n 'TOO_EARLY',\n `Cannot start step \"${data.correlationId}\": retryAfter timestamp has not been reached yet`,\n {\n retryAfterSeconds: Math.ceil((step.retryAfter.getTime() - now.getTime()) / 1000),\n },\n );\n }\n const updated = StepSchema.parse({\n ...compact({\n ...step,\n status: 'running',\n // Only set startedAt on the first start; increment attempt each start.\n startedAt: step.startedAt ?? now,\n attempt: step.attempt + 1,\n retryAfter: undefined,\n updatedAt: now,\n }),\n error: step.error,\n });\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return {\n ok: true,\n event,\n step: updated,\n releasedHooks: [],\n ...(stepCreated ? { stepCreated: true } : {}),\n };\n }\n\n case 'step_completed': {\n const step = validatedStep;\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n const updated = StepSchema.parse({\n ...compact({\n ...step,\n status: 'completed',\n output: data.eventData.result,\n completedAt: now,\n updatedAt: now,\n }),\n error: step.error,\n });\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return { ok: true, event, step: updated, releasedHooks: [] };\n }\n\n case 'step_failed': {\n const step = validatedStep;\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n // Step errors are opaque runtime serialization, unlike run errors.\n // Preserve bytes and legacy thrown values (including null) verbatim.\n const updated = StepSchema.parse({\n ...step,\n status: 'failed',\n error: data.eventData.error,\n completedAt: now,\n updatedAt: now,\n });\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return { ok: true, event, step: updated, releasedHooks: [] };\n }\n\n case 'step_retrying': {\n const step = validatedStep;\n if (!step) {\n return failure('STEP_NOT_FOUND', `Step \"${data.correlationId}\" not found`);\n }\n const updated = StepSchema.parse({\n ...step,\n status: 'pending',\n error: data.eventData.error,\n retryAfter: data.eventData.retryAfter ? new Date(data.eventData.retryAfter) : undefined,\n updatedAt: now,\n });\n const event = buildEvent({ ...data });\n await store.put(`${STEP_KEY_PREFIX}${data.correlationId}`, updated);\n await putEvent(event);\n return { ok: true, event, step: updated, releasedHooks: [] };\n }\n\n case 'hook_created': {\n const hookId = data.correlationId;\n const token = data.eventData.token;\n const holder = ctx.tokenHolder ?? null;\n const markerKey = `${HOOK_EVENT_MARKER_PREFIX}${hookId}`;\n const hookKey = `${HOOK_KEY_PREFIX}${hookId}`;\n\n if (\n ctx.hookClaimId &&\n (await store.get(hookClaimCancellationKey(ctx.hookClaimId))) !== undefined\n ) {\n return failure(\n 'HOOK_CLAIM_CANCELLED',\n `Hook reservation for \"${hookId}\" was canceled before commit`,\n );\n }\n\n if (holder && (holder.runId !== runId || holder.hookId !== hookId)) {\n // A different (runId, hookId) holds this token. Record a\n // hook_conflict event carrying conflictingRunId so the claiming\n // workflow fails deterministically when the hook is awaited. The\n // legitimate holder's KV index entry is left untouched.\n const event = buildEvent({\n eventType: 'hook_conflict',\n correlationId: hookId,\n eventData: { token, conflictingRunId: holder.runId },\n });\n await putEvent(event);\n return { ok: true, event, releasedHooks: [] };\n }\n\n const existingMarker = await store.get<string>(markerKey);\n if (existingMarker !== undefined) {\n const existingHook = await store.get<Hook>(hookKey);\n if (existingHook && !holder && existingHook.token === token) {\n // Crash orphan: hook + event committed but one or both sharded\n // index writes were lost. Complete the partial write by re-indexing.\n return { ok: true, hook: existingHook, hookToIndex: existingHook, releasedHooks: [] };\n }\n // Fully-committed duplicate (or re-create after disposal): reject so\n // the runtime's concurrent-replay catch path can swallow it.\n return failure('ENTITY_CONFLICT', `Hook \"${hookId}\" already created`);\n }\n\n const hook = HookSchema.parse(\n compact({\n runId,\n hookId,\n token,\n metadata: data.eventData.metadata,\n ownerId: '',\n projectId: '',\n environment: '',\n createdAt: now,\n specVersion,\n isWebhook: data.eventData.isWebhook ?? false,\n isSystem: data.eventData.isSystem,\n tokenRetentionUntil: data.eventData.tokenRetentionUntil,\n }),\n );\n const event = buildEvent({ ...data });\n await store.put(hookKey, hook);\n await store.put(\n creationIndexKey(HOOK_CREATED_KEY_PREFIX, hook.createdAt, hook.hookId),\n hook.hookId,\n );\n await store.put(markerKey, event.eventId);\n await putEvent(event);\n return { ok: true, event, hook, hookToIndex: hook, releasedHooks: [] };\n }\n\n case 'hook_disposed': {\n const hookKey = `${HOOK_KEY_PREFIX}${data.correlationId}`;\n // Existence was validated above; read again for the token.\n const hook = await store.get<Hook>(hookKey);\n if (!hook) {\n return failure('HOOK_NOT_FOUND', `Hook \"${data.correlationId}\" not found`);\n }\n await store.delete(hookKey);\n await store.delete(creationIndexKey(HOOK_CREATED_KEY_PREFIX, hook.createdAt, hook.hookId));\n await store.put(`${HOOK_RELEASE_MARKER_PREFIX}${hook.hookId}`, {\n hookId: hook.hookId,\n token: hook.token,\n });\n const event = buildEvent({ ...data });\n await putEvent(event);\n return {\n ok: true,\n event,\n releasedHooks: [{ hookId: hook.hookId, token: hook.token }],\n };\n }\n\n case 'wait_created': {\n const waitKey = `${WAIT_KEY_PREFIX}${data.correlationId}`;\n if ((await store.get<Wait>(waitKey)) !== undefined) {\n return failure('ENTITY_CONFLICT', `Wait \"${data.correlationId}\" already exists`);\n }\n const wait = WaitSchema.parse({\n waitId: `${runId}-${data.correlationId}`,\n runId,\n status: 'waiting',\n resumeAt: data.eventData.resumeAt,\n createdAt: now,\n updatedAt: now,\n specVersion,\n });\n const event = buildEvent({ ...data });\n await store.put(waitKey, wait);\n await putEvent(event);\n return { ok: true, event, wait, releasedHooks: [] };\n }\n\n case 'wait_completed': {\n const waitKey = `${WAIT_KEY_PREFIX}${data.correlationId}`;\n const existing = await store.get<Wait>(waitKey);\n if (!existing) {\n return failure('WAIT_NOT_FOUND', `Wait \"${data.correlationId}\" not found`);\n }\n if (existing.status === 'completed') {\n return failure('ENTITY_CONFLICT', `Wait \"${data.correlationId}\" already completed`);\n }\n const event = buildEvent({ ...data });\n const wait = WaitSchema.parse({\n ...existing,\n status: 'completed',\n resumeAt: data.eventData?.resumeAt ?? existing.resumeAt,\n completedAt: now,\n updatedAt: now,\n });\n await store.put(waitKey, wait);\n await putEvent(event);\n return { ok: true, event, wait, releasedHooks: [] };\n }\n\n // hook_received and hook_conflict are event-only at the entity level.\n default: {\n const event = buildEvent({ ...data });\n await putEvent(event);\n if (data.eventType === 'hook_received' && ctx.params?.resumeId) {\n await store.put<HookResumeClaim>(`${HOOK_RESUME_CLAIM_PREFIX}${ctx.params.resumeId}`, {\n hookId: data.correlationId,\n eventId: event.eventId,\n ...(ctx.params.resumePayloadDigest\n ? { payloadDigest: ctx.params.resumePayloadDigest }\n : {}),\n });\n }\n return { ok: true, event, releasedHooks: [] };\n }\n }\n}\n\n/**\n * Complete Workflow 5's event-page response after an atomic apply. A celld\n * run is a single serialized writer, so the committed sequence is dense; a\n * stale eventCount therefore needs only the slots between the requested\n * position and the event this call committed.\n */\nexport async function finalizeEventPage(\n store: EventStore,\n outcome: ApplyEventOutcome,\n params?: CreateEventParams,\n): Promise<ApplyEventOutcome> {\n if (!outcome.ok) return outcome;\n const result: ApplyEventSuccess =\n outcome.run && outcome.maxEvents === undefined\n ? { ...outcome, maxEvents: getMaxEventsPerRun() }\n : outcome;\n if (!result.event) return result;\n\n if (params?.preloadEvents && result.event.eventType === 'hook_received') {\n return await attachHookReplayPreload(store, result);\n }\n\n if (typeof params?.sinceCursor === 'string') {\n const page = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: 100, cursor: params.sinceCursor, sortOrder: 'asc' },\n (event) => event.eventId,\n );\n return { ...result, events: page.data, cursor: page.cursor, hasMore: page.hasMore };\n }\n\n if (params?.eventCount === undefined) return result;\n const committedSlot = eventIdToSlot(result.event.eventId);\n if (committedSlot === null || committedSlot <= params.eventCount + 1) return result;\n\n const skippedCount = committedSlot - params.eventCount - 1;\n const page = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n {\n limit: skippedCount,\n cursor: params.eventCount > 0 ? slotToEventId(params.eventCount) : undefined,\n sortOrder: 'asc',\n },\n (event) => event.eventId,\n );\n const events = page.data.filter((event) => event.eventId < result.event!.eventId);\n return {\n ...result,\n events,\n cursor: null,\n hasMore: events.length < skippedCount,\n };\n}\n\n/**\n * Lazy hook resume preload: return the run and its complete replay log with\n * the hook_received write, read in the same transaction, so the runtime can\n * skip its run_started write and the index publication that follows it. The\n * runtime trusts only a complete log with a non-null cursor, so a run that is\n * not started, not running, or over the event ceiling gets the plain result.\n */\nasync function attachHookReplayPreload(\n store: EventStore,\n result: ApplyEventSuccess,\n): Promise<ApplyEventSuccess> {\n const run = await store.get<WorkflowRun>(RUN_KEY);\n if (!run?.startedAt || run.status !== 'running') return result;\n const maxEvents = getMaxEventsPerRun();\n const log = await listByPrefix<Event>(\n store,\n EVENT_KEY_PREFIX,\n { limit: maxEvents, sortOrder: 'asc' },\n (event) => event.eventId,\n );\n const last = log.data.at(-1);\n if (log.hasMore || last === undefined) return result;\n return {\n ...result,\n replayRun: run,\n maxEvents,\n events: log.data,\n // events.list cursors are the last returned event ID (exclusive start).\n cursor: last.eventId,\n hasMore: false,\n };\n}\n","/**\n * RPC wire codec for the Node client <-> worker router HTTP boundary.\n *\n * Extends the shared tagged-JSON format (`{__type:'Uint8Array', data}` +\n * DATE_FIELDS revival) with explicitly tagged Dates: on Cloudflare the DO RPC\n * boundary is structured clone, which preserves EVERY Date — including ones\n * outside the well-known DATE_FIELDS (e.g. inside applyEvent outcomes and\n * user payloads). The HTTP hop must preserve them too, so Dates travel as\n * `{__type:'Date', iso}`.\n *\n * Runs on both sides of the wire, including inside the celld worker — so no\n * Node built-ins (Buffer): base64 uses the native Uint8Array methods or\n * atob/btoa.\n */\nimport { b64decode, b64encode, dateReviver } from './vendor/shared/serialization.js';\n\nfunction rpcReplacer(this: unknown, key: string, value: unknown): unknown {\n // JSON.stringify invokes Date.toJSON before the replacer sees the value;\n // recover the original from the holder object.\n const original =\n this && typeof this === 'object' ? (this as Record<string, unknown>)[key] : undefined;\n if (original instanceof Date) {\n return { __type: 'Date', iso: original.toISOString() };\n }\n if (value instanceof Uint8Array) {\n return { __type: 'Uint8Array', data: b64encode(value) };\n }\n return value;\n}\n\nfunction rpcReviver(key: string, value: unknown): unknown {\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (obj.__type === 'Date') {\n if (typeof obj.iso !== 'string') throw new SyntaxError('Malformed Date tag');\n const date = new Date(obj.iso);\n if (Number.isNaN(date.getTime())) throw new SyntaxError('Malformed Date tag');\n return date;\n }\n if (obj.__type === 'Uint8Array') {\n if (typeof obj.data !== 'string') throw new SyntaxError('Malformed Uint8Array tag');\n try {\n return b64decode(obj.data);\n } catch {\n throw new SyntaxError('Malformed Uint8Array tag');\n }\n }\n }\n // Fallback shared-codec semantics for untagged ISO strings in DATE_FIELDS.\n return dateReviver(key, value);\n}\n\nexport function rpcStringify(value: unknown): string {\n return JSON.stringify(value, rpcReplacer);\n}\n\nexport function rpcParse<T>(text: string): T {\n return JSON.parse(text, rpcReviver) as T;\n}\n","import { isTerminalWorkflowRunStatus, type WorkflowRun } from '@workflow/world';\nimport type { IndexListOptions, IndexListPage } from './indexes.js';\n\n/** Bound cross-run fanout so large list pages cannot create an RPC burst. */\nexport const RUN_LIST_CONCURRENCY = 8;\n/** Largest page the fleet-side list accepts, matching the catalog page limit. */\nexport const MAX_RUN_LIST_LIMIT = 1000;\n\nexport type RunStatus = WorkflowRun['status'];\n\n/** Wire shape of a run listing, shared by the client and the worker router. */\nexport interface RunListRequest {\n workflowName?: string;\n statuses?: RunStatus[];\n limit: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n /** 'none' strips run input and output from the returned page. */\n resolveData?: 'none' | 'all';\n}\n\nexport interface RunListPage {\n data: WorkflowRun[];\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport interface RunListDependencies {\n listRuns(options: IndexListOptions): Promise<IndexListPage>;\n /** The authoritative run, or null when it does not exist or has expired. */\n readRun(runId: string): Promise<WorkflowRun | null>;\n}\n\ninterface RunIndexMetadata {\n runId: string;\n status: RunStatus;\n}\n\n/**\n * Run statuses only move pending -> running -> terminal, and terminal statuses\n * are immutable. An older index value may therefore safely exclude a filter\n * only when it is already terminal, or when the caller asks for pending and\n * the index has advanced beyond pending. Earlier non-terminal metadata cannot\n * exclude a later status because a post-commit index write may need replay.\n */\nfunction indexStatusExcludes(indexed: RunStatus, requested: RunStatus | undefined): boolean {\n if (requested === undefined || indexed === requested) return false;\n return isTerminalWorkflowRunStatus(indexed) || requested === 'pending';\n}\n\nexport function stripRunData(run: WorkflowRun): WorkflowRun {\n const { input: _input, output: _output, ...rest } = run;\n return rest;\n}\n\n/**\n * Page through the run catalog, verifying every candidate against its\n * authoritative run cell. Runs on the client against remote bindings, or in\n * the worker router against fleet bindings.\n */\nexport async function listRunsPage(\n deps: RunListDependencies,\n request: RunListRequest,\n): Promise<RunListPage> {\n const { statuses, limit } = request;\n const prefix = request.workflowName ? `run:${request.workflowName}:` : 'runall:';\n const reverse = request.sortOrder === 'desc';\n const matches: Array<{ key: string; run: WorkflowRun }> = [];\n let scanCursor = request.cursor;\n let exhausted = false;\n\n // Keep scanning index pages until the requested page is full. This\n // prevents status filters and stale derived entries from producing\n // short pages or cursors that skip matching runs.\n while (matches.length <= limit && !exhausted) {\n const kvList = await deps.listRuns({\n prefix,\n limit: Math.min(MAX_RUN_LIST_LIMIT, Math.max(50, limit)),\n cursor: scanCursor,\n reverse,\n });\n if (kvList.keys.length === 0) {\n exhausted = true;\n break;\n }\n\n const candidates: Array<{ key: string; metadata: RunIndexMetadata }> = [];\n for (const key of kvList.keys) {\n const metadata = JSON.parse(key.value) as RunIndexMetadata;\n // Use monotonic status metadata as a conservative prefilter,\n // then still verify every candidate against the authoritative\n // run below. Earlier metadata cannot exclude a later status.\n if (statuses?.every((status) => indexStatusExcludes(metadata.status, status))) {\n continue;\n }\n candidates.push({ key: key.name, metadata });\n }\n\n // Fetch enough candidates to prove the requested page and hasMore,\n // retaining index order while limiting concurrent cross-run reads.\n for (let offset = 0; offset < candidates.length && matches.length <= limit;) {\n const needed = limit + 1 - matches.length;\n const batch = candidates.slice(offset, offset + Math.min(RUN_LIST_CONCURRENCY, needed));\n const resolved = await Promise.all(\n batch.map(async ({ key, metadata }) => {\n const run = await deps.readRun(metadata.runId);\n return run && (statuses === undefined || statuses.includes(run.status))\n ? { key, run }\n : null;\n }),\n );\n for (const match of resolved) {\n if (match) matches.push(match);\n }\n offset += batch.length;\n }\n\n exhausted = kvList.list_complete;\n scanCursor = kvList.cursor ?? kvList.keys.at(-1)?.name;\n }\n\n const hasMore = matches.length > limit;\n const page = matches.slice(0, limit);\n return {\n data: page.map(({ run }) => (request.resolveData === 'none' ? stripRunData(run) : run)),\n cursor: hasMore ? (page.at(-1)?.key ?? null) : null,\n hasMore,\n };\n}\n","import type { RunListPage, RunListRequest } from './run-list.js';\nimport type { WorkflowRun } from '@workflow/world';\nimport type { HookTokenOwner } from './config.js';\nimport type {\n ExpireRunIndexesRequest,\n ExpireRunIndexesResult,\n ReleaseHookIndexesRequest,\n ReleaseHookIndexesResult,\n} from './retention.js';\n\nexport const RUN_CATALOG_SHARDS = 16;\nexport const HOOK_TOKEN_SHARDS = 32;\nexport const HOOK_ID_SHARDS = 32;\n\nconst INDEX_PROTOCOL_VERSION = 'v1';\nconst HOOK_RELEASE_BATCH = 64;\n\nexport interface IndexListOptions {\n prefix?: string;\n cursor?: string;\n /** Exclusive upper bound for creation-time retention scans. */\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\nexport interface IndexListPage {\n /** sourceShard is populated by the merged fleet index for exact follow-up mutation. */\n keys: Array<{ name: string; value: string; sourceShard?: string }>;\n list_complete: boolean;\n cursor?: string;\n}\n\nexport interface RunCatalogShardStub {\n upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }>;\n list(options?: IndexListOptions): Promise<IndexListPage>;\n deleteStaleGlobalRun(\n runId: string,\n key: string,\n expectedValue: string,\n ): Promise<{ deleted: boolean }>;\n expireRun(runId: string, expiredAt: number): Promise<ExpireRunIndexesResult>;\n}\n\nexport type HookClaimResult =\n | { claimed: true; claimId: string }\n | { claimed: false; holder: HookTokenOwner };\n\nexport interface HookReservation {\n claimId: string;\n tokenClaimId?: string;\n hookIdClaimId?: string;\n}\n\nexport type HookReservationResult =\n | { admitted: true; reservation: HookReservation }\n | { admitted: false; holder: HookTokenOwner };\n\nexport interface HookTokenShardStub {\n get(token: string): Promise<string | null>;\n reserve(token: string, owner: HookTokenOwner, proposedClaimId: string): Promise<HookClaimResult>;\n finalize(\n token: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }>;\n releaseClaim(token: string, owner: HookTokenOwner, claimId: string): Promise<void>;\n releaseBatch(\n hooks: Array<{ token: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }>;\n}\n\nexport interface HookIdShardStub {\n get(hookId: string): Promise<string | null>;\n reserve(hookId: string, owner: HookTokenOwner, proposedClaimId: string): Promise<HookClaimResult>;\n publish(\n hookId: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }>;\n releaseClaim(hookId: string, owner: HookTokenOwner, claimId: string): Promise<void>;\n releaseBatch(\n hooks: Array<{ hookId: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }>;\n}\n\ninterface CellIdLike {\n toString(): string;\n}\n\nexport interface CellNamespaceLike<T> {\n idFromName(name: string): CellIdLike;\n get(id: CellIdLike): T;\n}\n\nexport interface WorkflowIndexBindings {\n runCatalog: CellNamespaceLike<RunCatalogShardStub>;\n hookTokens: CellNamespaceLike<HookTokenShardStub>;\n hookIds: CellNamespaceLike<HookIdShardStub>;\n}\n\n/** High-level client used by the World storage layer and retention coordinator. */\nexport interface WorkflowIndex {\n commitRun(\n run: WorkflowRun,\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }>;\n listRuns(options?: IndexListOptions): Promise<IndexListPage>;\n /**\n * Remote only: the complete run listing performed inside the fleet. Resolves\n * to null when the worker predates the route; the caller then lists itself.\n */\n listResolvedRuns?(request: RunListRequest): Promise<RunListPage | null>;\n getHookByToken(token: string): Promise<string | null>;\n getHookById(hookId: string): Promise<string | null>;\n reserveHook(token: string, owner: HookTokenOwner): Promise<HookReservationResult>;\n finalizeHookIndexes(\n token: string,\n hookId: string,\n serializedHook: string,\n owner: HookTokenOwner,\n reservation?: HookReservation,\n ): Promise<void>;\n releaseHookReservation(\n token: string,\n owner: HookTokenOwner,\n reservation: HookReservation,\n ): Promise<void>;\n releaseHookIndexes(request: ReleaseHookIndexesRequest): Promise<ReleaseHookIndexesResult>;\n expireRun(request: ExpireRunIndexesRequest): Promise<ExpireRunIndexesResult>;\n}\n\n/** Stable FNV-1a routing hash. Collisions share a shard but never a storage key. */\nexport function stableIndexHash(value: string): number {\n let hash = 0x811c9dc5;\n for (const byte of new TextEncoder().encode(value)) {\n hash ^= byte;\n hash = Math.imul(hash, 0x01000193);\n }\n return hash >>> 0;\n}\n\nfunction shardName(domain: string, value: string, cardinality: number): string {\n const width = Math.max(2, (cardinality - 1).toString(16).length);\n const shard = stableIndexHash(value) % cardinality;\n return `${domain}:${INDEX_PROTOCOL_VERSION}:${shard.toString(16).padStart(width, '0')}`;\n}\n\nexport function runCatalogShardName(runId: string): string {\n return shardName('run-catalog', runId, RUN_CATALOG_SHARDS);\n}\n\nexport function hookTokenShardName(token: string): string {\n return shardName('hook-token', token, HOOK_TOKEN_SHARDS);\n}\n\nexport function hookIdShardName(hookId: string): string {\n return shardName('hook-id', hookId, HOOK_ID_SHARDS);\n}\n\nexport function allRunCatalogShardNames(): string[] {\n return Array.from(\n { length: RUN_CATALOG_SHARDS },\n (_, shard) => `run-catalog:${INDEX_PROTOCOL_VERSION}:${shard.toString(16).padStart(2, '0')}`,\n );\n}\n\n/** Catalog metadata for a run; the client and the worker router must agree on it. */\nexport function runIndexMetadata(run: Pick<WorkflowRun, 'runId' | 'createdAt' | 'status'>): string {\n return JSON.stringify({\n runId: run.runId,\n createdAt: run.createdAt.toISOString(),\n status: run.status,\n });\n}\n\nfunction stub<T>(namespace: CellNamespaceLike<T>, name: string): T {\n return namespace.get(namespace.idFromName(name));\n}\n\nfunction runKeys(run: Pick<WorkflowRun, 'runId' | 'workflowName' | 'createdAt'>): string[] {\n const timestamp = run.createdAt.getTime().toString().padStart(13, '0');\n return [`run:${run.workflowName}:${timestamp}:${run.runId}`, `runall:${timestamp}:${run.runId}`];\n}\n\nfunction groupByShard<T>(values: T[], route: (value: T) => string): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n for (const value of values) {\n const name = route(value);\n const group = groups.get(name);\n if (group) group.push(value);\n else groups.set(name, [value]);\n }\n return groups;\n}\n\nfunction sameOwner(left: HookTokenOwner, right: HookTokenOwner): boolean {\n return left.runId === right.runId && left.hookId === right.hookId;\n}\n\nfunction compareBytes(left: Uint8Array, right: Uint8Array): number {\n const length = Math.min(left.byteLength, right.byteLength);\n for (let index = 0; index < length; index++) {\n const difference = left[index] - right[index];\n if (difference !== 0) return difference;\n }\n return left.byteLength - right.byteLength;\n}\n\nasync function inBatches<T>(\n values: T[],\n operation: (batch: T[]) => Promise<{ deleted: number }>,\n): Promise<number> {\n let deleted = 0;\n for (let offset = 0; offset < values.length; offset += HOOK_RELEASE_BATCH) {\n deleted += (await operation(values.slice(offset, offset + HOOK_RELEASE_BATCH))).deleted;\n }\n return deleted;\n}\n\nexport function createWorkflowIndex(bindings: WorkflowIndexBindings): WorkflowIndex {\n const releaseHooks = async (request: ReleaseHookIndexesRequest): Promise<number> => {\n const tokenGroups = groupByShard(request.hooks, (hook) => hookTokenShardName(hook.token));\n const idGroups = groupByShard(request.hooks, (hook) => hookIdShardName(hook.hookId));\n const releases: Array<Promise<number>> = [];\n for (const [name, hooks] of tokenGroups) {\n const target = stub(bindings.hookTokens, name);\n releases.push(\n inBatches(\n hooks.map((hook) => ({\n token: hook.token,\n owner: { runId: request.runId, hookId: hook.hookId },\n })),\n (batch) => target.releaseBatch(batch),\n ),\n );\n }\n for (const [name, hooks] of idGroups) {\n const target = stub(bindings.hookIds, name);\n releases.push(\n inBatches(\n hooks.map((hook) => ({\n hookId: hook.hookId,\n owner: { runId: request.runId, hookId: hook.hookId },\n })),\n (batch) => target.releaseBatch(batch),\n ),\n );\n }\n return (await Promise.all(releases)).reduce((total, count) => total + count, 0);\n };\n\n return {\n async commitRun(run, serializedMetadata, publicationExpiresAt) {\n return await stub(bindings.runCatalog, runCatalogShardName(run.runId)).upsertRun(\n run.runId,\n runKeys(run),\n serializedMetadata,\n publicationExpiresAt,\n );\n },\n\n async listRuns(options) {\n const suppliedLimit = options?.limit;\n const requestedLimit =\n typeof suppliedLimit === 'number' && Number.isFinite(suppliedLimit)\n ? Math.floor(suppliedLimit)\n : 1000;\n const limit = Math.min(1000, Math.max(1, requestedLimit));\n const shardNames = allRunCatalogShardNames();\n const pages = await Promise.all(\n shardNames.map((name) =>\n stub(bindings.runCatalog, name).list({ ...options, limit: limit + 1 }),\n ),\n );\n const encoder = new TextEncoder();\n const candidates = pages\n .flatMap((shardPage, shardIndex) =>\n shardPage.keys.map((entry) => ({\n entry: { ...entry, sourceShard: shardNames[shardIndex] },\n encodedName: encoder.encode(entry.name),\n })),\n )\n .toSorted((left, right) => {\n const compared = compareBytes(left.encodedName, right.encodedName);\n return options?.reverse ? -compared : compared;\n });\n const page = candidates.slice(0, limit).map(({ entry }) => entry);\n const listComplete =\n candidates.length <= limit && pages.every((entry) => entry.list_complete);\n return {\n keys: page,\n list_complete: listComplete,\n cursor: listComplete ? undefined : page.at(-1)?.name,\n };\n },\n\n getHookByToken(token) {\n return stub(bindings.hookTokens, hookTokenShardName(token)).get(token);\n },\n\n getHookById(hookId) {\n return stub(bindings.hookIds, hookIdShardName(hookId)).get(hookId);\n },\n\n async reserveHook(token, owner) {\n const proposedClaimId = crypto.randomUUID();\n const tokenTarget = stub(bindings.hookTokens, hookTokenShardName(token));\n const tokenClaim = await tokenTarget.reserve(token, owner, proposedClaimId);\n if (!tokenClaim.claimed && !sameOwner(tokenClaim.holder, owner)) {\n return { admitted: false, holder: tokenClaim.holder };\n }\n\n const tokenClaimId = tokenClaim.claimed ? tokenClaim.claimId : undefined;\n const hookIdTarget = stub(bindings.hookIds, hookIdShardName(owner.hookId));\n const sharedClaimId = tokenClaimId ?? proposedClaimId;\n let hookIdClaim: HookClaimResult;\n try {\n hookIdClaim = await hookIdTarget.reserve(owner.hookId, owner, sharedClaimId);\n } catch (error) {\n await Promise.allSettled([\n ...(tokenClaimId ? [tokenTarget.releaseClaim(token, owner, tokenClaimId)] : []),\n hookIdTarget.releaseClaim(owner.hookId, owner, sharedClaimId),\n ]);\n throw error;\n }\n if (!hookIdClaim.claimed) {\n if (tokenClaimId) await tokenTarget.releaseClaim(token, owner, tokenClaimId);\n return { admitted: false, holder: hookIdClaim.holder };\n }\n\n const reservation: HookReservation = {\n claimId: `${tokenClaimId ?? '-'}:${hookIdClaim.claimId}`,\n tokenClaimId,\n hookIdClaimId: hookIdClaim.claimId,\n };\n return { admitted: true, reservation };\n },\n\n async finalizeHookIndexes(token, hookId, serializedHook, owner, reservation) {\n const tokenResult = await stub(bindings.hookTokens, hookTokenShardName(token)).finalize(\n token,\n serializedHook,\n owner,\n reservation?.tokenClaimId,\n );\n if (!tokenResult.stored) return;\n await stub(bindings.hookIds, hookIdShardName(hookId)).publish(\n hookId,\n serializedHook,\n owner,\n reservation?.hookIdClaimId,\n );\n },\n\n async releaseHookReservation(token, owner, reservation) {\n const releases: Array<Promise<void>> = [];\n if (reservation.tokenClaimId) {\n releases.push(\n stub(bindings.hookTokens, hookTokenShardName(token)).releaseClaim(\n token,\n owner,\n reservation.tokenClaimId,\n ),\n );\n }\n if (reservation.hookIdClaimId) {\n releases.push(\n stub(bindings.hookIds, hookIdShardName(owner.hookId)).releaseClaim(\n owner.hookId,\n owner,\n reservation.hookIdClaimId,\n ),\n );\n }\n await Promise.all(releases);\n },\n\n async releaseHookIndexes(request) {\n return { deleted: await releaseHooks(request) };\n },\n\n async expireRun(request) {\n const [catalog, hookDeletes] = await Promise.all([\n stub(bindings.runCatalog, runCatalogShardName(request.runId)).expireRun(\n request.runId,\n request.expiredAt,\n ),\n releaseHooks({ runId: request.runId, hooks: request.hooks }),\n ]);\n return { deleted: catalog.deleted + hookDeletes };\n },\n };\n}\n","/**\n * Hard-cutover stream protocol shared by the client, Worker router, and\n * StreamDO. Chunk payloads use a compact binary envelope on the public HTTP\n * boundary and Uint8Array values on the DO/storage boundary.\n */\n\nexport const STREAM_BATCH_CONTENT_TYPE = 'application/vnd.world-celld.stream-batch.v1';\n\n/**\n * Chunks per write request that every worker accepts. A client sends larger\n * batches only after a worker advertises {@link STREAM_CHUNK_LIMIT_HEADER}.\n */\nexport const MAX_STREAM_WRITE_CHUNKS = 32;\n/** A chunk remains below the 2 MiB SQLite-backed DO key/value limit. */\nexport const MAX_STREAM_CHUNK_BYTES = 1024 * 1024;\n/** Keeps serialized RPC bodies well below the 32 MiB Workers RPC limit. */\nexport const MAX_STREAM_BATCH_BYTES = 8 * 1024 * 1024;\n/** Chunks per read request that every worker accepts; see {@link MAX_STREAM_WRITE_CHUNKS}. */\nexport const MAX_STREAM_READ_CHUNKS = 32;\n/** Chunks per write or read request accepted by a worker that advertises the header below. */\nexport const NEGOTIATED_STREAM_CHUNKS = 512;\n/** Response header on stream requests: the per-request chunk limit this worker accepts. */\nexport const STREAM_CHUNK_LIMIT_HEADER = 'x-world-celld-stream-chunks';\nexport const MAX_STREAM_READ_BYTES = 8 * 1024 * 1024;\nexport const MAX_STREAM_ERROR_BYTES = 16 * 1024;\n/** Must remain below the default 30 second fleet request deadline. */\nexport const MAX_STREAM_LONG_POLL_MS = 20_000;\n\nexport type StreamTerminalState = 'open' | 'closed' | 'errored' | 'expired';\n\nexport interface StreamErrorData {\n name: string;\n message: string;\n}\n\nexport interface StreamWriteResult {\n startIndex: number;\n count: number;\n tailIndex: number;\n}\n\nexport interface StreamReadRequest {\n runId: string;\n startIndex: number;\n maxChunks: number;\n maxBytes: number;\n waitMs: number;\n}\n\nexport interface StreamReadResult {\n startIndex: number;\n tailIndex: number;\n chunks: Uint8Array[];\n state: StreamTerminalState;\n timedOut: boolean;\n error?: StreamErrorData;\n}\n\nconst WRITE_MAGIC = 0x57435357; // WCSW\nconst WRITE_ACK_MAGIC = 0x57435341; // WCSA\nconst READ_MAGIC = 0x57435352; // WCSR\nconst PROTOCOL_VERSION = 1;\nconst WRITE_HEADER_BYTES = 8;\nconst WRITE_ACK_BYTES = 16;\nconst READ_HEADER_BYTES = 28;\n\nconst STATE_TO_WIRE: Record<StreamTerminalState, number> = {\n open: 0,\n closed: 1,\n errored: 2,\n expired: 3,\n};\n\nconst WIRE_TO_STATE: readonly StreamTerminalState[] = ['open', 'closed', 'errored', 'expired'];\n\nfunction protocolError(message: string): Error {\n const error = new Error(`world-celld: invalid stream protocol: ${message}`);\n error.name = 'StreamProtocolError';\n return error;\n}\n\nfunction requireSafeIndex(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value < -1 || value > 0x7fffffff) {\n throw protocolError(`${field} is out of range`);\n }\n}\n\n/** An older worker rejects an oversized request before it touches the stream. */\nexport function isChunkLimitRejection(error: unknown): boolean {\n const candidate = error as { status?: unknown; message?: unknown } | null;\n return (\n candidate?.status === 400 &&\n typeof candidate.message === 'string' &&\n /batch exceeds \\d+ chunks|maxChunks must be (?:an integer )?between/.test(candidate.message)\n );\n}\n\nexport function validateStreamWriteChunks(chunks: readonly Uint8Array[]): number {\n if (chunks.length === 0) throw protocolError('batch must contain at least one chunk');\n if (chunks.length > NEGOTIATED_STREAM_CHUNKS) {\n throw protocolError(`batch exceeds ${NEGOTIATED_STREAM_CHUNKS} chunks`);\n }\n\n let totalBytes = 0;\n for (const chunk of chunks) {\n if (!(chunk instanceof Uint8Array)) throw protocolError('chunk is not binary data');\n if (chunk.byteLength > MAX_STREAM_CHUNK_BYTES) {\n throw protocolError(`chunk exceeds ${MAX_STREAM_CHUNK_BYTES} bytes`);\n }\n totalBytes += chunk.byteLength;\n if (totalBytes > MAX_STREAM_BATCH_BYTES) {\n throw protocolError(`batch exceeds ${MAX_STREAM_BATCH_BYTES} bytes`);\n }\n }\n return totalBytes;\n}\n\nexport function validateStreamReadRequest(request: StreamReadRequest): void {\n if (!request.runId) throw protocolError('runId is required');\n if (\n !Number.isSafeInteger(request.startIndex) ||\n request.startIndex < 0 ||\n request.startIndex > 0x7fffffff\n ) {\n throw protocolError('startIndex must be between 0 and 2147483647');\n }\n if (\n !Number.isSafeInteger(request.maxChunks) ||\n request.maxChunks < 0 ||\n request.maxChunks > NEGOTIATED_STREAM_CHUNKS\n ) {\n throw protocolError(`maxChunks must be between 0 and ${NEGOTIATED_STREAM_CHUNKS}`);\n }\n if (\n !Number.isSafeInteger(request.maxBytes) ||\n request.maxBytes < MAX_STREAM_CHUNK_BYTES ||\n request.maxBytes > MAX_STREAM_READ_BYTES\n ) {\n throw protocolError(\n `maxBytes must be between ${MAX_STREAM_CHUNK_BYTES} and ${MAX_STREAM_READ_BYTES}`,\n );\n }\n if (\n !Number.isSafeInteger(request.waitMs) ||\n request.waitMs < 0 ||\n request.waitMs > MAX_STREAM_LONG_POLL_MS\n ) {\n throw protocolError(`waitMs must be between 0 and ${MAX_STREAM_LONG_POLL_MS}`);\n }\n}\n\nexport function encodeStreamWriteBatch(chunks: readonly Uint8Array[]): Uint8Array {\n const totalBytes = validateStreamWriteChunks(chunks);\n const encoded = new Uint8Array(WRITE_HEADER_BYTES + chunks.length * 4 + totalBytes);\n const view = new DataView(encoded.buffer);\n view.setUint32(0, WRITE_MAGIC);\n view.setUint16(4, PROTOCOL_VERSION);\n view.setUint16(6, chunks.length);\n\n let offset = WRITE_HEADER_BYTES;\n for (const chunk of chunks) {\n view.setUint32(offset, chunk.byteLength);\n offset += 4;\n encoded.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return encoded;\n}\n\nexport function decodeStreamWriteBatch(encoded: Uint8Array): Uint8Array[] {\n if (encoded.byteLength < WRITE_HEADER_BYTES) throw protocolError('truncated write header');\n const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);\n if (view.getUint32(0) !== WRITE_MAGIC) throw protocolError('bad write magic');\n if (view.getUint16(4) !== PROTOCOL_VERSION) throw protocolError('unsupported write version');\n const count = view.getUint16(6);\n const chunks: Uint8Array[] = [];\n let offset = WRITE_HEADER_BYTES;\n for (let index = 0; index < count; index++) {\n if (offset + 4 > encoded.byteLength) throw protocolError('truncated chunk length');\n const length = view.getUint32(offset);\n offset += 4;\n if (offset + length > encoded.byteLength) throw protocolError('truncated chunk data');\n // Persisted DO values are structured-cloned. A view would retain the\n // complete batch backing buffer and could exceed the per-value storage\n // limit even when this individual chunk is valid.\n chunks.push(new Uint8Array(encoded.subarray(offset, offset + length)));\n offset += length;\n }\n if (offset !== encoded.byteLength) throw protocolError('trailing write data');\n validateStreamWriteChunks(chunks);\n return chunks;\n}\n\nexport function encodeStreamWriteResult(result: StreamWriteResult): Uint8Array {\n requireSafeIndex(result.startIndex, 'startIndex');\n requireSafeIndex(result.tailIndex, 'tailIndex');\n if (\n !Number.isSafeInteger(result.count) ||\n result.count < 1 ||\n result.count > NEGOTIATED_STREAM_CHUNKS\n ) {\n throw protocolError('write count is out of range');\n }\n const encoded = new Uint8Array(WRITE_ACK_BYTES);\n const view = new DataView(encoded.buffer);\n view.setUint32(0, WRITE_ACK_MAGIC);\n view.setUint16(4, PROTOCOL_VERSION);\n view.setUint16(6, result.count);\n view.setInt32(8, result.startIndex);\n view.setInt32(12, result.tailIndex);\n return encoded;\n}\n\nexport function decodeStreamWriteResult(encoded: Uint8Array): StreamWriteResult {\n if (encoded.byteLength !== WRITE_ACK_BYTES) throw protocolError('invalid write response size');\n const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);\n if (view.getUint32(0) !== WRITE_ACK_MAGIC) throw protocolError('bad write response magic');\n if (view.getUint16(4) !== PROTOCOL_VERSION) {\n throw protocolError('unsupported write response version');\n }\n const count = view.getUint16(6);\n if (count < 1 || count > NEGOTIATED_STREAM_CHUNKS) {\n throw protocolError('write response count is out of range');\n }\n const result = {\n count,\n startIndex: view.getInt32(8),\n tailIndex: view.getInt32(12),\n };\n requireSafeIndex(result.startIndex, 'startIndex');\n requireSafeIndex(result.tailIndex, 'tailIndex');\n if (result.tailIndex !== result.startIndex + result.count - 1) {\n throw protocolError('write response offsets are inconsistent');\n }\n return result;\n}\n\nexport function encodeStreamReadResult(result: StreamReadResult): Uint8Array {\n requireSafeIndex(result.startIndex, 'startIndex');\n requireSafeIndex(result.tailIndex, 'tailIndex');\n let chunkBytes = 0;\n for (const chunk of result.chunks) chunkBytes += 4 + chunk.byteLength;\n if (\n result.chunks.length > NEGOTIATED_STREAM_CHUNKS ||\n chunkBytes > MAX_STREAM_READ_BYTES + 4 * NEGOTIATED_STREAM_CHUNKS\n ) {\n throw protocolError('read result exceeds configured bounds');\n }\n\n const encoder = new TextEncoder();\n const errorName = result.error ? encoder.encode(result.error.name) : new Uint8Array();\n const errorMessage = result.error ? encoder.encode(result.error.message) : new Uint8Array();\n if (errorName.byteLength + errorMessage.byteLength > MAX_STREAM_ERROR_BYTES) {\n throw protocolError(`stream error exceeds ${MAX_STREAM_ERROR_BYTES} bytes`);\n }\n const encoded = new Uint8Array(\n READ_HEADER_BYTES + chunkBytes + errorName.byteLength + errorMessage.byteLength,\n );\n const view = new DataView(encoded.buffer);\n view.setUint32(0, READ_MAGIC);\n view.setUint8(4, PROTOCOL_VERSION);\n const state = STATE_TO_WIRE[result.state];\n if (state === undefined) throw protocolError('unknown stream state');\n view.setUint8(5, state);\n view.setUint8(6, result.timedOut ? 1 : 0);\n view.setUint8(7, 0);\n view.setInt32(8, result.startIndex);\n view.setInt32(12, result.tailIndex);\n view.setUint32(16, result.chunks.length);\n view.setUint32(20, errorName.byteLength);\n view.setUint32(24, errorMessage.byteLength);\n\n let offset = READ_HEADER_BYTES;\n for (const chunk of result.chunks) {\n view.setUint32(offset, chunk.byteLength);\n offset += 4;\n encoded.set(chunk, offset);\n offset += chunk.byteLength;\n }\n encoded.set(errorName, offset);\n offset += errorName.byteLength;\n encoded.set(errorMessage, offset);\n return encoded;\n}\n\nexport function decodeStreamReadResult(encoded: Uint8Array): StreamReadResult {\n if (encoded.byteLength < READ_HEADER_BYTES) throw protocolError('truncated read header');\n const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);\n if (view.getUint32(0) !== READ_MAGIC) throw protocolError('bad read magic');\n if (view.getUint8(4) !== PROTOCOL_VERSION) throw protocolError('unsupported read version');\n const state = WIRE_TO_STATE[view.getUint8(5)];\n if (!state) throw protocolError('unknown stream state');\n const startIndex = view.getInt32(8);\n const tailIndex = view.getInt32(12);\n requireSafeIndex(startIndex, 'startIndex');\n requireSafeIndex(tailIndex, 'tailIndex');\n const count = view.getUint32(16);\n const errorNameLength = view.getUint32(20);\n const errorMessageLength = view.getUint32(24);\n if (count > NEGOTIATED_STREAM_CHUNKS) throw protocolError('read chunk count exceeds limit');\n if (errorNameLength + errorMessageLength > MAX_STREAM_ERROR_BYTES) {\n throw protocolError('read error exceeds limit');\n }\n\n const chunks: Uint8Array[] = [];\n let offset = READ_HEADER_BYTES;\n let totalBytes = 0;\n for (let index = 0; index < count; index++) {\n if (offset + 4 > encoded.byteLength) throw protocolError('truncated read chunk length');\n const length = view.getUint32(offset);\n offset += 4;\n if (offset + length > encoded.byteLength) throw protocolError('truncated read chunk data');\n totalBytes += length;\n if (totalBytes > MAX_STREAM_READ_BYTES) throw protocolError('read bytes exceed limit');\n chunks.push(encoded.subarray(offset, offset + length));\n offset += length;\n }\n\n if (offset + errorNameLength + errorMessageLength !== encoded.byteLength) {\n throw protocolError('invalid read error payload');\n }\n const decoder = new TextDecoder();\n const error =\n errorNameLength > 0 || errorMessageLength > 0\n ? {\n name: decoder.decode(encoded.subarray(offset, offset + errorNameLength)),\n message: decoder.decode(encoded.subarray(offset + errorNameLength)),\n }\n : undefined;\n\n return {\n startIndex,\n tailIndex,\n chunks,\n state,\n timedOut: (view.getUint8(6) & 1) !== 0,\n error,\n };\n}\n\nexport function normalizeStreamError(error: unknown): StreamErrorData {\n let normalized: StreamErrorData;\n if (error instanceof Error) {\n normalized = { name: error.name || 'Error', message: error.message };\n } else if (typeof error === 'string') {\n normalized = { name: 'Error', message: error };\n } else if (\n error &&\n typeof error === 'object' &&\n typeof (error as { name?: unknown }).name === 'string' &&\n typeof (error as { message?: unknown }).message === 'string'\n ) {\n normalized = {\n name: (error as StreamErrorData).name,\n message: (error as StreamErrorData).message,\n };\n } else {\n normalized = { name: 'Error', message: String(error) };\n }\n\n // Bound persisted terminal metadata as well as its binary response frame.\n normalized.name = normalized.name.slice(0, 1024);\n normalized.message = normalized.message.slice(0, 4096);\n while (\n new TextEncoder().encode(normalized.name).byteLength +\n new TextEncoder().encode(normalized.message).byteLength >\n MAX_STREAM_ERROR_BYTES\n ) {\n normalized.message = normalized.message.slice(0, Math.max(0, normalized.message.length - 256));\n if (normalized.message.length === 0) {\n normalized.name = normalized.name.slice(0, Math.max(0, normalized.name.length - 256));\n }\n }\n return normalized;\n}\n","import { HookSchema, WorkflowRunSchema, type WorkflowRun } from '@workflow/world';\nimport type { HookTokenOwner } from '../config.js';\nimport type { HookReservation, IndexListOptions } from '../indexes.js';\nimport { MAX_RUN_LIST_LIMIT, type RunListRequest, type RunStatus } from '../run-list.js';\nimport type { ExpireRunIndexesRequest, ReleaseHookIndexesRequest } from '../retention.js';\nimport { isRecord } from '../validation.js';\nimport { parse } from '../vendor/shared/index.js';\n\nexport type IndexOperation =\n | 'runs.list'\n | 'runs.list-resolved'\n | 'runs.commit'\n | 'runs.expire'\n | 'hooks.reserve'\n | 'hooks.finalize'\n | 'hooks.release-reservation'\n | 'hooks.release';\n\nexport type ValidatedIndexRequest =\n | { operation: 'runs.list'; args: [IndexListOptions | undefined] }\n | { operation: 'runs.list-resolved'; args: [RunListRequest] }\n | { operation: 'runs.commit'; args: [WorkflowRun, string, number] }\n | { operation: 'runs.expire'; args: [ExpireRunIndexesRequest] }\n | { operation: 'hooks.reserve'; args: [string, HookTokenOwner] }\n | {\n operation: 'hooks.finalize';\n args: [string, string, string, HookTokenOwner, HookReservation | undefined];\n }\n | {\n operation: 'hooks.release-reservation';\n args: [string, HookTokenOwner, HookReservation];\n }\n | { operation: 'hooks.release'; args: [ReleaseHookIndexesRequest] };\n\nfunction invalid(message: string): never {\n const error = new Error(`invalid index RPC arguments: ${message}`);\n error.name = 'RequestValidationError';\n throw error;\n}\n\nfunction exactArgs(args: unknown[], count: number): void {\n if (args.length !== count) invalid(`expected ${count} argument(s)`);\n}\n\nfunction nonEmptyString(value: unknown, name: string): string {\n if (typeof value !== 'string' || value.length === 0)\n invalid(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction stringValue(value: unknown, name: string): string {\n if (typeof value !== 'string') invalid(`${name} must be a string`);\n return value;\n}\n\nfunction nonNegativeSafeInteger(value: unknown, name: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n invalid(`${name} must be a non-negative safe integer`);\n }\n return value as number;\n}\n\nfunction positiveSafeInteger(value: unknown, name: string): number {\n const parsed = nonNegativeSafeInteger(value, name);\n if (parsed === 0) invalid(`${name} must be a positive safe integer`);\n return parsed;\n}\n\nfunction owner(value: unknown, name = 'owner'): HookTokenOwner {\n if (!isRecord(value)) invalid(`${name} must be an object`);\n return {\n runId: nonEmptyString(value.runId, `${name}.runId`),\n hookId: nonEmptyString(value.hookId, `${name}.hookId`),\n };\n}\n\nfunction reservation(value: unknown): HookReservation {\n if (!isRecord(value)) invalid('reservation must be an object');\n const parsed: HookReservation = {\n claimId: nonEmptyString(value.claimId, 'reservation.claimId'),\n };\n if (value.tokenClaimId !== undefined) {\n parsed.tokenClaimId = nonEmptyString(value.tokenClaimId, 'reservation.tokenClaimId');\n }\n if (value.hookIdClaimId !== undefined) {\n parsed.hookIdClaimId = nonEmptyString(value.hookIdClaimId, 'reservation.hookIdClaimId');\n }\n return parsed;\n}\n\nfunction hooks(value: unknown): Array<{ hookId: string; token: string }> {\n if (!Array.isArray(value)) invalid('hooks must be an array');\n return value.map((entry, index) => {\n if (!isRecord(entry)) invalid(`hooks[${index}] must be an object`);\n return {\n hookId: nonEmptyString(entry.hookId, `hooks[${index}].hookId`),\n token: nonEmptyString(entry.token, `hooks[${index}].token`),\n };\n });\n}\n\nfunction exactProperties(value: Record<string, unknown>, allowed: string[], name: string): void {\n const unexpected = Object.keys(value).find((key) => !allowed.includes(key));\n if (unexpected !== undefined) invalid(`${name}.${unexpected} is not allowed`);\n}\n\nfunction releaseRequest(value: unknown): ReleaseHookIndexesRequest {\n if (!isRecord(value)) invalid('release request must be an object');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n };\n}\n\nfunction expireRequest(value: unknown): ExpireRunIndexesRequest {\n if (!isRecord(value)) invalid('expiry request must be an object');\n exactProperties(value, ['runId', 'hooks', 'expiredAt'], 'request');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n expiredAt: nonNegativeSafeInteger(value.expiredAt, 'request.expiredAt'),\n };\n}\n\nfunction listOptions(value: unknown): IndexListOptions | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isRecord(value)) invalid('list options must be an object');\n const parsed: IndexListOptions = {};\n for (const name of ['prefix', 'cursor', 'end'] as const) {\n if (value[name] !== undefined) parsed[name] = stringValue(value[name], `options.${name}`);\n }\n if (value.limit !== undefined) {\n const limit = value.limit;\n if (!Number.isSafeInteger(limit) || (limit as number) < 1 || (limit as number) > 1000) {\n invalid('options.limit must be an integer between 1 and 1000');\n }\n parsed.limit = limit as number;\n }\n if (value.reverse !== undefined) {\n if (typeof value.reverse !== 'boolean') invalid('options.reverse must be a boolean');\n parsed.reverse = value.reverse;\n }\n return parsed;\n}\n\nconst RUN_STATUSES = new Set<RunStatus>(['pending', 'running', 'completed', 'failed', 'cancelled']);\n\nfunction runListRequest(value: unknown): RunListRequest {\n if (!isRecord(value)) invalid('run list request must be an object');\n const limit = value.limit;\n if (\n !Number.isSafeInteger(limit) ||\n (limit as number) < 1 ||\n (limit as number) > MAX_RUN_LIST_LIMIT\n ) {\n invalid(`request.limit must be an integer between 1 and ${MAX_RUN_LIST_LIMIT}`);\n }\n const parsed: RunListRequest = { limit: limit as number };\n if (value.workflowName !== undefined) {\n parsed.workflowName = nonEmptyString(value.workflowName, 'request.workflowName');\n }\n if (value.cursor !== undefined) parsed.cursor = stringValue(value.cursor, 'request.cursor');\n if (value.statuses !== undefined) {\n if (\n !Array.isArray(value.statuses) ||\n value.statuses.length === 0 ||\n !value.statuses.every((status) => RUN_STATUSES.has(status as RunStatus))\n ) {\n invalid('request.statuses must be a non-empty array of run statuses');\n }\n parsed.statuses = value.statuses as RunStatus[];\n }\n if (value.sortOrder !== undefined) {\n if (value.sortOrder !== 'asc' && value.sortOrder !== 'desc') {\n invalid(\"request.sortOrder must be 'asc' or 'desc'\");\n }\n parsed.sortOrder = value.sortOrder;\n }\n if (value.resolveData !== undefined) {\n if (value.resolveData !== 'none' && value.resolveData !== 'all') {\n invalid(\"request.resolveData must be 'none' or 'all'\");\n }\n parsed.resolveData = value.resolveData;\n }\n return parsed;\n}\n\nfunction runCommit(args: unknown[]): ValidatedIndexRequest {\n exactArgs(args, 3);\n const parsedRun = WorkflowRunSchema.safeParse(args[0]);\n if (!parsedRun.success) invalid('run does not match WorkflowRunSchema');\n const run = parsedRun.data;\n nonEmptyString(run.runId, 'run.runId');\n nonEmptyString(run.workflowName, 'run.workflowName');\n nonEmptyString(run.deploymentId, 'run.deploymentId');\n const serializedMetadata = nonEmptyString(args[1], 'serializedMetadata');\n let metadata: unknown;\n try {\n metadata = JSON.parse(serializedMetadata);\n } catch {\n invalid('serializedMetadata must be valid JSON');\n }\n if (\n !isRecord(metadata) ||\n metadata.runId !== run.runId ||\n metadata.status !== run.status ||\n metadata.createdAt !== run.createdAt.toISOString()\n ) {\n invalid('serializedMetadata must match the committed run');\n }\n const publicationExpiresAt = positiveSafeInteger(args[2], 'publicationExpiresAt');\n return { operation: 'runs.commit', args: [run, serializedMetadata, publicationExpiresAt] };\n}\n\nfunction hookFinalize(args: unknown[]): ValidatedIndexRequest {\n if (args.length !== 4 && args.length !== 5) invalid('expected 4 or 5 arguments');\n const token = nonEmptyString(args[0], 'token');\n const hookId = nonEmptyString(args[1], 'hookId');\n const serializedHook = nonEmptyString(args[2], 'serializedHook');\n const hookOwner = owner(args[3]);\n if (hookOwner.hookId !== hookId) invalid('owner.hookId must match hookId');\n let decodedHook: unknown;\n try {\n decodedHook = parse<unknown>(serializedHook);\n } catch {\n invalid('serializedHook must be valid tagged JSON');\n }\n const parsedHook = HookSchema.safeParse(decodedHook);\n if (!parsedHook.success) invalid('serializedHook does not match HookSchema');\n if (\n parsedHook.data.runId !== hookOwner.runId ||\n parsedHook.data.hookId !== hookId ||\n parsedHook.data.token !== token ||\n !parsedHook.data.runId ||\n !parsedHook.data.hookId ||\n !parsedHook.data.token\n ) {\n invalid('serializedHook must match token, hookId, and owner');\n }\n const hookReservation =\n args[4] === undefined || args[4] === null ? undefined : reservation(args[4]);\n return {\n operation: 'hooks.finalize',\n args: [token, hookId, serializedHook, hookOwner, hookReservation],\n };\n}\n\nexport function validateIndexRequest(\n operation: IndexOperation,\n args: unknown[],\n): ValidatedIndexRequest {\n switch (operation) {\n case 'runs.list':\n if (args.length > 1) invalid('expected at most 1 argument');\n return { operation, args: [listOptions(args[0])] };\n case 'runs.list-resolved':\n exactArgs(args, 1);\n return { operation, args: [runListRequest(args[0])] };\n case 'runs.commit':\n return runCommit(args);\n case 'runs.expire':\n exactArgs(args, 1);\n return { operation, args: [expireRequest(args[0])] };\n case 'hooks.reserve':\n exactArgs(args, 2);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1])],\n };\n case 'hooks.finalize':\n return hookFinalize(args);\n case 'hooks.release-reservation':\n exactArgs(args, 3);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1]), reservation(args[2])],\n };\n case 'hooks.release':\n exactArgs(args, 1);\n return { operation, args: [releaseRequest(args[0])] };\n default:\n return invalid('unknown operation');\n }\n}\n\nexport const INDEX_OPERATIONS = new Set<IndexOperation>([\n 'runs.list',\n 'runs.list-resolved',\n 'runs.commit',\n 'runs.expire',\n 'hooks.reserve',\n 'hooks.finalize',\n 'hooks.release-reservation',\n 'hooks.release',\n]);\n","/**\n * Worker-level HTTP router: the fleet-facing RPC surface of the celld world.\n *\n * Routes:\n * GET /v1/health — liveness + spec version (unauthenticated)\n * POST /v1/rpc/{binding}/{name}/{method} — DO RPC (bearer auth)\n * POST /v1/index/{domain}/{method} — cohesive index operation\n * GET /v1/streams/{name}/chunks — bounded binary long-poll read\n * POST /v1/streams/{name}/chunks — bounded binary batch append\n *\n * Generic RPC bodies use the tagged JSON codec. Stream chunk bodies use the\n * compact binary stream protocol. Only whitelisted routes/methods dispatch.\n */\nimport { SPEC_VERSION_CURRENT, type WorkflowRun } from '@workflow/world';\nimport { type ApplyEventSuccess, parseApplyEventRequest } from '../apply-event.js';\nimport { rpcParse, rpcStringify } from '../codec.js';\nimport type { RunReadOutcome } from '../retention.js';\nimport { listRunsPage } from '../run-list.js';\nimport {\n createWorkflowIndex,\n runIndexMetadata,\n type CellNamespaceLike,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n NEGOTIATED_STREAM_CHUNKS,\n STREAM_BATCH_CONTENT_TYPE,\n STREAM_CHUNK_LIMIT_HEADER,\n decodeStreamWriteBatch,\n encodeStreamReadResult,\n encodeStreamWriteResult,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamWriteResult,\n} from '../stream-protocol.js';\nimport { authenticate } from './auth.js';\nimport { cellQueueClaim, runQueueClaim, type QueueClaimHandle } from './queue-claims.js';\nimport { INDEX_OPERATIONS, type IndexOperation, validateIndexRequest } from './index-validation.js';\nimport {\n NATIVE_QUEUE_MAX_MESSAGE_BYTES,\n QUEUE_PUBLICATION_LEASE_MS,\n QUEUE_RESERVATION_GRACE_MS,\n queueClaimName,\n isInlineRunBody,\n queueOrphanName,\n queuePayloadObjectKey,\n validateNativeQueueEnvelope,\n validateNativeQueueSendOptions,\n type NativeQueueEnvelope,\n type QueuePayloadOrphan,\n type QueuePayloadRegistration,\n type RunQueueReservation,\n} from '../queue-protocol.js';\nimport type { QueuePayloadStore } from './queue-payload-store.js';\n\nexport const WORLD_NAME = 'world-celld';\nexport const WORLD_VERSION = '0.1.0';\n\n/** Minimal structural DO namespace type (celld provides the real thing). */\nexport interface DONamespaceLike {\n idFromName(name: string): { toString(): string };\n get(id: { toString(): string }): unknown;\n}\n\ninterface NativeQueueBindingLike {\n send(body: string, options?: { contentType?: 'text'; delaySeconds?: number }): Promise<unknown>;\n}\n\nexport interface QueueRunStub {\n getQueueAdmission(): Promise<{ ok: true } | { ok: false; message: string }>;\n registerQueuePayload(\n registration: QueuePayloadRegistration,\n ): Promise<{ ok: true } | { ok: false; message: string }>;\n finalizeQueuePayload(messageId: string): Promise<{ ok: true } | { ok: false; message: string }>;\n unregisterQueuePayload(messageId: string): Promise<void>;\n scheduleQueuePayloadOrphan(orphan: QueuePayloadOrphan): Promise<void>;\n cancelQueuePayloadOrphan(messageId: string): Promise<void>;\n reserveQueueMessage(params: {\n messageId: string;\n expiresAt: number;\n publicationPending?: boolean;\n }): Promise<{ admitted: boolean; messageId: string; publicationPending?: true }>;\n confirmQueueMessagePublication(params: { messageId: string; expiresAt: number }): Promise<void>;\n completeQueueMessage(messageId: string): Promise<void>;\n abandonQueueMessageReservation(messageId: string): Promise<void>;\n claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean; retryAt?: number }>;\n holdInflight(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }>;\n releaseInflight(messageId?: string): Promise<void>;\n reserveRunQueueMessage(params: {\n claimName: string;\n messageId: string;\n expiresAt: number;\n publicationPending?: boolean;\n }): Promise<RunQueueReservation>;\n confirmRunQueueMessagePublication(params: {\n claimName: string;\n messageId: string;\n expiresAt: number;\n }): Promise<void>;\n claimRunQueueMessage(params: {\n claimName: string;\n messageId: string;\n staleMs: number;\n }): Promise<{ expired: true } | { expired: false; claimed: boolean; retryAt?: number }>;\n holdRunQueueMessage(params: {\n claimName: string;\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }>;\n releaseRunQueueMessage(params: { claimName: string; messageId: string }): Promise<void>;\n completeRunQueueMessage(params: { claimName: string; messageId: string }): Promise<void>;\n abandonRunQueueMessageReservation(params: {\n claimName: string;\n messageId: string;\n }): Promise<void>;\n}\n\nexport interface WorkerEnv {\n WORKFLOW_DB: DONamespaceLike;\n WORKFLOW_STREAMS: DONamespaceLike;\n WORKFLOW_RUN_CATALOG: DONamespaceLike;\n WORKFLOW_HOOK_TOKENS: DONamespaceLike;\n WORKFLOW_HOOK_IDS: DONamespaceLike;\n WORKFLOW_QUEUE: NativeQueueBindingLike;\n WORKFLOW_QUEUE_PAYLOADS?: QueuePayloadStore;\n WORLD_SECRET?: string;\n WORKFLOW_CALLBACK_SECRET?: string;\n WORKFLOW_RETENTION_MS?: string | number;\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n}\n\n/**\n * Per-isolate record of runs whose Queue idempotency claims stay in claim\n * cells (created before run-scoped claims) or live in the run cell. A run's\n * scope never changes, so the cache only saves the run-cell question.\n */\nconst runClaimScopes = new Map<string, 'cell' | 'run'>();\nconst MAX_REMEMBERED_RUN_CLAIM_SCOPES = 4096;\n\nfunction rememberRunClaimScope(runId: string, scope: 'cell' | 'run'): void {\n if (runClaimScopes.has(runId)) return;\n if (runClaimScopes.size >= MAX_REMEMBERED_RUN_CLAIM_SCOPES) {\n runClaimScopes.delete(runClaimScopes.keys().next().value!);\n }\n runClaimScopes.set(runId, scope);\n}\n\nfunction workflowIndex(env: WorkerEnv) {\n return createWorkflowIndex({\n runCatalog: env.WORKFLOW_RUN_CATALOG as CellNamespaceLike<RunCatalogShardStub>,\n hookTokens: env.WORKFLOW_HOOK_TOKENS as CellNamespaceLike<HookTokenShardStub>,\n hookIds: env.WORKFLOW_HOOK_IDS as CellNamespaceLike<HookIdShardStub>,\n });\n}\n\n/**\n * Publish a committed applyEvent outcome to the derivative indexes inside the\n * fleet, sparing the client a round trip per run mutation. Each index write is\n * idempotent under the outcome's publication lease. A failed write leaves its\n * flag unset, so the client publishes it itself exactly as it would without\n * this step; older clients ignore the flags and publish again.\n */\nasync function publishApplyEventIndexes(\n env: WorkerEnv,\n runId: string,\n outcome: unknown,\n): Promise<void> {\n if (typeof outcome !== 'object' || outcome === null) return;\n const success = outcome as { ok?: unknown } & Partial<ApplyEventSuccess>;\n if (success.ok !== true) return;\n const index = workflowIndex(env);\n const publications: Array<Promise<void>> = [];\n if (success.run && typeof success.indexPublicationExpiresAt === 'number') {\n const run = success.run;\n const lease = success.indexPublicationExpiresAt;\n publications.push(\n (async () => {\n await index.commitRun(run, runIndexMetadata(run), lease);\n success.runIndexPublished = true;\n })(),\n );\n }\n const releasedHooks = success.releasedHooks;\n if (Array.isArray(releasedHooks) && releasedHooks.length > 0) {\n publications.push(\n (async () => {\n await index.releaseHookIndexes({ runId, hooks: releasedHooks });\n success.hookIndexesReleased = true;\n })(),\n );\n }\n await Promise.allSettled(publications);\n}\n\nconst BINDINGS: Record<string, { env: keyof WorkerEnv; methods: ReadonlySet<string> }> = {\n runs: {\n env: 'WORKFLOW_DB',\n methods: new Set([\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 },\n streams: {\n env: 'WORKFLOW_STREAMS',\n methods: new Set([\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'listStreams',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ]),\n },\n 'hook-tokens': {\n env: 'WORKFLOW_HOOK_TOKENS',\n methods: new Set(['get']),\n },\n 'hook-ids': {\n env: 'WORKFLOW_HOOK_IDS',\n methods: new Set(['get']),\n },\n};\n\n/** Request body cap: oversize payloads get a clear 413 instead of an OOM. */\nconst MAX_BODY_BYTES = 32 * 1024 * 1024;\nconst MAX_STREAM_WRITE_BODY_BYTES = MAX_STREAM_BATCH_BYTES + 4 * NEGOTIATED_STREAM_CHUNKS + 1024;\n\nfunction errorResponse(status: number, name: string, message: string): Response {\n return Response.json({ error: { name, message } }, { status });\n}\n\nfunction hasContentType(request: Request, expected: string): boolean {\n return (\n request.headers.get('content-type')?.split(';', 1)[0].trim().toLowerCase() ===\n expected.toLowerCase()\n );\n}\n\nfunction declaredContentLength(request: Request): number | null {\n const raw = request.headers.get('content-length');\n if (raw === null) return null;\n if (!/^\\d+$/.test(raw)) {\n const error = new Error('content-length must be a non-negative integer');\n error.name = 'RequestValidationError';\n throw error;\n }\n const value = Number(raw);\n if (!Number.isSafeInteger(value)) {\n const error = new Error('content-length is out of range');\n error.name = 'RequestValidationError';\n throw error;\n }\n return value;\n}\n\nfunction decodePathComponent(value: string, name: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n const error = new Error(`${name} has malformed percent encoding`);\n error.name = 'RequestValidationError';\n throw error;\n }\n}\n\nasync function readBoundedBody(request: Request): Promise<string | null> {\n if (!request.body) return '';\n const reader = request.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_BODY_BYTES) {\n await reader.cancel('RPC body exceeds configured limit').catch(() => undefined);\n return null;\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function readBoundedBytes(request: Request, maxBytes: number): Promise<Uint8Array | null> {\n if (!request.body) return new Uint8Array();\n const reader = request.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 body exceeds configured limit').catch(() => undefined);\n return null;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\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 parseRpcArguments(request: Request): Promise<unknown[] | Response> {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n return Array.isArray(parsed)\n ? parsed\n : errorResponse(400, 'BadRequest', 'body must be an argument array');\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n}\n\nfunction parseBoundedInteger(url: URL, name: string, minimum: number, maximum: number): number {\n const raw = url.searchParams.get(name);\n const value = raw !== null && /^\\d+$/.test(raw) ? Number(raw) : Number.NaN;\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n const error = new Error(`${name} must be an integer between ${minimum} and ${maximum}`);\n error.name = 'StreamProtocolError';\n throw error;\n }\n return value;\n}\n\nfunction streamResponse(body: Uint8Array): Response {\n return new Response(body, {\n status: 200,\n headers: {\n 'content-type': STREAM_BATCH_CONTENT_TYPE,\n [STREAM_CHUNK_LIMIT_HEADER]: String(NEGOTIATED_STREAM_CHUNKS),\n },\n });\n}\n\nexport function createRouter(env: WorkerEnv) {\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const parts = url.pathname.split('/').filter(Boolean);\n\n if (parts[0] !== 'v1') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (parts[1] === 'health' && parts.length === 2) {\n if (request.method !== 'GET') {\n return errorResponse(405, 'MethodNotAllowed', 'expected GET');\n }\n return Response.json({\n ok: true,\n name: WORLD_NAME,\n version: WORLD_VERSION,\n specVersion: SPEC_VERSION_CURRENT,\n });\n }\n\n const auth = await authenticate(request, env.WORLD_SECRET);\n if (!auth.ok) {\n return auth.response;\n }\n\n if (parts[1] === 'queue' && parts.length === 3) {\n const parsed = await parseRpcArguments(request);\n if (parsed instanceof Response) return parsed;\n\n if (parts[2] === 'send') {\n if (parsed.length < 1 || parsed.length > 2) {\n return errorResponse(400, 'BadRequest', 'queue send expects an envelope and options');\n }\n if (!env.WORKFLOW_QUEUE) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_QUEUE');\n }\n let envelope: NativeQueueEnvelope;\n let options;\n try {\n envelope = validateNativeQueueEnvelope(parsed[0]);\n options = validateNativeQueueSendOptions(parsed[1]);\n if (envelope.body === undefined || envelope.payloadKey !== undefined) {\n throw new TypeError('queue send requires an inline body');\n }\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n let enqueueClaim: QueueClaimHandle | undefined;\n try {\n const namespace = env.WORKFLOW_DB;\n const payloadStore = env.WORKFLOW_QUEUE_PAYLOADS;\n // Small bodies without user data stay inline; the rest move to the\n // fleet bucket so run retention can delete them.\n const inlineRunBody = envelope.runId !== undefined && isInlineRunBody(envelope.body);\n const payloadKey =\n envelope.runId && !inlineRunBody\n ? queuePayloadObjectKey(envelope.runId, envelope.messageId)\n : undefined;\n let brokerEnvelope: NativeQueueEnvelope = payloadKey\n ? { ...envelope, payloadKey, body: undefined }\n : envelope;\n // Sized with the claim scope a run-scoped claim may add.\n const sized = JSON.stringify({ ...brokerEnvelope, claimScope: 'run' });\n if (new TextEncoder().encode(sized).byteLength > NATIVE_QUEUE_MAX_MESSAGE_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `native queue envelope exceeds ${NATIVE_QUEUE_MAX_MESSAGE_BYTES} bytes`,\n );\n }\n\n const now = Date.now();\n const reservationExpiresAt =\n Math.max(now, envelope.notBefore ?? now) + QUEUE_RESERVATION_GRACE_MS;\n const run = envelope.runId\n ? (namespace.get(namespace.idFromName(envelope.runId)) as QueueRunStub)\n : undefined;\n let admission: Promise<{ ok: true } | { ok: false; message: string }> | undefined;\n if (envelope.idempotencyKey) {\n const claimName = queueClaimName(envelope.queueName, envelope.idempotencyKey);\n // A keyed run-bearing message asks its run cell first unless this\n // isolate already knows the run keeps claims in claim cells. The\n // run cell reserves in the same call when the run is run-scoped.\n let scope = run && envelope.runId ? runClaimScopes.get(envelope.runId) : 'cell';\n let reservation:\n | { admitted: boolean; messageId: string; publicationPending?: true }\n | undefined;\n if (run && envelope.runId && scope !== 'cell') {\n enqueueClaim = runQueueClaim(run, claimName);\n const reserved = await run.reserveRunQueueMessage({\n claimName,\n messageId: envelope.messageId,\n expiresAt: now + QUEUE_PUBLICATION_LEASE_MS,\n publicationPending: true,\n });\n if (!reserved.ok) return errorResponse(410, 'RunExpiredError', reserved.message);\n scope = reserved.scope;\n rememberRunClaimScope(envelope.runId, reserved.scope);\n if (reserved.scope === 'run') {\n reservation = reserved;\n brokerEnvelope = { ...brokerEnvelope, claimScope: 'run' };\n }\n } else if (inlineRunBody && run) {\n // The read-only expiry check overlaps the claim-cell reservation.\n admission = run.getQueueAdmission();\n admission.catch(() => undefined);\n }\n if (!reservation) {\n const cell = namespace.get(namespace.idFromName(claimName)) as QueueRunStub;\n enqueueClaim = cellQueueClaim(cell);\n reservation = await cell.reserveQueueMessage({\n messageId: envelope.messageId,\n expiresAt: now + QUEUE_PUBLICATION_LEASE_MS,\n publicationPending: true,\n });\n }\n if (!reservation.admitted) {\n if (reservation.publicationPending) {\n return errorResponse(\n 503,\n 'QueuePublicationPending',\n 'the reserved Queue message has not been confirmed by the broker; retry publication',\n );\n }\n return new Response(rpcStringify({ messageId: reservation.messageId }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n }\n } else if (inlineRunBody && run) {\n admission = run.getQueueAdmission();\n }\n const encoded = JSON.stringify(brokerEnvelope);\n\n if (admission) {\n const admitted = await admission;\n if (!admitted.ok) {\n await enqueueClaim?.complete(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', admitted.message);\n }\n }\n\n if (run && envelope.runId && payloadKey) {\n if (!payloadStore) {\n await enqueueClaim?.abandonReservation(envelope.messageId);\n return errorResponse(\n 500,\n 'WorldMisconfigured',\n 'missing binding: WORKFLOW_QUEUE_PAYLOADS',\n );\n }\n const orphanExpiresAt = reservationExpiresAt;\n const registered = await run.registerQueuePayload({\n messageId: envelope.messageId,\n key: payloadKey,\n orphanExpiresAt,\n });\n if (!registered.ok) {\n await enqueueClaim?.complete(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', registered.message);\n }\n const orphan = namespace.get(\n namespace.idFromName(queueOrphanName(envelope.messageId)),\n ) as QueueRunStub;\n try {\n await orphan.scheduleQueuePayloadOrphan({\n messageId: envelope.messageId,\n runId: envelope.runId,\n key: payloadKey,\n expiresAt: orphanExpiresAt,\n });\n } catch (error) {\n await run.unregisterQueuePayload(envelope.messageId);\n throw error;\n }\n await payloadStore.write(payloadKey, envelope.body, {\n runId: envelope.runId,\n messageId: envelope.messageId,\n });\n const finalized = await run.finalizeQueuePayload(envelope.messageId);\n if (!finalized.ok) {\n await payloadStore.delete(payloadKey);\n await run.unregisterQueuePayload(envelope.messageId);\n await orphan.cancelQueuePayloadOrphan(envelope.messageId);\n await enqueueClaim?.complete(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', finalized.message);\n }\n }\n await env.WORKFLOW_QUEUE.send(encoded, {\n contentType: 'text',\n ...options,\n });\n await enqueueClaim?.confirmPublication(envelope.messageId, reservationExpiresAt);\n return new Response(rpcStringify({ messageId: envelope.messageId }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n // A failed publication must not make the next caller's retry look\n // successful solely because it finds this message's reservation.\n // Preserve staged payloads: the broker may have accepted the message\n // before its response failed, and orphan cleanup owns those bytes.\n try {\n await enqueueClaim?.abandonReservation(envelope.messageId);\n } catch (cleanupError) {\n console.error('world-celld could not abandon a failed Queue reservation', cleanupError);\n }\n const err = error as { name?: string; message?: string };\n return errorResponse(500, err.name ?? 'Error', err.message ?? String(error));\n }\n }\n\n return errorResponse(404, 'NotFound', `unknown queue operation: ${parts[2]}`);\n }\n\n if (parts[1] === 'index' && parts.length === 4) {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n for (const required of [\n 'WORKFLOW_RUN_CATALOG',\n 'WORKFLOW_HOOK_TOKENS',\n 'WORKFLOW_HOOK_IDS',\n ] as const) {\n if (!env[required]) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${required}`);\n }\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n const operation = `${parts[2]}.${parts[3]}`;\n if (!INDEX_OPERATIONS.has(operation as IndexOperation)) {\n return errorResponse(404, 'NotFound', `unknown index operation: ${operation}`);\n }\n let validated;\n try {\n validated = validateIndexRequest(operation as IndexOperation, args);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n try {\n const index = workflowIndex(env);\n let result: unknown;\n switch (validated.operation) {\n case 'runs.list':\n result = await index.listRuns(...validated.args);\n break;\n case 'runs.list-resolved': {\n const runs = env.WORKFLOW_DB;\n if (!runs) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_DB');\n }\n result = await listRunsPage(\n {\n listRuns: (options) => index.listRuns(options),\n readRun: async (runId) => {\n const stub = runs.get(runs.idFromName(runId)) as {\n getRun(): Promise<RunReadOutcome<WorkflowRun | null>>;\n };\n const outcome = await stub.getRun();\n return outcome.ok ? outcome.value : null;\n },\n },\n ...validated.args,\n );\n break;\n }\n case 'runs.commit':\n result = await index.commitRun(...validated.args);\n break;\n case 'runs.expire':\n result = await index.expireRun(...validated.args);\n break;\n case 'hooks.reserve':\n result = await index.reserveHook(...validated.args);\n break;\n case 'hooks.finalize':\n result = await index.finalizeHookIndexes(...validated.args);\n break;\n case 'hooks.release-reservation':\n result = await index.releaseHookReservation(...validated.args);\n break;\n case 'hooks.release':\n result = await index.releaseHookIndexes(...validated.args);\n break;\n }\n return new Response(rpcStringify(result ?? null), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n { status: 500 },\n );\n }\n }\n\n if (parts[1] === 'streams' && parts.length === 4 && parts[3] === 'chunks') {\n const runId = url.searchParams.get('runId');\n if (!runId) return errorResponse(400, 'BadRequest', 'runId is required');\n let name: string;\n try {\n name = decodePathComponent(parts[2], 'stream name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n try {\n if (request.method === 'POST') {\n if (!hasContentType(request, STREAM_BATCH_CONTENT_TYPE)) {\n return errorResponse(415, 'UnsupportedMediaType', STREAM_BATCH_CONTENT_TYPE);\n }\n const contentLength = declaredContentLength(request);\n if (contentLength !== null && contentLength > MAX_STREAM_WRITE_BODY_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const body = await readBoundedBytes(request, MAX_STREAM_WRITE_BODY_BYTES);\n if (body === null) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const chunks = decodeStreamWriteBatch(body);\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n };\n const result = await stub.writeChunks(runId, chunks);\n return streamResponse(encodeStreamWriteResult(result));\n }\n\n if (request.method === 'GET') {\n const readRequest = {\n runId,\n startIndex: parseBoundedInteger(url, 'startIndex', 0, 0x7fffffff),\n maxChunks: parseBoundedInteger(url, 'maxChunks', 0, NEGOTIATED_STREAM_CHUNKS),\n maxBytes: parseBoundedInteger(\n url,\n 'maxBytes',\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_READ_BYTES,\n ),\n waitMs: parseBoundedInteger(url, 'waitMs', 0, MAX_STREAM_LONG_POLL_MS),\n } satisfies StreamReadRequest;\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n };\n const result = await stub.readChunks(readRequest, request.signal);\n return streamResponse(encodeStreamReadResult(result));\n }\n\n return errorResponse(405, 'MethodNotAllowed', 'expected GET or POST');\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n {\n status:\n err?.name === 'StreamProtocolError' || err?.name === 'RequestValidationError'\n ? 400\n : 500,\n },\n );\n }\n }\n\n if (parts[1] !== 'rpc') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (parts.length !== 5) {\n return errorResponse(404, 'NotFound', 'expected POST /v1/rpc/{binding}/{name}/{method}');\n }\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n\n const [, , bindingKey, encodedName, method] = parts;\n const binding = BINDINGS[bindingKey];\n if (!binding) {\n return errorResponse(404, 'NotFound', `unknown binding: ${bindingKey}`);\n }\n if (!binding.methods.has(method)) {\n return errorResponse(404, 'NotFound', `unknown method: ${bindingKey}.${method}`);\n }\n\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let name: string;\n try {\n name = decodePathComponent(encodedName, 'Durable Object name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n const namespace = env[binding.env] as DONamespaceLike | undefined;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${binding.env}`);\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n\n if (bindingKey === 'runs' && method === 'applyEvent') {\n if (args.length !== 1) {\n return errorResponse(400, 'BadRequest', 'applyEvent expects exactly one request argument');\n }\n try {\n const applyRequest = parseApplyEventRequest(args[0]);\n if (applyRequest.runId !== name) {\n return errorResponse(\n 400,\n 'BadRequest',\n `applyEvent runId \"${applyRequest.runId}\" does not match routed run \"${name}\"`,\n );\n }\n args = [applyRequest];\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n }\n\n try {\n const stub = namespace.get(namespace.idFromName(name)) as Record<\n string,\n (...a: unknown[]) => Promise<unknown>\n >;\n const result = await stub[method](...args);\n if (bindingKey === 'runs' && method === 'applyEvent') {\n await publishApplyEventIndexes(env, name, result);\n }\n return new Response(rpcStringify(result ?? null), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n // Guard failures travel as structured outcomes, so a thrown error here\n // is exceptional (e.g. writing to a closed stream). Serialize by name\n // for client-side reconstruction.\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n { status: 500 },\n );\n }\n };\n}\n","import type { TerminalWorkflowRunStatus, WorkflowRun, WorkflowRunStatus } from '@workflow/world';\n\nexport const CLEANUP_RECORD_KEY = 'retention:cleanup';\nexport const TOMBSTONE_KEY = 'retention:tombstone';\nexport const HOOK_MARKER_PREFIX = 'retention:hook:';\nexport const TERMINAL_CLEANUP_KEY = 'terminal:cleanup';\n\nexport type CleanupPhase = 'retained' | 'index' | 'streams' | 'queues' | 'payload' | 'tombstoned';\n\nexport interface CleanupRecord {\n version: 1;\n runId: string;\n workflowName: string;\n createdAt: Date;\n /** Last status observed when cleanup was scheduled. */\n status?: WorkflowRunStatus;\n /** Present when cleanup was scheduled for a terminal run. */\n completedAt?: Date;\n /** Retained for persisted terminal-retention records created before max-age cleanup. */\n terminalStatus?: TerminalWorkflowRunStatus;\n reason?: 'terminal-retention' | 'maximum-age' | 'manual';\n dueAt: Date;\n phase: CleanupPhase;\n /** Optimistic-concurrency token for alarm/RPC work that awaits another cell. */\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n tombstonedAt?: Date;\n deletedPayloadKeys: number;\n deletedStreams: number;\n /** Queue payload objects removed from object storage during run cleanup. */\n deletedQueuePayloads: number;\n}\n\nexport interface RunTombstone {\n version: 1;\n runId: string;\n /** Last status observed before the run expired. */\n status?: WorkflowRunStatus;\n completedAt?: Date;\n terminalStatus?: TerminalWorkflowRunStatus;\n expiredAt: Date;\n tombstonedAt: Date;\n /** Final cleanup accounting retained inside the single authoritative record. */\n cleanup: CleanupRecord;\n}\n\nexport type RunLifecycleStatus = 'active' | 'terminal' | 'expired' | 'missing';\n\nexport type RunReadOutcome<T> =\n | { ok: true; value: T }\n | { ok: false; code: 'RUN_EXPIRED'; message: string; tombstone: RunTombstone };\n\nexport interface HookIndexReference {\n hookId: string;\n token: string;\n}\n\nexport interface TerminalCleanupRecord {\n version: 1;\n runId: string;\n phase: 'hooks' | 'markers' | 'waits';\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n}\n\nexport interface ReleaseHookIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n}\n\nexport interface ReleaseHookIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n expiredAt: number;\n}\n\nexport interface ExpireRunIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunStreamsResult {\n streams: string[];\n}\n\nexport interface FinalizeRunStreamsResult {\n /** Cumulative registry entries removed for this run. */\n deleted: number;\n done: boolean;\n}\n\nexport interface ExpireStreamResult {\n /** True only when this call installed the stream's expiration fence. */\n deleted: boolean;\n /** Chunk rows removed by this bounded call. */\n chunks: number;\n /** Payload bytes represented by the removed chunk rows. */\n bytes: number;\n done: boolean;\n}\n\nexport interface ScheduleCleanupRequest {\n retentionMs: number;\n}\n\nexport interface EnforceRetentionRequest extends ScheduleCleanupRequest {\n /** Cron occurrence being enforced. A run is eligible only at/before this time. */\n scheduledTime: number;\n}\n\nexport type EnforceRetentionResult =\n | { state: 'missing' | 'not-due'; cleanup: null }\n | { state: 'scheduled' | 'expired'; cleanup: CleanupRecord };\n\nexport function sortableTimestamp(date: Date): string {\n return date.getTime().toString().padStart(13, '0');\n}\n\nexport function workflowRunIndexKey(\n run: Pick<WorkflowRun, 'workflowName' | 'createdAt' | 'runId'>,\n) {\n return `run:${run.workflowName}:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function globalRunIndexKey(run: Pick<WorkflowRun, 'createdAt' | 'runId'>) {\n return `runall:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function hookMarkerKey(reference: HookIndexReference): string {\n return `${HOOK_MARKER_PREFIX}${encodeURIComponent(reference.hookId)}:${encodeURIComponent(reference.token)}`;\n}\n\nexport function cleanupTombstone(record: CleanupRecord, now: Date): RunTombstone {\n const cleanup: CleanupRecord = {\n ...record,\n phase: 'tombstoned',\n tombstonedAt: now,\n };\n return {\n version: 1,\n runId: record.runId,\n status: record.status ?? record.terminalStatus,\n terminalStatus: record.terminalStatus,\n completedAt: record.completedAt,\n expiredAt: record.dueAt,\n tombstonedAt: now,\n cleanup,\n };\n}\n\nexport function cleanupFromTombstone(tombstone: RunTombstone): CleanupRecord {\n return tombstone.cleanup;\n}\n\nexport function expiredRead<T>(tombstone: RunTombstone): RunReadOutcome<T> {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n tombstone,\n };\n}\n","import {\n createWorkflowIndex,\n type CellNamespaceLike,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n sortableTimestamp,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n} from '../retention.js';\nimport { isRecord, strictIntegerSetting } from '../validation.js';\n\nexport const DEFAULT_RETENTION_SWEEP_BATCH_SIZE = 128;\nexport const MAX_RETENTION_SWEEP_BATCH_SIZE = 1000;\nconst RETENTION_SWEEP_CONCURRENCY = 8;\n\ninterface RetentionRunStub {\n enforceRetention(request: EnforceRetentionRequest): Promise<EnforceRetentionResult>;\n}\n\ntype RetentionNamespace<T> = CellNamespaceLike<T>;\n\nexport interface RetentionSweepEnv {\n WORKFLOW_DB: RetentionNamespace<RetentionRunStub>;\n WORKFLOW_RUN_CATALOG: RetentionNamespace<RunCatalogShardStub>;\n WORKFLOW_HOOK_TOKENS: RetentionNamespace<HookTokenShardStub>;\n WORKFLOW_HOOK_IDS: RetentionNamespace<HookIdShardStub>;\n /** Fleet-wide maximum age from run creation. Zero disables the sweep. */\n WORKFLOW_RETENTION_MS?: string | number;\n /** Maximum catalog entries admitted by one cron occurrence. */\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n}\n\nexport interface RetentionSweepResult {\n disabled: boolean;\n cutoff: number | null;\n scanned: number;\n scheduled: number;\n expired: number;\n missing: number;\n notDue: number;\n invalid: number;\n /** Candidates preserved because their exact catalog value changed during the sweep. */\n preserved: number;\n}\n\nfunction requireNamespace<T>(\n name: keyof Pick<\n RetentionSweepEnv,\n 'WORKFLOW_DB' | 'WORKFLOW_RUN_CATALOG' | 'WORKFLOW_HOOK_TOKENS' | 'WORKFLOW_HOOK_IDS'\n >,\n namespace: RetentionNamespace<T> | undefined,\n): RetentionNamespace<T> {\n if (\n !namespace ||\n typeof namespace.idFromName !== 'function' ||\n typeof namespace.get !== 'function'\n ) {\n throw new Error(`world-celld retention sweep missing binding ${name}`);\n }\n return namespace;\n}\n\nfunction catalogCandidate(name: string, value: string): { runId: string; invalid: boolean } {\n const keyMatch = /^runall:\\d{13}:(.+)$/.exec(name);\n if (!keyMatch?.[1]) {\n throw new Error('world-celld: run catalog entry has an invalid global key');\n }\n const runId = keyMatch[1];\n try {\n const parsed: unknown = JSON.parse(value);\n return { runId, invalid: !isRecord(parsed) || parsed.runId !== runId };\n } catch {\n return { runId, invalid: true };\n }\n}\n\n/**\n * Discover and fence one bounded page of workflows older than the configured\n * maximum age. RunDO alarms finish the persisted, idempotent deletion phases.\n */\nexport async function runRetentionSweep(\n scheduledTime: number,\n env: RetentionSweepEnv,\n): Promise<RetentionSweepResult> {\n if (!Number.isSafeInteger(scheduledTime) || scheduledTime < 0) {\n throw new Error('world-celld: scheduledTime must be a non-negative safe integer');\n }\n const retentionMs = strictIntegerSetting(\n 'world-celld: WORKFLOW_RETENTION_MS',\n env.WORKFLOW_RETENTION_MS,\n 0,\n 0,\n );\n if (retentionMs === 0 || scheduledTime < retentionMs) {\n return {\n disabled: retentionMs === 0,\n cutoff: retentionMs === 0 ? null : scheduledTime - retentionMs,\n scanned: 0,\n scheduled: 0,\n expired: 0,\n missing: 0,\n notDue: 0,\n invalid: 0,\n preserved: 0,\n };\n }\n const batchSize = strictIntegerSetting(\n 'world-celld: WORKFLOW_RETENTION_BATCH_SIZE',\n env.WORKFLOW_RETENTION_BATCH_SIZE,\n DEFAULT_RETENTION_SWEEP_BATCH_SIZE,\n 1,\n MAX_RETENTION_SWEEP_BATCH_SIZE,\n );\n const cutoff = scheduledTime - retentionMs;\n const runNamespace = requireNamespace('WORKFLOW_DB', env.WORKFLOW_DB);\n const catalogNamespace = requireNamespace('WORKFLOW_RUN_CATALOG', env.WORKFLOW_RUN_CATALOG);\n const index = createWorkflowIndex({\n runCatalog: catalogNamespace,\n hookTokens: requireNamespace('WORKFLOW_HOOK_TOKENS', env.WORKFLOW_HOOK_TOKENS),\n hookIds: requireNamespace('WORKFLOW_HOOK_IDS', env.WORKFLOW_HOOK_IDS),\n });\n const page = await index.listRuns({\n prefix: 'runall:',\n end: `runall:${sortableTimestamp(new Date(cutoff + 1))}:`,\n limit: batchSize,\n });\n\n const result: RetentionSweepResult = {\n disabled: false,\n cutoff,\n scanned: page.keys.length,\n scheduled: 0,\n expired: 0,\n missing: 0,\n notDue: 0,\n invalid: 0,\n preserved: 0,\n };\n const failures: unknown[] = [];\n for (let offset = 0; offset < page.keys.length; offset += RETENTION_SWEEP_CONCURRENCY) {\n const candidates = page.keys.slice(offset, offset + RETENTION_SWEEP_CONCURRENCY);\n const settled = await Promise.allSettled(\n candidates.map(async (entry) => {\n const { runId, invalid } = catalogCandidate(entry.name, entry.value);\n if (!entry.sourceShard) {\n throw new Error('world-celld: merged run catalog entry omitted its source shard');\n }\n const catalog = catalogNamespace.get(catalogNamespace.idFromName(entry.sourceShard));\n if (invalid) {\n const deleted = await catalog.deleteStaleGlobalRun(runId, entry.name, entry.value);\n return { state: 'invalid', preserved: !deleted.deleted } as const;\n }\n const run = runNamespace.get(runNamespace.idFromName(runId));\n const outcome = await run.enforceRetention({ retentionMs, scheduledTime });\n if (outcome.state === 'missing' || outcome.state === 'not-due') {\n const deleted = await catalog.deleteStaleGlobalRun(runId, entry.name, entry.value);\n return { state: outcome.state, preserved: !deleted.deleted };\n }\n return { state: outcome.state, preserved: false };\n }),\n );\n for (const outcome of settled) {\n if (outcome.status === 'rejected') {\n failures.push(outcome.reason);\n } else {\n result[outcome.value.state === 'not-due' ? 'notDue' : outcome.value.state]++;\n if (outcome.value.preserved) result.preserved++;\n }\n }\n }\n if (failures.length > 0) {\n throw new AggregateError(\n failures,\n `world-celld retention sweep failed for ${failures.length} run(s)`,\n );\n }\n return result;\n}\n","/**\n * Provider-neutral storage used for run-bearing native Queue payloads.\n *\n * celld v0.4 exposes a namespace in the fleet's existing object store through\n * the Workers R2-compatible binding shape. Keep that platform shape here so\n * queue and retention code depend only on QueuePayloadStore.\n */\nexport interface QueuePayloadStore {\n write(key: string, value: string, metadata: { runId: string; messageId: string }): Promise<void>;\n read(key: string): Promise<string | null>;\n delete(keys: string | string[]): Promise<void>;\n}\n\nexport interface QueuePayloadObjectStorageBinding {\n put(\n key: string,\n value: string,\n options?: { customMetadata?: Record<string, string> },\n ): Promise<unknown>;\n get(key: string): Promise<{ text(): Promise<string> } | null>;\n delete(keys: string | string[]): Promise<void>;\n}\n\nexport function createQueuePayloadStore(\n binding: QueuePayloadObjectStorageBinding,\n): QueuePayloadStore {\n return {\n async write(key, value, metadata) {\n await binding.put(key, value, { customMetadata: metadata });\n },\n async read(key) {\n return (await binding.get(key))?.text() ?? null;\n },\n async delete(keys) {\n await binding.delete(keys);\n },\n };\n}\n\nexport async function deleteQueuePayloadObjects(\n binding: Pick<QueuePayloadObjectStorageBinding, 'delete'>,\n keys: string | string[],\n): Promise<void> {\n await binding.delete(keys);\n}\n","import type { Hook } from '@workflow/world';\nimport type { HookTokenOwner } from '../../config.js';\nimport type { CellNamespaceLike } from '../../indexes.js';\nimport type { RunLifecycleStatus } from '../../retention.js';\nimport { parse } from '../../vendor/shared/index.js';\n\ninterface RunLifecycleStub {\n getLifecycleStatus(): Promise<RunLifecycleStatus>;\n resolveExpiredHookClaim(request: {\n hookId: string;\n claimId: string;\n token?: string;\n }): Promise<Hook | null>;\n}\n\nexport interface HookIndexEnv {\n WORKFLOW_DB?: CellNamespaceLike<RunLifecycleStub>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\nexport function sameOwner(left: HookTokenOwner, right: HookTokenOwner): boolean {\n return left.runId === right.runId && left.hookId === right.hookId;\n}\n\nexport function ownerFromSerializedHook(raw: string): HookTokenOwner {\n const hook = parse<Hook>(raw);\n return { runId: hook.runId, hookId: hook.hookId };\n}\n\nexport function indexKey(prefix: string, value: string): string {\n return `${prefix}:${encodeURIComponent(value)}`;\n}\n\nexport async function runIsActive(env: HookIndexEnv, runId: string): Promise<boolean> {\n const namespace = env.WORKFLOW_DB;\n if (!namespace) throw new Error('world-celld hook index missing WORKFLOW_DB binding');\n const target = namespace.get(namespace.idFromName(runId));\n return (await target.getLifecycleStatus()) === 'active';\n}\n\n/** Resolve a stale shard reservation in its authoritative event writer. */\nexport async function resolveExpiredHookClaim(\n env: HookIndexEnv,\n owner: HookTokenOwner,\n claimId: string,\n token?: string,\n): Promise<Hook | null> {\n const namespace = env.WORKFLOW_DB;\n if (!namespace) throw new Error('world-celld hook index missing WORKFLOW_DB binding');\n const target = namespace.get(namespace.idFromName(owner.runId));\n return await target.resolveExpiredHookClaim({ hookId: owner.hookId, claimId, token });\n}\n","import type { HookTokenOwner } from '../../config.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n indexKey,\n ownerFromSerializedHook,\n resolveExpiredHookClaim,\n runIsActive,\n sameOwner,\n type HookIndexEnv,\n} from './hook-index-shared.js';\nimport {\n HOOK_CLAIM_LEASE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n} from '../../lifecycle.js';\n\nconst MAX_RELEASE_BATCH = 64;\nconst CLAIM_DEADLINE_PREFIX = 'claim-deadline:';\n\ninterface HookClaim {\n owner: HookTokenOwner;\n claimId: string;\n reservedAt: number;\n expiresAt: number;\n deadlineKey: string;\n}\n\ninterface ClaimDeadline {\n hookId: string;\n claimId: string;\n expiresAt: number;\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction recordKey(hookId: string): string {\n return indexKey('hookid', hookId);\n}\n\nfunction claimKey(hookId: string): string {\n return indexKey('claim', hookId);\n}\n\nfunction claimDeadlineKey(hookId: string, expiresAt: number): string {\n return `${CLAIM_DEADLINE_PREFIX}${pad(expiresAt)}:${encodeURIComponent(hookId)}`;\n}\n\n/** Hook-ID ownership and lookup shard; every hook ID has one transaction domain. */\nexport class HookIdDO extends DurableObject<HookIndexEnv> {\n private now(): number {\n return typeof this.env.clock === 'function' ? this.env.clock() : Date.now();\n }\n\n async get(hookId: string): Promise<string | null> {\n const raw = await this.ctx.storage.get<string>(recordKey(hookId));\n if (!raw) return null;\n const owner = ownerFromSerializedHook(raw);\n return (await runIsActive(this.env, owner.runId)) ? raw : null;\n }\n\n async reserve(\n hookId: string,\n owner: HookTokenOwner,\n proposedClaimId: string,\n ): Promise<{ claimed: true; claimId: string } | { claimed: false; holder: HookTokenOwner }> {\n for (;;) {\n const observed = await this.ctx.storage.get<HookClaim>(claimKey(hookId));\n const expired = observed && observed.expiresAt <= this.now() ? observed : undefined;\n const committed = expired\n ? await resolveExpiredHookClaim(this.env, expired.owner, expired.claimId)\n : undefined;\n const result = await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(hookId);\n const claim = claimKey(hookId);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined) {\n return { claimed: false as const, holder: ownerFromSerializedHook(indexed) };\n }\n let existing = values.get(claim) as HookClaim | undefined;\n const now = this.now();\n if (existing && existing.expiresAt <= now) {\n if (existing.claimId !== expired?.claimId || existing.expiresAt !== expired.expiresAt) {\n return null;\n }\n if (committed) {\n await this.renewClaim(txn, hookId, existing, now);\n return sameOwner(existing.owner, owner)\n ? { claimed: true as const, claimId: existing.claimId }\n : { claimed: false as const, holder: existing.owner };\n }\n await txn.delete([claim, existing.deadlineKey]);\n existing = undefined;\n }\n if (existing !== undefined && !sameOwner(existing.owner, owner)) {\n return { claimed: false as const, holder: existing.owner };\n }\n if (existing === undefined || existing.claimId !== proposedClaimId) {\n if (existing) await txn.delete(existing.deadlineKey);\n const expiresAt = now + HOOK_CLAIM_LEASE_MS;\n const deadlineKey = claimDeadlineKey(hookId, expiresAt);\n await txn.put(claim, {\n owner,\n claimId: proposedClaimId,\n reservedAt: now,\n expiresAt,\n deadlineKey,\n } satisfies HookClaim);\n await txn.put<ClaimDeadline>(deadlineKey, {\n hookId,\n claimId: proposedClaimId,\n expiresAt,\n });\n await this.armAtMost(txn, expiresAt);\n return { claimed: true as const, claimId: proposedClaimId };\n }\n return { claimed: true as const, claimId: existing.claimId };\n });\n if (result) return result;\n }\n }\n\n async publish(\n hookId: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }> {\n if (!(await runIsActive(this.env, owner.runId))) {\n await this.releaseBatch([{ hookId, owner }]);\n return { stored: false };\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(hookId);\n const claim = claimKey(hookId);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined && !sameOwner(ownerFromSerializedHook(indexed), owner)) {\n throw new Error(`Hook id ${hookId} is owned by another hook`);\n }\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (existingClaim && existingClaim.expiresAt <= this.now()) {\n // Token publication may already have succeeded. Surface this failure\n // so replay reacquires the claim and repairs the missing ID lookup.\n throw new Error(`Hook id ${hookId} reservation expired`);\n }\n if (\n existingClaim !== undefined &&\n (!sameOwner(existingClaim.owner, owner) || existingClaim.claimId !== claimId)\n ) {\n throw new Error(`Hook id ${hookId} is reserved by another hook`);\n }\n if (indexed === undefined && existingClaim === undefined) {\n throw new Error(`Hook id ${hookId} has no active reservation`);\n }\n await txn.put(record, serializedHook);\n if (existingClaim !== undefined) await txn.delete([claim, existingClaim.deadlineKey]);\n return { stored: true };\n });\n }\n\n async releaseClaim(hookId: string, owner: HookTokenOwner, claimId: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const key = claimKey(hookId);\n const claim = await txn.get<HookClaim>(key);\n if (claim && sameOwner(claim.owner, owner) && claim.claimId === claimId) {\n await txn.delete([key, claim.deadlineKey]);\n }\n });\n }\n\n async releaseBatch(\n hooks: Array<{ hookId: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }> {\n if (hooks.length > MAX_RELEASE_BATCH) throw new Error('Hook id release batch is too large');\n if (hooks.length === 0) return { deleted: 0 };\n return await this.ctx.storage.transaction(async (txn) => {\n const keys = hooks.flatMap(({ hookId }) => [recordKey(hookId), claimKey(hookId)]);\n const values = await txn.get<string | HookClaim>(keys);\n const deletes: string[] = [];\n const deadlineDeletes: string[] = [];\n for (const { hookId, owner } of hooks) {\n const record = recordKey(hookId);\n const claim = claimKey(hookId);\n const indexed = values.get(record) as string | undefined;\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (indexed !== undefined && sameOwner(ownerFromSerializedHook(indexed), owner)) {\n deletes.push(record);\n }\n if (existingClaim !== undefined && sameOwner(existingClaim.owner, owner)) {\n deletes.push(claim);\n deadlineDeletes.push(existingClaim.deadlineKey);\n }\n }\n const deleted = deletes.length === 0 ? 0 : await txn.delete(deletes);\n if (deadlineDeletes.length > 0) await txn.delete(deadlineDeletes);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactClaims();\n } catch {\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectTransaction, at: number): Promise<void> {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async renewClaim(\n txn: DurableObjectTransaction,\n hookId: string,\n claim: HookClaim,\n now: number,\n ): Promise<void> {\n const expiresAt = now + HOOK_CLAIM_LEASE_MS;\n const deadlineKey = claimDeadlineKey(hookId, expiresAt);\n await txn.delete(claim.deadlineKey);\n await txn.put(claimKey(hookId), { ...claim, expiresAt, deadlineKey });\n await txn.put<ClaimDeadline>(deadlineKey, { hookId, claimId: claim.claimId, expiresAt });\n await this.armAtMost(txn, expiresAt);\n }\n\n private async compactClaims(): Promise<void> {\n const now = this.now();\n const due = await this.ctx.storage.list<ClaimDeadline>({\n prefix: CLAIM_DEADLINE_PREFIX,\n end: `${CLAIM_DEADLINE_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const observed = await this.ctx.storage.get<HookClaim>(\n page.map(([, item]) => claimKey(item.hookId)),\n );\n const committed = new Map<string, boolean>();\n await Promise.all(\n page.map(async ([, item]) => {\n const claim = observed.get(claimKey(item.hookId));\n if (!claim || claim.claimId !== item.claimId || claim.expiresAt > now) return;\n const hook = await resolveExpiredHookClaim(this.env, claim.owner, claim.claimId);\n committed.set(claimKey(item.hookId), hook !== null);\n }),\n );\n await this.ctx.storage.transaction(async (txn) => {\n const claims = await txn.get<HookClaim>(page.map(([, item]) => claimKey(item.hookId)));\n const deletes: string[] = [];\n for (const [deadline, item] of page) {\n const key = claimKey(item.hookId);\n const claim = claims.get(key);\n const snapshot = observed.get(key);\n if (claim?.claimId !== item.claimId || claim.expiresAt > now) {\n deletes.push(deadline);\n } else if (claim.claimId === snapshot?.claimId && claim.expiresAt === snapshot.expiresAt) {\n if (committed.get(key)) await this.renewClaim(txn, item.hookId, claim, now);\n else deletes.push(deadline, key);\n }\n }\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<ClaimDeadline>({ prefix: CLAIM_DEADLINE_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.expiresAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type { HookTokenOwner } from '../../config.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n indexKey,\n ownerFromSerializedHook,\n resolveExpiredHookClaim,\n runIsActive,\n sameOwner,\n type HookIndexEnv,\n} from './hook-index-shared.js';\nimport {\n HOOK_CLAIM_LEASE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n} from '../../lifecycle.js';\n\ninterface HookClaim {\n owner: HookTokenOwner;\n claimId: string;\n reservedAt: number;\n expiresAt: number;\n deadlineKey: string;\n}\n\nconst MAX_RELEASE_BATCH = 64;\nconst CLAIM_DEADLINE_PREFIX = 'claim-deadline:';\n\ninterface ClaimDeadline {\n token: string;\n claimId: string;\n expiresAt: number;\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction recordKey(token: string): string {\n return indexKey('hook', token);\n}\n\nfunction claimKey(token: string): string {\n return indexKey('claim', token);\n}\n\nfunction claimDeadlineKey(token: string, expiresAt: number): string {\n return `${CLAIM_DEADLINE_PREFIX}${pad(expiresAt)}:${encodeURIComponent(token)}`;\n}\n\n/** Token-ownership shard. A token hashes to exactly one shard and transaction domain. */\nexport class HookTokenDO extends DurableObject<HookIndexEnv> {\n private now(): number {\n return typeof this.env.clock === 'function' ? this.env.clock() : Date.now();\n }\n\n async get(token: string): Promise<string | null> {\n const raw = await this.ctx.storage.get<string>(recordKey(token));\n if (!raw) return null;\n const owner = ownerFromSerializedHook(raw);\n return (await runIsActive(this.env, owner.runId)) ? raw : null;\n }\n\n async reserve(\n token: string,\n owner: HookTokenOwner,\n proposedClaimId: string,\n ): Promise<{ claimed: true; claimId: string } | { claimed: false; holder: HookTokenOwner }> {\n for (;;) {\n const observed = await this.ctx.storage.get<HookClaim>(claimKey(token));\n const expired = observed && observed.expiresAt <= this.now() ? observed : undefined;\n const committed = expired\n ? await resolveExpiredHookClaim(this.env, expired.owner, expired.claimId, token)\n : undefined;\n const result = await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(token);\n const claim = claimKey(token);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined) {\n return { claimed: false as const, holder: ownerFromSerializedHook(indexed) };\n }\n let existing = values.get(claim) as HookClaim | undefined;\n const now = this.now();\n if (existing && existing.expiresAt <= now) {\n if (existing.claimId !== expired?.claimId || existing.expiresAt !== expired.expiresAt) {\n return null;\n }\n if (committed) {\n await this.renewClaim(txn, token, existing, now);\n return sameOwner(existing.owner, owner)\n ? { claimed: true as const, claimId: existing.claimId }\n : { claimed: false as const, holder: existing.owner };\n }\n await txn.delete([claim, existing.deadlineKey]);\n existing = undefined;\n }\n if (existing !== undefined && !sameOwner(existing.owner, owner)) {\n return { claimed: false as const, holder: existing.owner };\n }\n if (existing === undefined) {\n const expiresAt = now + HOOK_CLAIM_LEASE_MS;\n const deadlineKey = claimDeadlineKey(token, expiresAt);\n await txn.put(claim, {\n owner,\n claimId: proposedClaimId,\n reservedAt: now,\n expiresAt,\n deadlineKey,\n } satisfies HookClaim);\n await txn.put<ClaimDeadline>(deadlineKey, { token, claimId: proposedClaimId, expiresAt });\n await this.armAtMost(txn, expiresAt);\n return { claimed: true as const, claimId: proposedClaimId };\n }\n return { claimed: true as const, claimId: existing.claimId };\n });\n if (result) return result;\n }\n }\n\n async finalize(\n token: string,\n serializedHook: string,\n owner: HookTokenOwner,\n claimId?: string,\n ): Promise<{ stored: boolean }> {\n if (!(await runIsActive(this.env, owner.runId))) {\n await this.releaseBatch([{ token, owner }]);\n return { stored: false };\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const record = recordKey(token);\n const claim = claimKey(token);\n const values = await txn.get<string | HookClaim>([record, claim]);\n const indexed = values.get(record) as string | undefined;\n if (indexed !== undefined && !sameOwner(ownerFromSerializedHook(indexed), owner)) {\n throw new Error(`Hook token ${token} is owned by another hook`);\n }\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (existingClaim && existingClaim.expiresAt <= this.now()) {\n // The authoritative hook may already have committed. A successful\n // response here would strand it without a token lookup; force replay\n // to reacquire the reservation and finish publication instead.\n throw new Error(`Hook token ${token} reservation expired`);\n }\n if (\n existingClaim !== undefined &&\n (!sameOwner(existingClaim.owner, owner) || existingClaim.claimId !== claimId)\n ) {\n throw new Error(`Hook token ${token} is reserved by another hook`);\n }\n if (indexed === undefined && existingClaim === undefined) {\n throw new Error(`Hook token ${token} has no active reservation`);\n }\n await txn.put(record, serializedHook);\n if (existingClaim !== undefined) await txn.delete([claim, existingClaim.deadlineKey]);\n return { stored: true };\n });\n }\n\n async releaseClaim(token: string, owner: HookTokenOwner, claimId: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const key = claimKey(token);\n const claim = await txn.get<HookClaim>(key);\n if (claim && sameOwner(claim.owner, owner) && claim.claimId === claimId) {\n await txn.delete([key, claim.deadlineKey]);\n }\n });\n }\n\n async releaseBatch(\n hooks: Array<{ token: string; owner: HookTokenOwner }>,\n ): Promise<{ deleted: number }> {\n if (hooks.length > MAX_RELEASE_BATCH) throw new Error('Hook token release batch is too large');\n if (hooks.length === 0) return { deleted: 0 };\n return await this.ctx.storage.transaction(async (txn) => {\n const keys = hooks.flatMap(({ token }) => [recordKey(token), claimKey(token)]);\n const values = await txn.get<string | HookClaim>(keys);\n const deletes: string[] = [];\n const deadlineDeletes: string[] = [];\n for (const { token, owner } of hooks) {\n const record = recordKey(token);\n const claim = claimKey(token);\n const indexed = values.get(record) as string | undefined;\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (indexed !== undefined && sameOwner(ownerFromSerializedHook(indexed), owner)) {\n deletes.push(record);\n }\n if (existingClaim !== undefined && sameOwner(existingClaim.owner, owner)) {\n deletes.push(claim);\n deadlineDeletes.push(existingClaim.deadlineKey);\n }\n }\n const deleted = deletes.length === 0 ? 0 : await txn.delete(deletes);\n if (deadlineDeletes.length > 0) await txn.delete(deadlineDeletes);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactClaims();\n } catch {\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectTransaction, at: number): Promise<void> {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async renewClaim(\n txn: DurableObjectTransaction,\n token: string,\n claim: HookClaim,\n now: number,\n ): Promise<void> {\n const expiresAt = now + HOOK_CLAIM_LEASE_MS;\n const deadlineKey = claimDeadlineKey(token, expiresAt);\n await txn.delete(claim.deadlineKey);\n await txn.put(claimKey(token), { ...claim, expiresAt, deadlineKey });\n await txn.put<ClaimDeadline>(deadlineKey, { token, claimId: claim.claimId, expiresAt });\n await this.armAtMost(txn, expiresAt);\n }\n\n private async compactClaims(): Promise<void> {\n const now = this.now();\n const due = await this.ctx.storage.list<ClaimDeadline>({\n prefix: CLAIM_DEADLINE_PREFIX,\n end: `${CLAIM_DEADLINE_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const observed = await this.ctx.storage.get<HookClaim>(\n page.map(([, item]) => claimKey(item.token)),\n );\n const committed = new Map<string, boolean>();\n await Promise.all(\n page.map(async ([, item]) => {\n const claim = observed.get(claimKey(item.token));\n if (!claim || claim.claimId !== item.claimId || claim.expiresAt > now) return;\n const hook = await resolveExpiredHookClaim(\n this.env,\n claim.owner,\n claim.claimId,\n item.token,\n );\n committed.set(claimKey(item.token), hook !== null);\n }),\n );\n await this.ctx.storage.transaction(async (txn) => {\n const claims = await txn.get<HookClaim>(page.map(([, item]) => claimKey(item.token)));\n const deletes: string[] = [];\n for (const [deadline, item] of page) {\n const key = claimKey(item.token);\n const claim = claims.get(key);\n const snapshot = observed.get(key);\n if (claim?.claimId !== item.claimId || claim.expiresAt > now) {\n deletes.push(deadline);\n } else if (claim.claimId === snapshot?.claimId && claim.expiresAt === snapshot.expiresAt) {\n if (committed.get(key)) await this.renewClaim(txn, item.token, claim, now);\n else deletes.push(deadline, key);\n }\n }\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<ClaimDeadline>({ prefix: CLAIM_DEADLINE_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.expiresAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type { ExpireRunIndexesResult } from '../../retention.js';\nimport type { IndexListOptions, IndexListPage } from '../../indexes.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n CATALOG_FENCE_GRACE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS,\n} from '../../lifecycle.js';\n\nconst MAX_INDEX_LIST_SIZE = 1001;\nconst EXPIRY_GC_PREFIX = 'expiry-gc:';\nconst CATALOG_KEYS_PREFIX = 'catalog-keys:';\n\ninterface RunCatalogEnv {\n clock?: () => number;\n}\n\ninterface CatalogExpiryFence {\n expiredAt: number;\n compactAt: number;\n}\n\ninterface CatalogExpiryGc {\n runId: string;\n compactAt: number;\n}\n\ninterface CatalogKeys {\n keys: [string, string];\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction expiredKey(runId: string): string {\n return `expired:${runId}`;\n}\n\nfunction catalogKeysKey(runId: string): string {\n return `${CATALOG_KEYS_PREFIX}${encodeURIComponent(runId)}`;\n}\n\nfunction canonicalCatalogKeys(runId: string, keys: unknown): [string, string] {\n if (!Array.isArray(keys) || keys.length !== 2 || keys.some((key) => typeof key !== 'string')) {\n throw new Error('Run catalog commit requires exactly two string keys');\n }\n const suffix = `:${runId}`;\n const workflowMatch = /^run:(.+):(\\d{13}):/.exec(keys[0]);\n if (\n workflowMatch === null ||\n !keys[0].endsWith(suffix) ||\n keys[0] !== `run:${workflowMatch[1]}:${workflowMatch[2]}${suffix}` ||\n keys[1] !== `runall:${workflowMatch[2]}${suffix}`\n ) {\n throw new Error('Run catalog commit requires the canonical run key pair');\n }\n return [keys[0], keys[1]];\n}\n\nfunction expiryGcKey(runId: string, compactAt: number): string {\n return `${EXPIRY_GC_PREFIX}${pad(compactAt)}:${encodeURIComponent(runId)}`;\n}\n\n/** One of a fixed set of run-catalog shards, routed by the stable run ID hash. */\nexport class RunCatalogDO extends DurableObject {\n private now(): number {\n const clock = (this.env as RunCatalogEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n async upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }> {\n const canonicalKeys = canonicalCatalogKeys(runId, keys);\n return await this.ctx.storage.transaction(async (txn) => {\n const recordKey = catalogKeysKey(runId);\n const existing = await txn.get<string | CatalogKeys>([\n expiredKey(runId),\n canonicalKeys[0],\n canonicalKeys[1],\n recordKey,\n ]);\n if (existing.get(expiredKey(runId)) !== undefined) return { stored: false };\n const now = this.now();\n if (\n !Number.isSafeInteger(publicationExpiresAt) ||\n publicationExpiresAt <= now ||\n publicationExpiresAt > now + MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS\n ) {\n return { stored: false };\n }\n const record = existing.get(recordKey) as CatalogKeys | undefined;\n if (\n existing.get(canonicalKeys[0]) === serializedMetadata &&\n existing.get(canonicalKeys[1]) === serializedMetadata &&\n record?.keys.length === canonicalKeys.length &&\n record.keys.every((key, index) => key === canonicalKeys[index])\n ) {\n // An idempotent republication (e.g. a run_started replay) changes\n // nothing, so it stays a read-only transaction.\n return { stored: true };\n }\n await txn.put({\n [canonicalKeys[0]]: serializedMetadata,\n [canonicalKeys[1]]: serializedMetadata,\n [catalogKeysKey(runId)]: { keys: canonicalKeys } satisfies CatalogKeys,\n });\n return { stored: true };\n });\n }\n\n async list(options: IndexListOptions = {}): Promise<IndexListPage> {\n const suppliedLimit = options.limit;\n const requestedLimit =\n typeof suppliedLimit === 'number' && Number.isFinite(suppliedLimit)\n ? Math.floor(suppliedLimit)\n : MAX_INDEX_LIST_SIZE;\n const limit = Math.min(MAX_INDEX_LIST_SIZE, Math.max(1, requestedLimit));\n const entries = await this.ctx.storage.list<string>({\n // The shard also owns internal expiry metadata. An unprefixed catalog\n // read means all public run/runall entries, never internal records.\n prefix: options.prefix || 'run',\n ...(options.reverse\n ? { reverse: true, end: options.cursor ?? options.end }\n : { startAfter: options.cursor, end: options.end }),\n limit: limit + 1,\n });\n const page = Array.from(entries).slice(0, limit);\n const listComplete = entries.size <= limit;\n return {\n keys: page.map(([name, value]) => ({ name, value })),\n list_complete: listComplete,\n cursor: listComplete ? undefined : page.at(-1)?.[0],\n };\n }\n\n /** Compare-and-delete one rejected retention discovery candidate. */\n async deleteStaleGlobalRun(\n runId: string,\n key: string,\n expectedValue: string,\n ): Promise<{ deleted: boolean }> {\n if (!key.startsWith('runall:') || !key.endsWith(`:${runId}`)) {\n throw new Error('Stale run catalog deletion requires the exact global run key');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get<string>(key)) !== expectedValue) return { deleted: false };\n return { deleted: await txn.delete(key) };\n });\n }\n\n async expireRun(runId: string, expiredAt: number): Promise<ExpireRunIndexesResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const storedKeysKey = catalogKeysKey(runId);\n const storedKeys = await txn.get<CatalogKeys>(storedKeysKey);\n if (storedKeys === undefined) return { deleted: 0 };\n const canonicalKeys = canonicalCatalogKeys(runId, storedKeys.keys);\n const marker = expiredKey(runId);\n const existing = await txn.get<CatalogExpiryFence>(marker);\n const compactAt = existing?.compactAt ?? this.now() + CATALOG_FENCE_GRACE_MS;\n await txn.put<CatalogExpiryFence>(marker, { expiredAt, compactAt });\n await txn.put<CatalogExpiryGc>(expiryGcKey(runId, compactAt), { runId, compactAt });\n await this.armAtMost(txn, compactAt);\n const deleted = await txn.delete(canonicalKeys);\n await txn.delete(storedKeysKey);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactExpiryFences();\n } catch {\n // Cloudflare retries only six times. Persist a fresh alarm edge so a\n // transient storage failure cannot abandon compaction permanently.\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectStorage | DurableObjectTransaction, at: number) {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async compactExpiryFences(): Promise<void> {\n const now = this.now();\n await this.ctx.storage.transaction(async (txn) => {\n const due = await txn.list<CatalogExpiryGc>({\n prefix: EXPIRY_GC_PREFIX,\n end: `${EXPIRY_GC_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const markerKeys = page.map(([, item]) => expiredKey(item.runId));\n const markers = await txn.get<CatalogExpiryFence>(markerKeys);\n const deletes = page.flatMap(([key, item], index) => {\n const marker = markers.get(markerKeys[index]);\n return marker?.compactAt === item.compactAt ? [key, markerKeys[index]] : [key];\n });\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<CatalogExpiryGc>({ prefix: EXPIRY_GC_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.compactAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type {\n ExpireRunStreamsResult,\n ExpireStreamResult,\n FinalizeRunStreamsResult,\n} from '../../retention.js';\nimport {\n MAX_STREAM_CHUNK_BYTES,\n normalizeStreamError,\n validateStreamReadRequest,\n validateStreamWriteChunks,\n type StreamErrorData,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamTerminalState,\n type StreamWriteResult,\n} from '../../stream-protocol.js';\nimport { DurableObject } from '../do-base.js';\n\ninterface StreamMeta {\n /** Number of durable chunks (also the next chunk index). */\n count: number;\n state: StreamTerminalState;\n ownerRunId?: string;\n error?: StreamErrorData;\n expiredAt?: number;\n expiredChunkCount?: number;\n payloadDeleted?: boolean;\n /**\n * Storage layout, fixed when the stream is created. Absent: one payload row\n * and one size row per chunk. 2: segment rows that each pack one write's\n * chunks, with a small size row per segment.\n */\n layout?: typeof SEGMENT_LAYOUT;\n}\n\ninterface SegmentSize {\n /** Chunks packed in the segment. */\n count: number;\n /** Payload bytes of those chunks. */\n bytes: number;\n}\n\ninterface StreamWaiter {\n resolve(reason: 'change' | 'timeout'): void;\n timer: ReturnType<typeof setTimeout>;\n signal?: AbortSignal;\n onAbort?: () => void;\n}\n\ninterface RegistryExpiry {\n expiredAt: number;\n deleted: number;\n}\n\nconst META_KEY = 'meta';\nconst CHUNK_KEY_PREFIX = 'chunk:';\nconst CHUNK_SIZE_KEY_PREFIX = 'chunk-size:';\n/** Registry keys used when this DO instance acts as a per-run stream index. */\nconst STREAM_REGISTRY_PREFIX = 'stream:';\nconst REGISTRY_OWNER_KEY = 'registry:owner';\nconst REGISTRY_EXPIRED_KEY = 'registry:expired';\n/** Each chunk occupies a payload key and a size key, deleted in calls of at most 128 keys. */\nconst DEFAULT_EXPIRE_CHUNK_LIMIT = 64;\nconst MAX_EXPIRE_CHUNK_LIMIT = 256;\nconst DELETE_BATCH_KEYS = 128;\n/** Bound storage deletion work as well as item count; one oversized chunk still makes progress. */\nconst DEFAULT_EXPIRE_BYTE_LIMIT = 16 * 1024 * 1024;\nconst MAX_EXPIRE_BYTE_LIMIT = DEFAULT_EXPIRE_BYTE_LIMIT;\nconst MAX_STREAM_INDEX = 0x7fffffff;\nconst SEGMENT_LAYOUT = 2;\nconst SEGMENT_KEY_PREFIX = 'seg:';\nconst SEGMENT_SIZE_KEY_PREFIX = 'segsize:';\n/** Payload bytes per segment row, well below the 2 MiB per-value storage limit. */\nconst MAX_SEGMENT_BYTES = 1024 * 1024;\n/** Layout of a stream's first write. Existing streams keep the layout they started with. */\nconst NEW_STREAM_LAYOUT: StreamMeta['layout'] = SEGMENT_LAYOUT;\n/** One storage get or put call accepts at most 128 keys. */\nconst STORAGE_BATCH_KEYS = 128;\n\nfunction boundedLimit(value: number | undefined, fallback: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(1, Math.min(maximum, Math.floor(value)));\n}\n\nfunction emptyMeta(): StreamMeta {\n return { count: 0, state: 'open' };\n}\n\nfunction validateMeta(meta: unknown): StreamMeta {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n throw new Error('Invalid persisted stream metadata');\n }\n const candidate = meta as Partial<StreamMeta>;\n if (\n !Number.isSafeInteger(candidate.count) ||\n candidate.count! < 0 ||\n candidate.count! > MAX_STREAM_INDEX ||\n !['open', 'closed', 'errored', 'expired'].includes(candidate.state as StreamTerminalState) ||\n (candidate.ownerRunId !== undefined && typeof candidate.ownerRunId !== 'string') ||\n (candidate.payloadDeleted !== undefined && typeof candidate.payloadDeleted !== 'boolean') ||\n (candidate.layout !== undefined && candidate.layout !== SEGMENT_LAYOUT)\n ) {\n throw new Error('Invalid persisted stream metadata');\n }\n const error = candidate.error;\n if (\n (error !== undefined &&\n (!error ||\n typeof error !== 'object' ||\n typeof error.name !== 'string' ||\n typeof error.message !== 'string')) ||\n (candidate.state === 'errored') !== (error !== undefined)\n ) {\n throw new Error('Invalid persisted stream error metadata');\n }\n return candidate as StreamMeta;\n}\n\n/** Zero-padding keeps storage.list() results in stream offset order. */\nfunction chunkKey(index: number): string {\n return `${CHUNK_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction chunkSizeKey(index: number): string {\n return `${CHUNK_SIZE_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction segmentKey(start: number): string {\n return `${SEGMENT_KEY_PREFIX}${start.toString().padStart(12, '0')}`;\n}\n\nfunction segmentSizeKey(start: number): string {\n return `${SEGMENT_SIZE_KEY_PREFIX}${start.toString().padStart(12, '0')}`;\n}\n\nfunction startFromSegmentKey(key: string, prefix: string): number {\n const suffix = key.slice(prefix.length);\n const start = Number(suffix);\n if (\n !key.startsWith(prefix) ||\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(start) ||\n start > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream segment key \"${key}\"`);\n }\n return start;\n}\n\nfunction validateSegmentSize(value: unknown, start: number): SegmentSize {\n const size = value as Partial<SegmentSize> | undefined;\n if (\n !size ||\n !Number.isSafeInteger(size.count) ||\n size.count! < 1 ||\n !Number.isSafeInteger(size.bytes) ||\n size.bytes! < 0\n ) {\n throw new Error(`Invalid persisted stream segment size at index ${start}`);\n }\n return size as SegmentSize;\n}\n\n/** Pack chunks as `[u32 count][u32 length]*count` followed by the payloads. */\nfunction encodeSegment(chunks: Uint8Array[]): Uint8Array {\n const payloadBytes = chunks.reduce((total, chunk) => total + chunk.byteLength, 0);\n const header = 4 + 4 * chunks.length;\n const encoded = new Uint8Array(header + payloadBytes);\n const view = new DataView(encoded.buffer);\n view.setUint32(0, chunks.length);\n let offset = header;\n for (let index = 0; index < chunks.length; index++) {\n view.setUint32(4 + 4 * index, chunks[index].byteLength);\n encoded.set(chunks[index], offset);\n offset += chunks[index].byteLength;\n }\n return encoded;\n}\n\nfunction decodeSegment(value: unknown, start: number, size: SegmentSize): Uint8Array[] {\n if (!(value instanceof Uint8Array) || value.byteLength < 4) {\n throw new Error(`Invalid persisted stream segment at index ${start}`);\n }\n const view = new DataView(value.buffer, value.byteOffset, value.byteLength);\n const count = view.getUint32(0);\n const header = 4 + 4 * count;\n if (count !== size.count || header + size.bytes !== value.byteLength) {\n throw new Error(`Invalid persisted stream segment at index ${start}`);\n }\n const chunks: Uint8Array[] = [];\n let offset = header;\n for (let index = 0; index < count; index++) {\n const length = view.getUint32(4 + 4 * index);\n if (offset + length > value.byteLength) {\n throw new Error(`Invalid persisted stream segment at index ${start}`);\n }\n chunks.push(value.subarray(offset, offset + length));\n offset += length;\n }\n if (offset !== value.byteLength) {\n throw new Error(`Invalid persisted stream segment at index ${start}`);\n }\n return chunks;\n}\n\n/** Group one write's chunks into segments of at most MAX_SEGMENT_BYTES payload bytes. */\nfunction packSegments(\n startIndex: number,\n chunks: Uint8Array[],\n): Array<{ start: number; chunks: Uint8Array[] }> {\n const segments: Array<{ start: number; chunks: Uint8Array[] }> = [];\n let current: Uint8Array[] = [];\n let bytes = 0;\n let start = startIndex;\n for (const chunk of chunks) {\n if (current.length > 0 && bytes + chunk.byteLength > MAX_SEGMENT_BYTES) {\n segments.push({ start, chunks: current });\n start += current.length;\n current = [];\n bytes = 0;\n }\n current.push(chunk);\n bytes += chunk.byteLength;\n }\n if (current.length > 0) segments.push({ start, chunks: current });\n return segments;\n}\n\nfunction indexFromChunkSizeKey(key: string): number {\n const suffix = key.slice(CHUNK_SIZE_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk size key \"${key}\"`);\n }\n return index;\n}\n\nfunction indexFromChunkKey(key: string): number {\n const suffix = key.slice(CHUNK_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk key \"${key}\"`);\n }\n return index;\n}\n\nfunction validateChunkSize(size: unknown, index: number): number {\n if (\n typeof size !== 'number' ||\n !Number.isSafeInteger(size) ||\n size < 0 ||\n size > MAX_STREAM_CHUNK_BYTES\n ) {\n throw new Error(`Invalid persisted stream chunk size at index ${index}`);\n }\n return size;\n}\n\nasync function deleteInBatches(txn: DurableObjectTransaction, keys: string[]): Promise<void> {\n for (let offset = 0; offset < keys.length; offset += DELETE_BATCH_KEYS) {\n await txn.delete(keys.slice(offset, offset + DELETE_BATCH_KEYS));\n }\n}\n\nfunction compactChunk(chunk: Uint8Array): Uint8Array {\n return chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength\n ? chunk\n : new Uint8Array(chunk);\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');\n}\n\n/**\n * Durable Object backing workflow streams.\n *\n * Stream cells persist binary chunks under monotonic offset keys. Public\n * reads are bounded long polls, and writes append a bounded ordered batch in\n * one storage transaction. Per-run registry cells retain their existing role.\n */\nexport class StreamDO extends DurableObject {\n private meta: StreamMeta | undefined;\n private metaLoad: Promise<StreamMeta> | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private changeVersion = 0;\n private readonly waiters = new Set<StreamWaiter>();\n\n /** Multi-key read split into calls within the per-call key limit. */\n private async getMany<T>(keys: string[]): Promise<Map<string, T>> {\n if (keys.length <= STORAGE_BATCH_KEYS) return await this.ctx.storage.get<T>(keys);\n const groups: string[][] = [];\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_KEYS) {\n groups.push(keys.slice(offset, offset + STORAGE_BATCH_KEYS));\n }\n const merged = new Map<string, T>();\n for (const result of await Promise.all(groups.map((group) => this.ctx.storage.get<T>(group)))) {\n for (const [key, value] of result) merged.set(key, value);\n }\n return merged;\n }\n\n private async getMeta(): Promise<StreamMeta> {\n if (this.meta) return this.meta;\n this.metaLoad ??= this.ctx.storage.get<StreamMeta>(META_KEY).then((meta) => {\n const loaded = meta === undefined ? emptyMeta() : validateMeta(meta);\n this.meta = loaded;\n return loaded;\n });\n try {\n return await this.metaLoad;\n } catch (error) {\n this.metaLoad = undefined;\n throw error;\n }\n }\n\n private assertOwner(meta: StreamMeta, runId: string): void {\n if (!runId) throw new Error('Stream runId is required');\n if (meta.ownerRunId !== undefined && meta.ownerRunId !== runId) {\n throw new Error(`Stream is owned by workflow run \"${meta.ownerRunId}\"`);\n }\n }\n\n private assertWritable(meta: StreamMeta, runId: string): void {\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state === 'closed') throw new Error('Cannot write to a closed stream');\n if (meta.state === 'errored') throw new Error('Cannot write to an errored stream');\n }\n\n private runMutation<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.mutationTail.then(operation, operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private wakeReaders(): void {\n this.changeVersion += 1;\n for (const waiter of Array.from(this.waiters)) waiter.resolve('change');\n }\n\n private waitForChange(\n observedVersion: number,\n waitMs: number,\n signal?: AbortSignal,\n ): Promise<'change' | 'timeout'> {\n if (signal?.aborted) return Promise.reject(abortReason(signal));\n\n return new Promise<'change' | 'timeout'>((resolve, reject) => {\n let settled = false;\n const waiter: StreamWaiter = {\n timer: setTimeout(() => finish('timeout'), waitMs),\n signal,\n resolve: (reason) => finish(reason),\n };\n\n const cleanup = () => {\n clearTimeout(waiter.timer);\n this.waiters.delete(waiter);\n if (waiter.signal && waiter.onAbort) {\n waiter.signal.removeEventListener('abort', waiter.onAbort);\n }\n };\n const finish = (reason: 'change' | 'timeout') => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(reason);\n };\n waiter.onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(abortReason(signal!));\n };\n\n this.waiters.add(waiter);\n signal?.addEventListener('abort', waiter.onAbort, { once: true });\n\n // A writer may have committed after the caller inspected metadata but\n // before this waiter was installed. The generation check closes that\n // lost-wakeup window without another storage read.\n if (this.changeVersion !== observedVersion) finish('change');\n });\n }\n\n private async readSnapshot(\n request: StreamReadRequest,\n timedOut: boolean,\n ): Promise<StreamReadResult> {\n const meta = await this.getMeta();\n this.assertOwner(meta, request.runId);\n\n const available =\n meta.state === 'expired'\n ? 0\n : Math.max(0, Math.min(request.maxChunks, meta.count - request.startIndex));\n let chunks: Uint8Array[] = [];\n if (available > 0) {\n chunks =\n meta.layout === SEGMENT_LAYOUT\n ? await this.readSegmentRows(request.startIndex, available, request.maxBytes)\n : await this.readChunkRows(request.startIndex, available, request.maxBytes);\n }\n\n return {\n startIndex: request.startIndex,\n tailIndex: meta.count - 1,\n chunks,\n state: meta.state,\n timedOut,\n error: meta.error,\n };\n }\n\n private async readChunkRows(\n startIndex: number,\n available: number,\n maxBytes: number,\n ): Promise<Uint8Array[]> {\n const indexes = Array.from({ length: available }, (_, offset) => startIndex + offset);\n const sizeKeys = indexes.map(chunkSizeKey);\n const storedSizes = await this.getMany<number>(sizeKeys);\n const selectedIndexes: number[] = [];\n const selectedSizes: number[] = [];\n let bytes = 0;\n for (const index of indexes) {\n const size = validateChunkSize(storedSizes.get(chunkSizeKey(index)), index);\n if (bytes + size > maxBytes) break;\n selectedIndexes.push(index);\n selectedSizes.push(size);\n bytes += size;\n }\n\n const payloadKeys = selectedIndexes.map(chunkKey);\n const storedChunks = await this.getMany<Uint8Array>(payloadKeys);\n const chunks: Uint8Array[] = [];\n for (let offset = 0; offset < payloadKeys.length; offset++) {\n const chunk = storedChunks.get(payloadKeys[offset]);\n if (!(chunk instanceof Uint8Array) || chunk.byteLength !== selectedSizes[offset]) {\n throw new Error(`Invalid persisted stream chunk at index ${selectedIndexes[offset]}`);\n }\n chunks.push(chunk);\n }\n return chunks;\n }\n\n /**\n * Plan from the small segment size rows, then load only the segments that\n * cover the requested range. A read that starts on a segment boundary (the\n * common sequential case) needs one list and one multi-get.\n */\n private async readSegmentRows(\n startIndex: number,\n available: number,\n maxBytes: number,\n ): Promise<Uint8Array[]> {\n const endIndex = startIndex + available;\n const listed = await this.ctx.storage.list<SegmentSize>({\n prefix: SEGMENT_SIZE_KEY_PREFIX,\n start: segmentSizeKey(startIndex),\n end: segmentSizeKey(endIndex),\n limit: available,\n });\n const planned: Array<{ start: number; size: SegmentSize }> = [];\n for (const [key, value] of listed) {\n const start = startFromSegmentKey(key, SEGMENT_SIZE_KEY_PREFIX);\n planned.push({ start, size: validateSegmentSize(value, start) });\n }\n if (planned[0]?.start !== startIndex) {\n // The read starts inside a segment: find the segment that contains it.\n const containing = await this.ctx.storage.list<SegmentSize>({\n prefix: SEGMENT_SIZE_KEY_PREFIX,\n end: segmentSizeKey(startIndex + 1),\n reverse: true,\n limit: 1,\n });\n const entry = containing.entries().next().value;\n if (!entry) throw new Error(`Missing persisted stream segment at index ${startIndex}`);\n const start = startFromSegmentKey(entry[0], SEGMENT_SIZE_KEY_PREFIX);\n planned.unshift({ start, size: validateSegmentSize(entry[1], start) });\n }\n\n // The durable tail promises every offset in this range exists. In\n // particular, a missing final size row must not look like EOF to a\n // resumed reader of a closed stream. Check the small index rows before\n // applying the payload byte budget, including a containing segment.\n let covered = startIndex;\n for (let index = 0; index < planned.length; index++) {\n const { start, size } = planned[index];\n if (start > covered) {\n throw new Error(`Missing persisted stream segment at index ${covered}`);\n }\n if (index > 0 && start !== covered) {\n throw new Error(`Overlapping persisted stream segment at index ${start}`);\n }\n if (start + size.count <= covered) {\n throw new Error(`Missing persisted stream segment at index ${covered}`);\n }\n covered = start + size.count;\n }\n if (covered < endIndex) {\n throw new Error(`Missing persisted stream segment at index ${covered}`);\n }\n\n // Load segments until the byte budget is reached; per-chunk sizes are\n // known only after decoding, so the final selection below trims exactly.\n const selected: Array<{ start: number; size: SegmentSize }> = [];\n let plannedBytes = 0;\n for (const segment of planned) {\n if (selected.length > 0 && plannedBytes >= maxBytes) break;\n selected.push(segment);\n plannedBytes += segment.size.bytes;\n }\n const values = await this.getMany<Uint8Array>(selected.map(({ start }) => segmentKey(start)));\n\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n let expected = startIndex;\n for (const { start, size } of selected) {\n if (start > expected)\n throw new Error(`Missing persisted stream segment at index ${expected}`);\n const segment = decodeSegment(values.get(segmentKey(start)), start, size);\n for (let offset = expected - start; offset < segment.length; offset++) {\n if (expected >= endIndex || bytes + segment[offset].byteLength > maxBytes) return chunks;\n chunks.push(segment[offset]);\n bytes += segment[offset].byteLength;\n expected++;\n }\n }\n return chunks;\n }\n\n /** Append one bounded binary batch with contiguous indexes. */\n async writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult> {\n validateStreamWriteChunks(chunks);\n return await this.runMutation(async () => {\n const committed = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertWritable(meta, runId);\n const startIndex = meta.count;\n if (startIndex + chunks.length > MAX_STREAM_INDEX) {\n throw new Error('Stream offset limit exceeded');\n }\n // A stream keeps the layout it was created with.\n const layout = stored === undefined ? NEW_STREAM_LAYOUT : meta.layout;\n const nextMeta: StreamMeta = {\n count: startIndex + chunks.length,\n state: 'open',\n ownerRunId: runId,\n ...(layout === undefined ? {} : { layout }),\n };\n const entries: Array<[string, StreamMeta | Uint8Array | number | SegmentSize]> = [\n [META_KEY, nextMeta],\n ];\n if (layout === SEGMENT_LAYOUT) {\n for (const segment of packSegments(startIndex, chunks)) {\n entries.push([segmentKey(segment.start), encodeSegment(segment.chunks)]);\n entries.push([\n segmentSizeKey(segment.start),\n {\n count: segment.chunks.length,\n bytes: segment.chunks.reduce((total, chunk) => total + chunk.byteLength, 0),\n },\n ]);\n }\n } else {\n const storedChunks = chunks.map(compactChunk);\n for (let offset = 0; offset < storedChunks.length; offset++) {\n const index = startIndex + offset;\n entries.push([chunkKey(index), storedChunks[offset]]);\n entries.push([chunkSizeKey(index), storedChunks[offset].byteLength]);\n }\n }\n // One transaction, written in groups within the per-call key limit.\n for (let offset = 0; offset < entries.length; offset += STORAGE_BATCH_KEYS) {\n await txn.put(Object.fromEntries(entries.slice(offset, offset + STORAGE_BATCH_KEYS)));\n }\n return {\n meta: nextMeta,\n result: {\n startIndex,\n count: chunks.length,\n tailIndex: nextMeta.count - 1,\n } satisfies StreamWriteResult,\n };\n });\n this.meta = committed.meta;\n this.metaLoad = Promise.resolve(committed.meta);\n this.wakeReaders();\n return committed.result;\n });\n }\n\n /**\n * Return available binary chunks and terminal metadata in one bounded\n * operation, waiting at most waitMs when the requested offset is idle.\n */\n async readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult> {\n validateStreamReadRequest(request);\n const observedVersion = this.changeVersion;\n const immediate = await this.readSnapshot(request, false);\n if (\n immediate.chunks.length > 0 ||\n immediate.state !== 'open' ||\n request.waitMs === 0 ||\n request.maxChunks === 0\n ) {\n return immediate;\n }\n\n const reason = await this.waitForChange(observedVersion, request.waitMs, signal);\n return await this.readSnapshot(request, reason === 'timeout');\n }\n\n /** Close idempotently; the first terminal state wins. */\n async closeStream(runId: string): Promise<void> {\n await this.runMutation(async () => {\n const nextMeta = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const closed: StreamMeta = { ...meta, ownerRunId: runId, state: 'closed' };\n await txn.put(META_KEY, closed);\n return closed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Persist a terminal stream failure and wake every pending reader. */\n async failStream(runId: string, error: StreamErrorData | string): Promise<void> {\n const normalized = normalizeStreamError(error);\n await this.runMutation(async () => {\n const nextMeta = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const failed: StreamMeta = {\n ...meta,\n ownerRunId: runId,\n state: 'errored',\n error: normalized,\n };\n await txn.put(META_KEY, failed);\n return failed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Register a stream name against this per-run registry instance. */\n async registerStream(runId: string, name: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error(`Workflow run \"${runId}\" has expired`);\n }\n const owner = await txn.get<string>(REGISTRY_OWNER_KEY);\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n await txn.put(REGISTRY_OWNER_KEY, runId);\n await txn.put(`${STREAM_REGISTRY_PREFIX}${name}`, true);\n });\n }\n\n async listStreams(): Promise<string[]> {\n if ((await this.ctx.storage.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error('Workflow run streams have expired');\n }\n const entries = await this.ctx.storage.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX });\n return Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length));\n }\n\n /** Fence a run's registry before any stream cells are removed. */\n async expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult> {\n const limit = boundedLimit(options?.limit, 16, 128);\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n await txn.put({\n [REGISTRY_OWNER_KEY]: runId,\n [REGISTRY_EXPIRED_KEY]: expiry ?? { expiredAt, deleted: 0 },\n });\n const entries = await txn.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX, limit });\n return {\n streams: Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length)),\n };\n });\n }\n\n /** Remove completed registry entries in a bounded, retry-safe batch. */\n async finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n if (owner !== runId || expiry === undefined) {\n throw new Error(`Stream registry for workflow run \"${runId}\" is not expired`);\n }\n const keys = Array.from(new Set(streams.map((name) => `${STREAM_REGISTRY_PREFIX}${name}`)));\n const removed = keys.length === 0 ? 0 : await txn.delete(keys);\n const deleted = expiry.deleted + removed;\n await txn.put<RegistryExpiry>(REGISTRY_EXPIRED_KEY, { ...expiry, deleted });\n const remaining = await txn.list({ prefix: STREAM_REGISTRY_PREFIX, limit: 1 });\n return { deleted, done: remaining.size === 0 };\n });\n }\n\n /** Delete one page of per-chunk rows, listing size rows to avoid loading payloads. */\n private async expireChunkPage(\n txn: DurableObjectTransaction,\n limit: number,\n byteLimit: number,\n ): Promise<{ chunks: number; bytes: number; done: boolean }> {\n const candidates = await txn.list<number>({\n prefix: CHUNK_SIZE_KEY_PREFIX,\n limit: limit + 1,\n });\n const page: Array<{ index: number; size: number }> = [];\n let bytes = 0;\n for (const [key, storedSize] of Array.from(candidates).slice(0, limit)) {\n const index = indexFromChunkSizeKey(key);\n const size = validateChunkSize(storedSize, index);\n if (page.length > 0 && bytes + size > byteLimit) break;\n page.push({ index, size });\n bytes += size;\n }\n\n let payloadFallback = false;\n if (candidates.size === 0) {\n const payloads = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n const first = payloads.entries().next().value;\n if (first) {\n const [key, payload] = first;\n page.push({\n index: indexFromChunkKey(key),\n size: payload instanceof Uint8Array ? payload.byteLength : 0,\n });\n bytes = page[0].size;\n payloadFallback = true;\n }\n }\n\n const keys = page.flatMap(({ index }) => [chunkKey(index), chunkSizeKey(index)]);\n await deleteInBatches(txn, keys);\n let done = candidates.size === page.length;\n if (payloadFallback) {\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n } else if (done && candidates.size > 0) {\n // A corrupt/missing size index can otherwise make cleanup report\n // completion while leaving an orphan payload. Verify once after the\n // final staged size-index page; healthy pages return an empty list.\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n }\n return { chunks: page.length, bytes, done };\n }\n\n /**\n * Delete one page of segment rows, listing segment size rows to avoid\n * loading payloads. One segment always makes progress, even when it holds\n * more chunks or bytes than the page allows.\n */\n private async expireSegmentPage(\n txn: DurableObjectTransaction,\n limit: number,\n byteLimit: number,\n ): Promise<{ chunks: number; bytes: number; done: boolean }> {\n const candidates = await txn.list<SegmentSize>({\n prefix: SEGMENT_SIZE_KEY_PREFIX,\n limit: limit + 1,\n });\n const page: number[] = [];\n let chunks = 0;\n let bytes = 0;\n for (const [key, value] of candidates) {\n const start = startFromSegmentKey(key, SEGMENT_SIZE_KEY_PREFIX);\n const size = validateSegmentSize(value, start);\n if (page.length > 0 && (chunks + size.count > limit || bytes + size.bytes > byteLimit)) {\n break;\n }\n page.push(start);\n chunks += size.count;\n bytes += size.bytes;\n }\n\n let orphan = false;\n if (candidates.size === 0) {\n // A segment row without its size row: delete it on its own.\n const segments = await txn.list<Uint8Array>({ prefix: SEGMENT_KEY_PREFIX, limit: 1 });\n const first = segments.entries().next().value;\n if (first) {\n page.push(startFromSegmentKey(first[0], SEGMENT_KEY_PREFIX));\n bytes = first[1] instanceof Uint8Array ? first[1].byteLength : 0;\n chunks = 1;\n orphan = true;\n }\n }\n\n await deleteInBatches(\n txn,\n page.flatMap((start) => [segmentKey(start), segmentSizeKey(start)]),\n );\n let done = !orphan && candidates.size === page.length;\n if (orphan || done) {\n const remaining = await txn.list({ prefix: SEGMENT_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n }\n return { chunks, bytes, done };\n }\n\n /**\n * Fence the stream and delete one bounded page. Listing size keys avoids\n * loading payloads, and the transaction makes a crash retry resume safely.\n */\n async expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult> {\n const limit = boundedLimit(options?.limit, DEFAULT_EXPIRE_CHUNK_LIMIT, MAX_EXPIRE_CHUNK_LIMIT);\n const byteLimit = boundedLimit(\n options?.byteLimit,\n DEFAULT_EXPIRE_BYTE_LIMIT,\n MAX_EXPIRE_BYTE_LIMIT,\n );\n return await this.runMutation(async () => {\n const result = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n const firstFence = meta.state !== 'expired';\n\n const { chunks, bytes, done } =\n meta.layout === SEGMENT_LAYOUT\n ? await this.expireSegmentPage(txn, limit, byteLimit)\n : await this.expireChunkPage(txn, limit, byteLimit);\n if (done && chunks === 0 && meta.state === 'expired' && meta.payloadDeleted) {\n return {\n meta,\n result: { deleted: false, chunks: 0, bytes: 0, done: true },\n };\n }\n const nextMeta: StreamMeta = {\n ...meta,\n count: done ? 0 : meta.count,\n ownerRunId: runId,\n state: 'expired',\n error: undefined,\n expiredAt: meta.expiredAt ?? expiredAt,\n expiredChunkCount: meta.expiredChunkCount ?? meta.count,\n payloadDeleted: done,\n };\n await txn.put(META_KEY, nextMeta);\n return {\n meta: nextMeta,\n result: {\n deleted: firstFence,\n chunks,\n bytes,\n done,\n } satisfies ExpireStreamResult,\n };\n });\n\n this.meta = result.meta;\n this.metaLoad = Promise.resolve(result.meta);\n this.wakeReaders();\n return result.result;\n });\n }\n}\n","import { DurableObject } from '../do-base.js';\nimport {\n createWorkflowIndex,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n type WorkflowIndex,\n} from '../../indexes.js';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { isTerminalWorkflowRunStatus, slotToEventId, WorkflowRunSchema } from '@workflow/world';\nimport {\n applyEvent,\n finalizeEventPage,\n hookClaimCancellationKey,\n type ApplyEventOutcome,\n type ApplyEventRequest,\n EVENT_KEY_PREFIX,\n type EventStore,\n HOOK_CREATED_KEY_PREFIX,\n HOOK_KEY_PREFIX,\n listByCreationTime,\n listByPrefix,\n parseApplyEventRequest,\n STEP_CREATED_KEY_PREFIX,\n STEP_KEY_PREFIX,\n WAIT_KEY_PREFIX,\n} from '../../apply-event.js';\nimport {\n CLEANUP_RECORD_KEY,\n type CleanupRecord,\n cleanupFromTombstone,\n cleanupTombstone,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n type ExpireRunStreamsResult,\n type ExpireStreamResult,\n type FinalizeRunStreamsResult,\n expiredRead,\n HOOK_MARKER_PREFIX,\n type HookIndexReference,\n hookMarkerKey,\n type RunReadOutcome,\n type RunLifecycleStatus,\n type RunTombstone,\n type ScheduleCleanupRequest,\n TERMINAL_CLEANUP_KEY,\n type TerminalCleanupRecord,\n TOMBSTONE_KEY,\n} from '../../retention.js';\nimport { MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS } from '../../lifecycle.js';\nimport { isNonNegativeSafeInteger, isPositiveSafeInteger, isRecord } from '../../validation.js';\nimport {\n QUEUE_PAYLOAD_REGISTRY_PREFIX,\n QUEUE_RESERVATION_GRACE_MS,\n queuePayloadRegistryKey,\n type QueuePayloadOrphan,\n type QueuePayloadRegistration,\n type RunQueueReservation,\n} from '../../queue-protocol.js';\nimport {\n deleteQueuePayloadObjects,\n type QueuePayloadObjectStorageBinding,\n} from '../queue-payload-store.js';\n\ninterface CellId {\n toString(): string;\n}\n\ninterface CellNamespace<T> {\n idFromName(name: string): CellId;\n get(id: CellId): T;\n}\n\ninterface StreamCleanupStub {\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\ninterface WorkflowRunDOEnv {\n WORKFLOW_DB?: CellNamespace<{ unregisterQueuePayload(messageId: string): Promise<void> }>;\n WORKFLOW_RUN_CATALOG?: CellNamespace<RunCatalogShardStub>;\n WORKFLOW_HOOK_TOKENS?: CellNamespace<HookTokenShardStub>;\n WORKFLOW_HOOK_IDS?: CellNamespace<HookIdShardStub>;\n WORKFLOW_STREAMS?: CellNamespace<StreamCleanupStub>;\n WORKFLOW_QUEUE_PAYLOADS?: Pick<QueuePayloadObjectStorageBinding, 'delete'>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\nconst EVENT_SEQUENCE_KEY = 'event_sequence';\nconst STORAGE_BATCH_SIZE = 128;\nconst PAYLOAD_DELETE_BATCH = STORAGE_BATCH_SIZE;\nconst HOOK_MARKER_PAGE_SIZE = 64;\nconst TERMINAL_HOOK_PAGE_SIZE = 64;\nconst TERMINAL_WAIT_PAGE_SIZE = STORAGE_BATCH_SIZE;\nconst STREAMS_PER_CLEANUP_PAGE = 16;\n/** StreamDO deletes a page in 128-key calls within one transaction. */\nconst STREAM_CHUNKS_PER_CLEANUP_PAGE = 256;\nconst STREAM_BYTES_PER_CLEANUP_PAGE = 16 * 1024 * 1024;\nconst QUEUE_PAYLOADS_PER_CLEANUP_PAGE = STORAGE_BATCH_SIZE;\nconst CLEANUP_RETRY_MAX_MS = 60 * 60 * 1000;\nconst MAX_DATE_MS = 8_640_000_000_000_000;\nconst QUEUE_ORPHAN_KEY = 'queue-orphan';\nconst QUEUE_RESERVATION_KEY = 'queue-reservation';\n/** Run-scoped Queue idempotency state, one key per claim name, in the run's own cell. */\nconst RUN_QUEUE_CLAIM_PREFIX = 'queue-claim:';\n/**\n * Present when every idempotency claim of this run lives in the run's own\n * cell. Written only when the run is created, so a run keeps one claim scope\n * for its whole life and claims made before the marker existed stay valid.\n */\nexport const RUN_QUEUE_CLAIM_SCOPE_KEY = 'queue-claim-scope';\ntype TerminalRun = Extract<WorkflowRun, { status: 'completed' | 'failed' | 'cancelled' }>;\n\nfunction validateCleanupRequest(request: unknown, allowDisabled: boolean): ScheduleCleanupRequest {\n if (!isRecord(request)) {\n throw new Error('world-celld retention request must be an object');\n }\n const validRetention = allowDisabled\n ? isNonNegativeSafeInteger(request.retentionMs)\n : isPositiveSafeInteger(request.retentionMs);\n if (!validRetention) {\n throw new Error(\n `world-celld retentionMs must be a ${allowDisabled ? 'non-negative' : 'positive'} safe integer`,\n );\n }\n return request as unknown as ScheduleCleanupRequest;\n}\n\nfunction retentionDeadline(baseMs: number, retentionMs: number, runId: string): number {\n const dueAtMs = baseMs + retentionMs;\n if (!Number.isSafeInteger(dueAtMs) || dueAtMs > MAX_DATE_MS) {\n throw new Error(`world-celld retention deadline is out of range for ${runId}`);\n }\n return dueAtMs;\n}\n\nfunction cleanupRecord(\n run: WorkflowRun,\n dueAt: Date,\n reason: NonNullable<CleanupRecord['reason']>,\n): CleanupRecord {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n return {\n version: 1,\n runId: run.runId,\n workflowName: run.workflowName,\n createdAt: run.createdAt,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason,\n dueAt,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueuePayloads: 0,\n };\n}\n\n/**\n * Adapt DO storage (or a transaction) to the {@link EventStore} interface\n * shared with the test mocks. No casts: the methods line up structurally,\n * this just pins the subset we rely on.\n */\nfunction storeFrom(storage: DurableObjectStorage | DurableObjectTransaction): EventStore {\n return {\n get: (key) => storage.get(key),\n getMany: (keys) => storage.get(keys),\n put: (key, value) => storage.put(key, value),\n delete: (key) => storage.delete(key),\n deleteMany: (keys) => storage.delete(keys),\n list: (options) => storage.list(options),\n deferTerminalCleanup: true,\n };\n}\n\nfunction hookCreationIndexKey(hook: Hook): string {\n return `${HOOK_CREATED_KEY_PREFIX}${hook.createdAt.toISOString()}:${hook.hookId}`;\n}\n\nasync function putStorageEntries(\n storage: DurableObjectTransaction,\n entries: Iterable<readonly [string, unknown]>,\n): Promise<void> {\n const all = Array.from(entries);\n for (let offset = 0; offset < all.length; offset += STORAGE_BATCH_SIZE) {\n await storage.put(Object.fromEntries(all.slice(offset, offset + STORAGE_BATCH_SIZE)));\n }\n}\n\ninterface InflightClaim {\n messageId: string;\n expiresAt: number;\n retryAt?: number;\n}\n\ninterface QueueMessageReservation extends InflightClaim {\n /** Absent on older records, whose broker publication was implicitly confirmed. */\n publicationPending?: true;\n}\n\n/**\n * Run-scoped equivalent of a claim cell's reservation and in-flight claim.\n * Expiry is checked on read, so no alarm is needed; completion deletes the\n * entry and run retention deletes any left behind.\n */\ninterface RunQueueClaimState {\n reservation?: QueueMessageReservation;\n claim?: InflightClaim;\n}\n\nfunction runQueueClaimKey(claimName: string): string {\n return `${RUN_QUEUE_CLAIM_PREFIX}${claimName}`;\n}\n\nfunction validRunQueueClaimName(claimName: unknown): claimName is string {\n return typeof claimName === 'string' && claimName.startsWith('claim:');\n}\n\ninterface QueuePayloadOrphanState extends QueuePayloadOrphan {\n generation: number;\n deleting: boolean;\n}\n\n/**\n * Durable Object for managing a single workflow run's state.\n *\n * All event-sourced writes go through {@link applyEvent} inside a single\n * storage transaction: guard checks, the event append, and the entity\n * mutation are atomic even if the DO is evicted mid-operation.\n *\n * Instances named `claim:<queueName>:<idempotencyKey>` reserve one message ID\n * at publication time and serialize its deliveries until completion.\n */\nexport class WorkflowRunDO extends DurableObject {\n private now(): number {\n const clock = (this.env as WorkflowRunDOEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n private tombstoneFrom(\n values: Map<string, RunTombstone | CleanupRecord>,\n now = this.now(),\n ): RunTombstone | null {\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) return tombstone;\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (!cleanup || (cleanup.phase === 'retained' && cleanup.dueAt.getTime() > now)) return null;\n return cleanupTombstone(cleanup, cleanup.tombstonedAt ?? cleanup.dueAt);\n }\n\n private async retentionState(\n storage: DurableObjectStorage | DurableObjectTransaction,\n now = this.now(),\n options?: { withEventSequence?: boolean },\n ): Promise<{ cleanup?: CleanupRecord; tombstone: RunTombstone | null; eventSequence: number }> {\n const keys = [TOMBSTONE_KEY, CLEANUP_RECORD_KEY];\n if (options?.withEventSequence) keys.push(EVENT_SEQUENCE_KEY);\n const values = await storage.get<RunTombstone | CleanupRecord | number>(keys);\n return {\n cleanup: values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined,\n tombstone: this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>, now),\n eventSequence: (values.get(EVENT_SEQUENCE_KEY) as number | undefined) ?? 0,\n };\n }\n\n private async read<T>(\n reader: (storage: DurableObjectTransaction) => Promise<T>,\n ): Promise<RunReadOutcome<T>> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) return expiredRead(tombstone);\n return { ok: true, value: await reader(txn) };\n });\n }\n\n private async readKey<T>(key: string): Promise<RunReadOutcome<T | null>> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | T>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n key,\n ]);\n const tombstone = this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>);\n if (tombstone) return expiredRead<T | null>(tombstone);\n return { ok: true, value: (values.get(key) as T | undefined) ?? null };\n });\n }\n\n /** Apply an event and capture all retention metadata in the same transaction. */\n async applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome> {\n request = parseApplyEventRequest(request);\n if (this.ctx.id.name !== undefined && request.runId !== this.ctx.id.name) {\n throw new TypeError(\n `applyEvent runId \"${request.runId}\" does not match durable object \"${this.ctx.id.name}\"`,\n );\n }\n if (request.cleanup !== undefined) validateCleanupRequest(request.cleanup, true);\n return await this.ctx.storage.transaction(async (txn) => {\n const now = new Date(this.now());\n const retention = await this.retentionState(txn, now.getTime(), { withEventSequence: true });\n const { tombstone } = retention;\n if (tombstone) {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${request.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n\n const storedSequence = retention.eventSequence;\n let eventSequence = storedSequence;\n const outcome = await applyEvent(storeFrom(txn), {\n ...request,\n nextEventId: () => slotToEventId(++eventSequence),\n now,\n });\n if (!outcome.ok) return outcome;\n\n // An idempotent replay appends nothing; leaving the sequence untouched\n // keeps its transaction read-only, so it skips the durable commit.\n if (eventSequence !== storedSequence) await txn.put(EVENT_SEQUENCE_KEY, eventSequence);\n // A run created by this version keeps its Queue idempotency claims in\n // its own cell for its whole life.\n if (outcome.runCreated) await txn.put(RUN_QUEUE_CLAIM_SCOPE_KEY, 'run');\n const hookReferences: HookIndexReference[] = outcome.hookToIndex\n ? [\n {\n hookId: outcome.hookToIndex.hookId,\n token: outcome.hookToIndex.token,\n },\n ...outcome.releasedHooks,\n ]\n : outcome.releasedHooks;\n await putStorageEntries(\n txn,\n hookReferences.map((reference) => [hookMarkerKey(reference), reference] as const),\n );\n\n const retentionMs = request.cleanup?.retentionMs ?? 0;\n if (\n retentionMs > 0 &&\n outcome.run &&\n isTerminalWorkflowRunStatus(outcome.run.status) &&\n !retention.cleanup\n ) {\n const terminalRun = outcome.run as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(terminalRun.completedAt.getTime(), retentionMs, terminalRun.runId),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, 'terminal-retention');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(dueAt);\n outcome.run = run;\n }\n if (outcome.run && isTerminalWorkflowRunStatus(outcome.run.status)) {\n const terminalCleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (!terminalCleanup) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n version: 1,\n runId: outcome.run.runId,\n phase: 'hooks',\n generation: 0,\n attempts: 0,\n });\n }\n await txn.setAlarm(this.now() + 1);\n }\n if (outcome.run) {\n outcome.indexPublicationExpiresAt = now.getTime() + MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS;\n }\n return finalizeEventPage(storeFrom(txn), outcome, request.params);\n });\n }\n\n /**\n * Resolve an ambiguous hook-creation RPC in the same serialization domain as\n * applyEvent. If the hook is absent, the exact reservation is durably fenced\n * before the caller releases its token and hook-ID claims.\n */\n async resolveHookTokenClaim(request: {\n hookId: string;\n token: string;\n claimId: string;\n }): Promise<{ committed: boolean }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n // Once the authoritative expiry record exists (including the logical\n // tombstone at dueAt), a lost-response resolver must not recreate\n // unbounded per-claim state next to the tombstone.\n if (tombstone) return { committed: false };\n const hook = await txn.get<Hook>(`${HOOK_KEY_PREFIX}${request.hookId}`);\n if (hook?.token === request.token) return { committed: true };\n await txn.put(hookClaimCancellationKey(request.claimId), {\n hookId: request.hookId,\n token: request.token,\n canceledAt: this.now(),\n });\n return { committed: false };\n });\n }\n\n async getRun(): Promise<RunReadOutcome<WorkflowRun | null>> {\n return this.readKey<WorkflowRun>('run');\n }\n\n /** Fence both supported event-claim forms before an expired shard claim is released. */\n async resolveExpiredHookClaim(request: {\n hookId: string;\n claimId: string;\n token?: string;\n }): Promise<Hook | null> {\n if (\n typeof request?.hookId !== 'string' ||\n request.hookId.length === 0 ||\n typeof request.claimId !== 'string' ||\n request.claimId.length === 0 ||\n (request.token !== undefined && typeof request.token !== 'string')\n ) {\n throw new TypeError('world-celld expired hook claim resolution is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) return null;\n const run = await txn.get<WorkflowRun>('run');\n if (run && isTerminalWorkflowRunStatus(run.status)) return null;\n const hook = await txn.get<Hook>(`${HOOK_KEY_PREFIX}${request.hookId}`);\n if (hook && (request.token === undefined || hook.token === request.token)) return hook;\n const cancellation = { hookId: request.hookId, token: request.token, canceledAt: this.now() };\n await txn.put({\n [hookClaimCancellationKey(`${request.claimId}:${request.claimId}`)]: cancellation,\n [hookClaimCancellationKey(`-:${request.claimId}`)]: cancellation,\n });\n return null;\n });\n }\n\n /** Single authoritative lifecycle answer used after derivative compaction. */\n async getLifecycleStatus(): Promise<RunLifecycleStatus> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | WorkflowRun>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n 'run',\n ]);\n if (this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>)) {\n return 'expired';\n }\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return 'missing';\n return isTerminalWorkflowRunStatus(run.status) ? 'terminal' : 'active';\n });\n }\n\n async getStep(stepId: string): Promise<RunReadOutcome<Step | null>> {\n return this.readKey<Step>(`${STEP_KEY_PREFIX}${stepId}`);\n }\n\n async listSteps(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Step[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Step>(storeFrom(txn), STEP_CREATED_KEY_PREFIX, STEP_KEY_PREFIX, {\n limit: params?.limit ?? 20,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getEvent(eventId: string): Promise<RunReadOutcome<Event | null>> {\n return this.readKey<Event>(`${EVENT_KEY_PREFIX}${eventId}`);\n }\n\n async listEvents(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Event[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByPrefix<Event>(\n storeFrom(txn),\n EVENT_KEY_PREFIX,\n {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n },\n (event) => event.eventId,\n ),\n );\n }\n\n async listHooks(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Hook[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Hook>(storeFrom(txn), HOOK_CREATED_KEY_PREFIX, HOOK_KEY_PREFIX, {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getCleanupStatus(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | RunTombstone>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (cleanup) return cleanup;\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n return tombstone ? cleanupFromTombstone(tombstone) : null;\n }\n\n /** Explicitly schedule an existing terminal run, used for opt-in backfills. */\n async scheduleCleanup(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<\n CleanupRecord | RunTombstone | TerminalCleanupRecord | WorkflowRun\n >([CLEANUP_RECORD_KEY, TOMBSTONE_KEY, TERMINAL_CLEANUP_KEY, 'run']);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (existing) return existing;\n if (values.get(TOMBSTONE_KEY)) return null;\n const current = values.get('run') as WorkflowRun | undefined;\n if (!current || !isTerminalWorkflowRunStatus(current.status)) return null;\n const terminalRun = current as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(\n terminalRun.completedAt.getTime(),\n request.retentionMs,\n terminalRun.runId,\n ),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, 'manual');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(\n values.get(TERMINAL_CLEANUP_KEY) || dueAt.getTime() <= this.now() ? this.now() + 1 : dueAt,\n );\n return cleanup;\n });\n }\n\n /**\n * Apply the fleet-wide maximum-age policy to one authoritative run.\n *\n * The catalog is only a discovery index: eligibility is rechecked from the\n * RunDO's own createdAt. Once eligible, the cleanup deadline immediately\n * becomes an authoritative write/read fence, including for active runs.\n */\n async enforceRetention(request: EnforceRetentionRequest): Promise<EnforceRetentionResult> {\n validateCleanupRequest(request, false);\n if (!Number.isSafeInteger(request.scheduledTime) || request.scheduledTime < 0) {\n throw new Error('world-celld retention scheduledTime must be a non-negative safe integer');\n }\n\n const result = await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<CleanupRecord | RunTombstone | WorkflowRun>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n 'run',\n ]);\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) {\n return {\n state: 'expired',\n cleanup: cleanupFromTombstone(tombstone),\n } satisfies EnforceRetentionResult;\n }\n\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return { state: 'missing', cleanup: null } satisfies EnforceRetentionResult;\n const dueAtMs = retentionDeadline(run.createdAt.getTime(), request.retentionMs, run.runId);\n if (dueAtMs > request.scheduledTime) {\n return { state: 'not-due', cleanup: null } satisfies EnforceRetentionResult;\n }\n\n const dueAt = new Date(dueAtMs);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n let cleanup = existing;\n if (!cleanup) {\n cleanup = cleanupRecord(run, dueAt, 'maximum-age');\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n } else if (cleanup.phase === 'retained' && dueAtMs < cleanup.dueAt.getTime()) {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n cleanup = {\n ...cleanup,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason: 'maximum-age',\n dueAt,\n generation: cleanup.generation + 1,\n };\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n }\n await txn.setAlarm(this.now() + 1);\n return {\n state: cleanup.dueAt.getTime() <= this.now() ? 'expired' : 'scheduled',\n cleanup,\n } satisfies EnforceRetentionResult;\n });\n\n // Remove the discovery index before returning when possible. The\n // remaining stream/queue/payload pages continue through the run's alarm.\n if (result.state === 'scheduled' || result.state === 'expired') {\n for (let page = 0; page < 2; page++) {\n const cleanup = await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (cleanup?.phase !== 'retained' && cleanup?.phase !== 'index') break;\n await this.executeScheduledCleanupPage();\n }\n return {\n ...result,\n cleanup: (await this.getCleanupStatus()) ?? result.cleanup,\n };\n }\n return result;\n }\n\n async cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n if (!(await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY))) {\n await this.scheduleCleanup(request);\n }\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase === 'tombstoned') return;\n const dueAt = new Date(this.now());\n const run = await txn.get<WorkflowRun>('run');\n if (run) await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n dueAt,\n generation: cleanup.generation + 1,\n });\n await txn.setAlarm(this.now() + 1);\n });\n await this.executeScheduledCleanupPage();\n return this.getCleanupStatus();\n }\n\n async rearmCleanup(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | TerminalCleanupRecord>([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n if (terminalCleanup) {\n await this.ctx.storage.setAlarm(this.now() + 1);\n } else if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n } else {\n await this.ctx.storage.setAlarm(Math.max(this.now() + 1, cleanup.dueAt.getTime()));\n }\n return cleanup ?? null;\n }\n\n async alarm(): Promise<void> {\n await this.executeScheduledCleanupPage();\n }\n\n private namespace<T>(name: keyof WorkflowRunDOEnv): CellNamespace<T> {\n const namespace = (this.env as WorkflowRunDOEnv)?.[name];\n if (!namespace || typeof namespace === 'function') {\n throw new Error(`world-celld retention missing binding ${name}`);\n }\n return namespace as CellNamespace<T>;\n }\n\n private workflowIndex(): WorkflowIndex {\n return createWorkflowIndex({\n runCatalog: this.namespace<RunCatalogShardStub>('WORKFLOW_RUN_CATALOG'),\n hookTokens: this.namespace<HookTokenShardStub>('WORKFLOW_HOOK_TOKENS'),\n hookIds: this.namespace<HookIdShardStub>('WORKFLOW_HOOK_IDS'),\n });\n }\n\n private async setCleanupPhase(\n expected: CleanupRecord,\n next: CleanupRecord['phase'],\n updates: Partial<CleanupRecord> = {},\n continueAt?: number,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n ...updates,\n phase: next,\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n if (continueAt !== undefined) await txn.setAlarm(continueAt);\n });\n }\n\n private async executeScheduledCleanupPage(): Promise<void> {\n const values = await this.ctx.storage.get<\n CleanupRecord | TerminalCleanupRecord | InflightClaim | QueuePayloadOrphanState | WorkflowRun\n >([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n 'claim',\n QUEUE_RESERVATION_KEY,\n QUEUE_ORPHAN_KEY,\n 'run',\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n const claim = values.get('claim') as InflightClaim | undefined;\n const reservation = values.get(QUEUE_RESERVATION_KEY) as QueueMessageReservation | undefined;\n const queueOrphan = values.get(QUEUE_ORPHAN_KEY) as QueuePayloadOrphanState | undefined;\n\n if (queueOrphan) {\n const leased = await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (!current) return null;\n if (current.expiresAt > this.now()) {\n await txn.setAlarm(current.expiresAt);\n return null;\n }\n if (current.deleting) return current;\n const next: QueuePayloadOrphanState = {\n ...current,\n generation: current.generation + 1,\n deleting: true,\n };\n await txn.put(QUEUE_ORPHAN_KEY, next);\n return next;\n });\n if (!leased) return;\n const bucket = (this.env as WorkflowRunDOEnv)?.WORKFLOW_QUEUE_PAYLOADS;\n const runs = (this.env as WorkflowRunDOEnv)?.WORKFLOW_DB;\n if (!bucket || !runs) {\n throw new Error('world-celld queue orphan cleanup is missing required bindings');\n }\n await deleteQueuePayloadObjects(bucket, leased.key);\n const run = runs.get(runs.idFromName(leased.runId));\n await run.unregisterQueuePayload(leased.messageId);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (\n current?.messageId !== leased.messageId ||\n current.generation !== leased.generation ||\n !current.deleting\n ) {\n return;\n }\n await txn.delete(QUEUE_ORPHAN_KEY);\n await txn.deleteAlarm();\n });\n return;\n }\n\n if (claim || reservation) {\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n let nextClaim = current.get('claim');\n let nextReservation = current.get(QUEUE_RESERVATION_KEY);\n const now = this.now();\n if (nextClaim && nextClaim.expiresAt <= now) {\n await txn.delete('claim');\n nextClaim = undefined;\n }\n if (nextReservation && nextReservation.expiresAt <= now) {\n await txn.delete(QUEUE_RESERVATION_KEY);\n nextReservation = undefined;\n }\n const nextAlarm = Math.min(\n nextClaim?.expiresAt ?? Number.POSITIVE_INFINITY,\n nextReservation?.expiresAt ?? Number.POSITIVE_INFINITY,\n );\n if (Number.isFinite(nextAlarm)) await txn.setAlarm(nextAlarm);\n else await txn.deleteAlarm();\n });\n return;\n }\n\n // Once retention is due it is the lifecycle authority. Do not make an\n // expired run wait behind terminal hook/wait disposal; payload cleanup\n // removes that derivative state later in the same bounded state machine.\n if (cleanup && cleanup.phase !== 'tombstoned' && cleanup.dueAt.getTime() <= this.now()) {\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n return;\n }\n\n if (terminalCleanup) {\n try {\n await this.executeTerminalCleanup(terminalCleanup);\n } catch (error) {\n await this.recordTerminalCleanupFailure(error, terminalCleanup);\n }\n return;\n }\n\n if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n return;\n }\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n }\n\n private async executeCleanup(cleanup: CleanupRecord): Promise<void> {\n if (cleanup.phase === 'retained') {\n if (cleanup.dueAt.getTime() > this.now()) {\n await this.ctx.storage.setAlarm(cleanup.dueAt);\n return;\n }\n await this.setCleanupPhase(cleanup, 'index', {}, this.now() + 1);\n return;\n }\n\n if (cleanup.phase === 'index') {\n await this.deleteIndexPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'streams') {\n await this.deleteStreamPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'queues') {\n await this.deleteQueuePage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'payload') {\n await this.deletePayloadBatch();\n }\n }\n\n private async executeTerminalCleanup(cleanup: TerminalCleanupRecord): Promise<void> {\n if (cleanup.phase === 'hooks' && (await this.completeSmallTerminalCleanup(cleanup))) return;\n if (cleanup.phase === 'hooks') {\n await this.deleteTerminalHookPage(cleanup);\n } else if (cleanup.phase === 'markers') {\n await this.deleteTerminalHookMarkerPage(cleanup);\n } else {\n await this.deleteTerminalWaitPage(cleanup);\n }\n }\n\n /**\n * Most runs end with a handful of hooks and waits. When every terminal\n * phase fits in one page, release the hook indexes once and delete hooks,\n * markers, and waits in a single transaction instead of one alarm and one\n * transaction per phase. Returns false, having changed nothing locally, when\n * any phase needs paging; the paged phases then run as before.\n */\n private async completeSmallTerminalCleanup(cleanup: TerminalCleanupRecord): Promise<boolean> {\n const [hookEntries, markerEntries] = await Promise.all([\n this.ctx.storage.list<Hook>({ prefix: HOOK_KEY_PREFIX, limit: TERMINAL_HOOK_PAGE_SIZE + 1 }),\n this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n }),\n ]);\n if (hookEntries.size > TERMINAL_HOOK_PAGE_SIZE || markerEntries.size > HOOK_MARKER_PAGE_SIZE) {\n return false;\n }\n const hooks = Array.from(hookEntries.values());\n const references = new Map<string, HookIndexReference>();\n for (const reference of [\n ...hooks.map((hook) => ({ hookId: hook.hookId, token: hook.token })),\n ...markerEntries.values(),\n ]) {\n references.set(`${reference.hookId}\\u0000${reference.token}`, reference);\n }\n if (references.size > 0) {\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: Array.from(references.values()),\n });\n }\n\n return await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n // Another pass owns the record now; there is nothing left to do here.\n return true;\n }\n const waits = await txn.list({ prefix: WAIT_KEY_PREFIX, limit: TERMINAL_WAIT_PAGE_SIZE + 1 });\n if (waits.size > TERMINAL_WAIT_PAGE_SIZE) return false;\n const keys = [\n ...hooks.flatMap((hook) => [\n `${HOOK_KEY_PREFIX}${hook.hookId}`,\n hookCreationIndexKey(hook),\n ]),\n ...markerEntries.keys(),\n ...waits.keys(),\n ];\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n await txn.delete(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n await txn.delete(TERMINAL_CLEANUP_KEY);\n const retention = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (retention && retention.phase !== 'tombstoned') {\n await txn.setAlarm(Math.max(this.now() + 1, retention.dueAt.getTime()));\n } else {\n await txn.deleteAlarm();\n }\n return true;\n });\n }\n\n private async deleteTerminalHookPage(cleanup: TerminalCleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<Hook>({\n prefix: HOOK_KEY_PREFIX,\n limit: TERMINAL_HOOK_PAGE_SIZE + 1,\n });\n const page = Array.from(entries.values()).slice(0, TERMINAL_HOOK_PAGE_SIZE);\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: page.map((hook) => ({ hookId: hook.hookId, token: hook.token })),\n });\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const keys = page.flatMap((hook) => [\n `${HOOK_KEY_PREFIX}${hook.hookId}`,\n hookCreationIndexKey(hook),\n ]);\n if (keys.length > 0) await txn.delete(keys);\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n phase: entries.size <= TERMINAL_HOOK_PAGE_SIZE ? 'markers' : 'hooks',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteTerminalHookMarkerPage(cleanup: TerminalCleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n });\n const page = Array.from(entries).slice(0, HOOK_MARKER_PAGE_SIZE);\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: page.map(([, reference]) => reference),\n });\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const keys = page.map(([key]) => key);\n if (keys.length > 0) await txn.delete(keys);\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n phase: entries.size <= HOOK_MARKER_PAGE_SIZE ? 'waits' : 'markers',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteTerminalWaitPage(cleanup: TerminalCleanupRecord): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const entries = await txn.list({\n prefix: WAIT_KEY_PREFIX,\n limit: TERMINAL_WAIT_PAGE_SIZE + 1,\n });\n const keys = Array.from(entries.keys()).slice(0, TERMINAL_WAIT_PAGE_SIZE);\n if (keys.length > 0) await txn.delete(keys);\n\n if (entries.size > TERMINAL_WAIT_PAGE_SIZE) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n return;\n }\n\n await txn.delete(TERMINAL_CLEANUP_KEY);\n const retention = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (retention && retention.phase !== 'tombstoned') {\n await txn.setAlarm(Math.max(this.now() + 1, retention.dueAt.getTime()));\n } else {\n await txn.deleteAlarm();\n }\n });\n }\n\n private async deleteIndexPage(cleanup: CleanupRecord): Promise<void> {\n const hookEntries = await this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n });\n const hookMarkers = Array.from(hookEntries).slice(0, HOOK_MARKER_PAGE_SIZE);\n await this.workflowIndex().expireRun({\n runId: cleanup.runId,\n hooks: hookMarkers.map(([, value]) => value),\n expiredAt: cleanup.dueAt.getTime(),\n });\n const markerKeys = hookMarkers.map(([key]) => key);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'index' || current.generation !== cleanup.generation) return;\n if (markerKeys.length > 0) await txn.delete(markerKeys);\n if (hookEntries.size <= HOOK_MARKER_PAGE_SIZE) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n phase: 'streams',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n } else {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n }\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteStreamPage(cleanup: CleanupRecord): Promise<void> {\n const streamsNamespace = this.namespace<StreamCleanupStub>('WORKFLOW_STREAMS');\n const registry = streamsNamespace.get(\n streamsNamespace.idFromName(`run-streams:${cleanup.runId}`),\n );\n const { streams } = await registry.expireRegistry(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: STREAMS_PER_CLEANUP_PAGE,\n });\n const completed: string[] = [];\n let remainingChunks = STREAM_CHUNKS_PER_CLEANUP_PAGE;\n let remainingBytes = STREAM_BYTES_PER_CLEANUP_PAGE;\n for (const name of streams) {\n if (remainingChunks <= 0 || remainingBytes <= 0) break;\n const stream = streamsNamespace.get(streamsNamespace.idFromName(`stream:${name}`));\n const result = await stream.expireStream(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: remainingChunks,\n byteLimit: remainingBytes,\n });\n remainingChunks -= result.chunks;\n remainingBytes -= result.bytes;\n if (result.done) completed.push(name);\n }\n const registryResult = await registry.finalizeRegistry(cleanup.runId, completed);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'streams' || current.generation !== cleanup.generation) return;\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedStreams: registryResult.deleted,\n phase: registryResult.done ? 'queues' : 'streams',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteQueuePage(cleanup: CleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<QueuePayloadRegistration>({\n prefix: QUEUE_PAYLOAD_REGISTRY_PREFIX,\n limit: QUEUE_PAYLOADS_PER_CLEANUP_PAGE + 1,\n });\n const page = Array.from(entries).slice(0, QUEUE_PAYLOADS_PER_CLEANUP_PAGE);\n const bucket = (this.env as WorkflowRunDOEnv)?.WORKFLOW_QUEUE_PAYLOADS;\n if (!bucket) {\n throw new Error('world-celld retention missing binding WORKFLOW_QUEUE_PAYLOADS');\n }\n if (page.length > 0) {\n await deleteQueuePayloadObjects(\n bucket,\n page.map(([, registration]) => registration.key),\n );\n }\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'queues' || current.generation !== cleanup.generation) return;\n if (page.length > 0) await txn.delete(page.map(([key]) => key));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedQueuePayloads: current.deletedQueuePayloads + page.length,\n phase: entries.size <= QUEUE_PAYLOADS_PER_CLEANUP_PAGE ? 'payload' : 'queues',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deletePayloadBatch(): Promise<boolean> {\n return await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase !== 'payload') return true;\n const entries = await txn.list({ limit: PAYLOAD_DELETE_BATCH + 3, noCache: true });\n const keys = Array.from(entries.keys())\n .filter((key) => key !== CLEANUP_RECORD_KEY && key !== TOMBSTONE_KEY)\n .slice(0, PAYLOAD_DELETE_BATCH);\n const now = new Date(this.now());\n await txn.put(TOMBSTONE_KEY, cleanupTombstone(cleanup, now));\n if (keys.length > 0) await txn.delete(keys);\n\n if (keys.length > 0) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n deletedPayloadKeys: cleanup.deletedPayloadKeys + keys.length,\n generation: cleanup.generation + 1,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n return false;\n }\n\n const completed: CleanupRecord = {\n ...cleanup,\n phase: 'tombstoned',\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n tombstonedAt: now,\n };\n await txn.put(TOMBSTONE_KEY, cleanupTombstone(completed, now));\n await txn.delete(CLEANUP_RECORD_KEY);\n await txn.deleteAlarm();\n return true;\n });\n }\n\n private async recordCleanupFailure(error: unknown, expected: CleanupRecord): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation ||\n cleanup.phase === 'tombstoned'\n ) {\n return;\n }\n const attempts = cleanup.attempts + 1;\n const delay = Math.min(CLEANUP_RETRY_MAX_MS, 1000 * 2 ** Math.min(attempts - 1, 12));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n generation: cleanup.generation + 1,\n attempts,\n lastError: error instanceof Error ? error.message : String(error),\n lastAttemptAt: new Date(this.now()),\n });\n await txn.setAlarm(this.now() + delay);\n });\n }\n\n private async recordTerminalCleanupFailure(\n error: unknown,\n expected: TerminalCleanupRecord,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n const attempts = cleanup.attempts + 1;\n const delay = Math.min(CLEANUP_RETRY_MAX_MS, 1000 * 2 ** Math.min(attempts - 1, 12));\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...cleanup,\n generation: cleanup.generation + 1,\n attempts,\n lastError: error instanceof Error ? error.message : String(error),\n lastAttemptAt: new Date(this.now()),\n });\n await txn.setAlarm(this.now() + delay);\n });\n }\n\n /**\n * Read-only admission for a run-bearing Queue message whose body travels\n * inline in the broker envelope. It answers what payload registration does\n * for offloaded bodies, without writing anything.\n */\n async getQueueAdmission(): Promise<{ ok: true } | { ok: false; message: string }> {\n const { tombstone } = await this.retentionState(this.ctx.storage);\n return tombstone\n ? {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n }\n : { ok: true };\n }\n\n /**\n * Enqueue-side admission and idempotency reservation in one transaction,\n * for a run-scoped claim. Replaces a separate claim cell's reservation plus\n * the run expiry check.\n */\n async reserveRunQueueMessage(params: {\n claimName: string;\n messageId: string;\n expiresAt: number;\n publicationPending?: boolean;\n }): Promise<RunQueueReservation> {\n if (\n !validRunQueueClaimName(params?.claimName) ||\n typeof params.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.expiresAt) ||\n (params.publicationPending !== undefined && typeof params.publicationPending !== 'boolean')\n ) {\n throw new TypeError('world-celld run queue reservation is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const values = await txn.get<RunTombstone | CleanupRecord | RunQueueClaimState | string>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n RUN_QUEUE_CLAIM_SCOPE_KEY,\n key,\n ]);\n const tombstone = this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n // A run created before run-scoped claims keeps its claims in claim cells.\n if (values.get(RUN_QUEUE_CLAIM_SCOPE_KEY) !== 'run') return { ok: true, scope: 'cell' };\n const state = (values.get(key) as RunQueueClaimState | undefined) ?? {};\n const existing = state.reservation;\n if (\n existing &&\n existing.expiresAt > this.now() &&\n (existing.messageId !== params.messageId || params.publicationPending)\n ) {\n return {\n ok: true,\n scope: 'run',\n admitted: false,\n messageId: existing.messageId,\n ...(existing.publicationPending ? { publicationPending: true as const } : {}),\n };\n }\n await txn.put<RunQueueClaimState>(key, {\n ...state,\n reservation: {\n messageId: params.messageId,\n expiresAt: Math.max(existing?.expiresAt ?? 0, params.expiresAt),\n ...(params.publicationPending ? { publicationPending: true as const } : {}),\n },\n });\n return { ok: true, scope: 'run', admitted: true, messageId: params.messageId };\n });\n }\n\n async confirmRunQueueMessagePublication(params: {\n claimName: string;\n messageId: string;\n expiresAt: number;\n }): Promise<void> {\n if (\n !validRunQueueClaimName(params?.claimName) ||\n typeof params.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.expiresAt)\n ) {\n throw new TypeError('world-celld run queue publication confirmation is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const state = await txn.get<RunQueueClaimState>(key);\n if (state?.reservation?.messageId !== params.messageId) return;\n await txn.put<RunQueueClaimState>(key, {\n ...state,\n reservation: {\n messageId: params.messageId,\n expiresAt: Math.max(state.reservation.expiresAt, params.expiresAt),\n },\n });\n });\n }\n\n /** Delivery-side run expiry check and in-flight claim in one transaction. */\n async claimRunQueueMessage(params: {\n claimName: string;\n messageId: string;\n staleMs: number;\n }): Promise<{ expired: true } | { expired: false; claimed: boolean; retryAt?: number }> {\n if (\n !validRunQueueClaimName(params?.claimName) ||\n typeof params.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isPositiveSafeInteger(params.staleMs)\n ) {\n throw new TypeError('world-celld run queue claim is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const values = await txn.get<RunTombstone | CleanupRecord | RunQueueClaimState>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n key,\n ]);\n if (this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>)) {\n return { expired: true };\n }\n let state = (values.get(key) as RunQueueClaimState | undefined) ?? {};\n const now = this.now();\n if (\n state.reservation?.publicationPending &&\n state.reservation.messageId === params.messageId\n ) {\n state = {\n ...state,\n reservation: {\n messageId: params.messageId,\n expiresAt: Math.max(state.reservation.expiresAt, now + QUEUE_RESERVATION_GRACE_MS),\n },\n };\n // A delivery from the broker also proves a previously interrupted\n // producer's publication, before any suspension can extend its lease.\n await txn.put<RunQueueClaimState>(key, state);\n }\n const existing = state.claim;\n if (existing && existing.expiresAt > now) {\n if (existing.messageId !== params.messageId) return { expired: false, claimed: false };\n if (existing.retryAt === undefined || existing.retryAt > now) {\n return {\n expired: false,\n claimed: false,\n retryAt: existing.retryAt ?? existing.expiresAt,\n };\n }\n }\n await txn.put<RunQueueClaimState>(key, {\n ...state,\n claim: { messageId: params.messageId, expiresAt: now + params.staleMs },\n });\n return { expired: false, claimed: true };\n });\n }\n\n async holdRunQueueMessage(params: {\n claimName: string;\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }> {\n if (\n !validRunQueueClaimName(params?.claimName) ||\n typeof params.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.retryAt) ||\n !isNonNegativeSafeInteger(params.expiresAt) ||\n (params.reservationExpiresAt !== undefined &&\n !isNonNegativeSafeInteger(params.reservationExpiresAt))\n ) {\n throw new TypeError('world-celld run queue claim hold is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const state = (await txn.get<RunQueueClaimState>(key)) ?? {};\n const existing = state.claim;\n if (!existing || existing.messageId !== params.messageId) return { held: false };\n const next: RunQueueClaimState = {\n ...state,\n claim: {\n ...existing,\n retryAt: params.retryAt,\n expiresAt: Math.max(existing.expiresAt, params.expiresAt),\n },\n };\n if (\n state.reservation?.messageId === params.messageId &&\n params.reservationExpiresAt !== undefined &&\n params.reservationExpiresAt > state.reservation.expiresAt\n ) {\n next.reservation = { ...state.reservation, expiresAt: params.reservationExpiresAt };\n }\n await txn.put<RunQueueClaimState>(key, next);\n return { held: true };\n });\n }\n\n async releaseRunQueueMessage(params: { claimName: string; messageId: string }): Promise<void> {\n if (!validRunQueueClaimName(params?.claimName) || typeof params.messageId !== 'string') {\n throw new TypeError('world-celld run queue claim release is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const state = await txn.get<RunQueueClaimState>(key);\n if (state?.claim?.messageId !== params.messageId) return;\n const { claim: _released, ...rest } = state;\n if (rest.reservation) await txn.put<RunQueueClaimState>(key, rest);\n else await txn.delete(key);\n });\n }\n\n async completeRunQueueMessage(params: { claimName: string; messageId: string }): Promise<void> {\n if (!validRunQueueClaimName(params?.claimName) || typeof params.messageId !== 'string') {\n throw new TypeError('world-celld run queue completion is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const state = await txn.get<RunQueueClaimState>(key);\n if (!state) return;\n const next: RunQueueClaimState = {};\n if (state.reservation && state.reservation.messageId !== params.messageId) {\n next.reservation = state.reservation;\n }\n if (state.claim && state.claim.messageId !== params.messageId) next.claim = state.claim;\n if (next.reservation || next.claim) await txn.put<RunQueueClaimState>(key, next);\n else await txn.delete(key);\n });\n }\n\n /** Failed enqueue cleanup must preserve delivery already accepted by the broker. */\n async abandonRunQueueMessageReservation(params: {\n claimName: string;\n messageId: string;\n }): Promise<void> {\n if (\n !validRunQueueClaimName(params?.claimName) ||\n typeof params.messageId !== 'string' ||\n params.messageId.length === 0\n ) {\n throw new TypeError('world-celld run queue reservation abandonment is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const key = runQueueClaimKey(params.claimName);\n const state = await txn.get<RunQueueClaimState>(key);\n if (state?.reservation?.messageId !== params.messageId) return;\n const { reservation: _abandoned, ...rest } = state;\n if (rest.claim) await txn.put<RunQueueClaimState>(key, rest);\n else await txn.delete(key);\n });\n }\n\n async registerQueuePayload(\n registration: QueuePayloadRegistration,\n ): Promise<{ ok: true } | { ok: false; message: string }> {\n if (\n !registration ||\n typeof registration.messageId !== 'string' ||\n registration.messageId.length === 0 ||\n typeof registration.key !== 'string' ||\n registration.key.length === 0 ||\n !isNonNegativeSafeInteger(registration.orphanExpiresAt)\n ) {\n throw new TypeError('world-celld queue payload registration is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n await txn.put(queuePayloadRegistryKey(registration.messageId), registration);\n return { ok: true };\n });\n }\n\n async finalizeQueuePayload(\n messageId: string,\n ): Promise<{ ok: true } | { ok: false; message: string }> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload messageId must be a non-empty string');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n const registration = await txn.get<QueuePayloadRegistration>(\n queuePayloadRegistryKey(messageId),\n );\n return registration\n ? { ok: true }\n : {\n ok: false,\n message: 'workflow queue payload registration was removed before publication',\n };\n });\n }\n\n async unregisterQueuePayload(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload messageId must be a non-empty string');\n }\n await this.ctx.storage.delete(queuePayloadRegistryKey(messageId));\n }\n\n async scheduleQueuePayloadOrphan(orphan: QueuePayloadOrphan): Promise<void> {\n if (\n !orphan ||\n typeof orphan.messageId !== 'string' ||\n orphan.messageId.length === 0 ||\n typeof orphan.runId !== 'string' ||\n orphan.runId.length === 0 ||\n typeof orphan.key !== 'string' ||\n orphan.key.length === 0 ||\n !isNonNegativeSafeInteger(orphan.expiresAt)\n ) {\n throw new TypeError('world-celld queue payload orphan is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (existing && existing.messageId !== orphan.messageId) {\n throw new Error('world-celld queue payload orphan identity mismatch');\n }\n if (existing?.deleting) {\n throw new Error('world-celld queue payload orphan deletion is in progress');\n }\n const next: QueuePayloadOrphanState = {\n ...orphan,\n expiresAt: Math.max(existing?.expiresAt ?? 0, orphan.expiresAt),\n generation: (existing?.generation ?? 0) + 1,\n deleting: false,\n };\n await txn.put<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY, next);\n await txn.setAlarm(next.expiresAt);\n });\n }\n\n async cancelQueuePayloadOrphan(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload orphan messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (!existing || existing.messageId !== messageId) return;\n await txn.delete(QUEUE_ORPHAN_KEY);\n await txn.deleteAlarm();\n });\n }\n\n async reserveQueueMessage(params: {\n messageId: string;\n expiresAt: number;\n publicationPending?: boolean;\n }): Promise<{ admitted: boolean; messageId: string; publicationPending?: true }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.expiresAt) ||\n (params.publicationPending !== undefined && typeof params.publicationPending !== 'boolean')\n ) {\n throw new TypeError('world-celld queue message reservation is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<QueueMessageReservation>([QUEUE_RESERVATION_KEY, 'claim']);\n const existing = values.get(QUEUE_RESERVATION_KEY);\n const claim = values.get('claim');\n const now = this.now();\n if (\n existing &&\n existing.expiresAt > now &&\n (existing.messageId !== params.messageId || params.publicationPending)\n ) {\n await txn.setAlarm(Math.min(existing.expiresAt, claim?.expiresAt ?? existing.expiresAt));\n return {\n admitted: false,\n messageId: existing.messageId,\n ...(existing.publicationPending ? { publicationPending: true as const } : {}),\n };\n }\n const reservation: QueueMessageReservation = {\n messageId: params.messageId,\n expiresAt: Math.max(existing?.expiresAt ?? 0, params.expiresAt),\n ...(params.publicationPending ? { publicationPending: true as const } : {}),\n };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n await txn.setAlarm(\n Math.min(reservation.expiresAt, claim?.expiresAt ?? reservation.expiresAt),\n );\n return { admitted: true, messageId: params.messageId };\n });\n }\n\n async confirmQueueMessagePublication(params: {\n messageId: string;\n expiresAt: number;\n }): Promise<void> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.expiresAt)\n ) {\n throw new TypeError('world-celld queue publication confirmation is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<QueueMessageReservation>([QUEUE_RESERVATION_KEY, 'claim']);\n const existing = values.get(QUEUE_RESERVATION_KEY);\n if (existing?.messageId !== params.messageId) return;\n const reservation: QueueMessageReservation = {\n messageId: params.messageId,\n expiresAt: Math.max(existing.expiresAt, params.expiresAt),\n };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n await txn.setAlarm(\n Math.min(reservation.expiresAt, values.get('claim')?.expiresAt ?? reservation.expiresAt),\n );\n });\n }\n\n async completeQueueMessage(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>([QUEUE_RESERVATION_KEY, 'claim']);\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n let claim = values.get('claim');\n if (reservation?.messageId === messageId) {\n await txn.delete(QUEUE_RESERVATION_KEY);\n reservation = undefined;\n }\n if (claim?.messageId === messageId) {\n await txn.delete('claim');\n claim = undefined;\n }\n const nextAlarm = Math.min(\n reservation?.expiresAt ?? Number.POSITIVE_INFINITY,\n claim?.expiresAt ?? Number.POSITIVE_INFINITY,\n );\n if (Number.isFinite(nextAlarm)) await txn.setAlarm(nextAlarm);\n else await txn.deleteAlarm();\n });\n }\n\n /** Abandon the enqueue reservation without releasing an active delivery claim. */\n async abandonQueueMessageReservation(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue reservation messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>([QUEUE_RESERVATION_KEY, 'claim']);\n const reservation = values.get(QUEUE_RESERVATION_KEY);\n if (reservation?.messageId !== messageId) return;\n await txn.delete(QUEUE_RESERVATION_KEY);\n const claim = values.get('claim');\n if (claim) await txn.setAlarm(claim.expiresAt);\n else await txn.deleteAlarm();\n });\n }\n\n async claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean; retryAt?: number }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isPositiveSafeInteger(params.staleMs)\n ) {\n throw new TypeError('world-celld queue claim is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<QueueMessageReservation>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n const now = this.now();\n if (reservation?.publicationPending && reservation.messageId === params.messageId) {\n reservation = {\n messageId: params.messageId,\n expiresAt: Math.max(reservation.expiresAt, now + QUEUE_RESERVATION_GRACE_MS),\n };\n await txn.put<QueueMessageReservation>(QUEUE_RESERVATION_KEY, reservation);\n }\n if (existing && existing.expiresAt > now) {\n if (existing.messageId !== params.messageId) return { claimed: false };\n if (existing.retryAt === undefined || existing.retryAt > now) {\n return { claimed: false, retryAt: existing.retryAt ?? existing.expiresAt };\n }\n }\n const expiresAt = now + params.staleMs;\n await txn.put<InflightClaim>('claim', { messageId: params.messageId, expiresAt });\n await txn.setAlarm(Math.min(expiresAt, reservation?.expiresAt ?? expiresAt));\n return { claimed: true };\n });\n }\n\n async holdInflight(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.retryAt) ||\n !isNonNegativeSafeInteger(params.expiresAt) ||\n (params.reservationExpiresAt !== undefined &&\n !isNonNegativeSafeInteger(params.reservationExpiresAt))\n ) {\n throw new TypeError('world-celld queue claim hold is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n if (!existing || existing.messageId !== params.messageId) return { held: false };\n const expiresAt = Math.max(existing.expiresAt, params.expiresAt);\n await txn.put<InflightClaim>('claim', { ...existing, retryAt: params.retryAt, expiresAt });\n if (\n reservation?.messageId === params.messageId &&\n params.reservationExpiresAt !== undefined &&\n params.reservationExpiresAt > reservation.expiresAt\n ) {\n reservation = { ...reservation, expiresAt: params.reservationExpiresAt };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n }\n await txn.setAlarm(Math.min(expiresAt, reservation?.expiresAt ?? expiresAt));\n return { held: true };\n });\n }\n\n async releaseInflight(messageId?: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n const reservation = values.get(QUEUE_RESERVATION_KEY);\n if (!existing || (messageId !== undefined && existing.messageId !== messageId)) return;\n await txn.delete('claim');\n if (reservation) await txn.setAlarm(reservation.expiresAt);\n else await txn.deleteAlarm();\n });\n }\n}\n","/**\n * celld worker entry: exports the Durable Object (cell) classes and the\n * default fetch router. This module (and everything it imports) must stay\n * free of Node built-ins — it runs inside celld's workerd runtime.\n */\n\nimport { WorkerEntrypoint } from './do-base.js';\nimport { deliverQueueMessage, type QueueDeliveryResult } from './queue-delivery.js';\nimport { createRouter, type WorkerEnv } from './router.js';\nimport { runRetentionSweep, type RetentionSweepEnv } from './retention-sweep.js';\nimport {\n createQueuePayloadStore,\n type QueuePayloadObjectStorageBinding,\n} from './queue-payload-store.js';\n\nexport { HookIdDO } from './durable-objects/HookIdDO.js';\nexport { HookTokenDO } from './durable-objects/HookTokenDO.js';\nexport { RunCatalogDO } from './durable-objects/RunCatalogDO.js';\nexport { StreamDO } from './durable-objects/StreamDO.js';\nexport { WorkflowRunDO } from './durable-objects/WorkflowRunDO.js';\nexport { createRouter, type WorkerEnv } from './router.js';\n\ninterface ScheduledControllerLike {\n scheduledTime: number;\n cron: string;\n}\n\ntype CelldWorkerEnv = Omit<WorkerEnv, 'WORKFLOW_QUEUE_PAYLOADS'> & {\n WORKFLOW_QUEUE_PAYLOADS?: QueuePayloadObjectStorageBinding;\n};\n\nasync function scheduled(controller: ScheduledControllerLike, env: CelldWorkerEnv): Promise<void> {\n const result = await runRetentionSweep(\n controller.scheduledTime,\n env as unknown as RetentionSweepEnv,\n );\n if (result.scanned > 0) {\n console.info('world-celld retention sweep', {\n cron: controller.cron,\n ...result,\n });\n }\n}\n\nexport default {\n async fetch(request: Request, env: CelldWorkerEnv): Promise<Response> {\n return createRouter({\n ...env,\n WORKFLOW_QUEUE_PAYLOADS: env.WORKFLOW_QUEUE_PAYLOADS\n ? createQueuePayloadStore(env.WORKFLOW_QUEUE_PAYLOADS)\n : undefined,\n })(request);\n },\n scheduled,\n};\n\n/** Only the companion consumer binds this internal delivery entrypoint. */\nexport class QueueDeliveryRpc extends WorkerEntrypoint<CelldWorkerEnv> {\n deliver(secret: unknown, envelope: unknown, attempt: unknown): Promise<QueueDeliveryResult> {\n return deliverQueueMessage(\n {\n ...this.env,\n WORKFLOW_QUEUE_PAYLOADS: this.env.WORKFLOW_QUEUE_PAYLOADS\n ? createQueuePayloadStore(this.env.WORKFLOW_QUEUE_PAYLOADS)\n : undefined,\n },\n secret,\n envelope,\n attempt,\n );\n }\n}\n"],"mappings":"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"}
|