@ewhauser/world-celld 0.3.2 → 0.4.0
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 +9 -0
- package/README.md +60 -20
- package/celld-worker/README.md +22 -0
- package/celld-worker/wrangler.jsonc +12 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/testing.js +133 -36
- package/dist/testing.js.map +1 -1
- package/dist/util-ya3V_FTA.js.map +1 -1
- package/dist/worker.d.ts +46 -5
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +259 -84
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","names":["sameOwner","MAX_RELEASE_BATCH","CLAIM_DEADLINE_PREFIX","pad","recordKey","claimKey","claimDeadlineKey","pad","STORAGE_BATCH_SIZE","pad","boundedLimit","getMany","deleteMany","#intVar","#authoritativeRunExpired","#withRunMutation","#maxInflight","#deliveryTimeoutMs","#now","#scheduleNextAlarm","#armAlarmAtMost","#claimPhase","#deliver","#compactExpiredRunFences","#dropExpiredMessage","#fetch","#ack","#retry","#rearm","STORAGE_BATCH_SIZE"],"sources":["../src/vendor/shared/serialization.ts","../src/codec.ts","../src/indexes.ts","../src/stream-protocol.ts","../src/worker/auth.ts","../src/worker/router.ts","../src/vendor/shared/util.ts","../src/worker/durable-objects/hook-index-shared.ts","../src/lifecycle.ts","../src/worker/durable-objects/HookIdDO.ts","../src/worker/durable-objects/HookTokenDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/RunCatalogDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/apply-event.ts","../src/retention.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"sourcesContent":["/** 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 over atob/btoa instead of\n * Buffer so this module is safe inside the celld worker bundle (workerd has\n * no Buffer global); atob/btoa are global in both workerd and Node >= 16.\n */\nexport function b64encode(bytes: Uint8Array): string {\n let bin = '';\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(bin);\n}\n\nexport function b64decode(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\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' && typeof obj.data === 'string') {\n return b64decode(obj.data);\n }\n // Legacy format: number array (backwards compat with NATS JetStream data)\n if (obj.__uint8array === true && Array.isArray(obj.data)) {\n return new Uint8Array(obj.data as number[]);\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","/**\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 goes through 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' && typeof obj.iso === 'string') {\n return new Date(obj.iso);\n }\n if (obj.__type === 'Uint8Array' && typeof obj.data === 'string') {\n return b64decode(obj.data);\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 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 limit?: number;\n reverse?: boolean;\n}\n\nexport interface IndexListPage {\n keys: Array<{ name: string; value: 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 expireRun(runId: string, keys: 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 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\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 pages = await Promise.all(\n allRunCatalogShardNames().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) =>\n shardPage.keys.map((entry) => ({ entry, encodedName: encoder.encode(entry.name) })),\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.keys,\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/** Metadata plus payload and size-index entries remain below the 128-key platform limit. */\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;\nexport const MAX_STREAM_READ_CHUNKS = 32;\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\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 > MAX_STREAM_WRITE_CHUNKS) {\n throw protocolError(`batch exceeds ${MAX_STREAM_WRITE_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 (!Number.isSafeInteger(request.startIndex) || request.startIndex < 0) {\n throw protocolError('startIndex must be a non-negative safe integer');\n }\n if (\n !Number.isSafeInteger(request.maxChunks) ||\n request.maxChunks < 0 ||\n request.maxChunks > MAX_STREAM_READ_CHUNKS\n ) {\n throw protocolError(`maxChunks must be between 0 and ${MAX_STREAM_READ_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 > MAX_STREAM_WRITE_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 > MAX_STREAM_WRITE_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 (result.chunks.length > MAX_STREAM_READ_CHUNKS || chunkBytes > MAX_STREAM_READ_BYTES + 128) {\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 > MAX_STREAM_READ_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","/**\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 */\nasync 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 * 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 { rpcParse, rpcStringify } from '../codec.js';\nimport type { HookTokenOwner } from '../config.js';\nimport {\n createWorkflowIndex,\n type CellNamespaceLike,\n type HookReservation,\n type HookIdShardStub,\n type HookTokenShardStub,\n type IndexListOptions,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport type { ExpireRunIndexesRequest, ReleaseHookIndexesRequest } from '../retention.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n STREAM_BATCH_CONTENT_TYPE,\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';\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\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: DONamespaceLike;\n WORLD_SECRET?: string;\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\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 queue: {\n env: 'WORKFLOW_QUEUE',\n methods: new Set([\n 'enqueue',\n 'stats',\n 'listDeadLetters',\n 'redriveDeadLetter',\n 'purgeDeadLetters',\n 'rearmAlarm',\n 'expireRun',\n 'acknowledgeExpireRun',\n ]),\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 + 1024;\n\nfunction errorResponse(status: number, name: string, message: string): Response {\n return Response.json({ error: { name, message } }, { status });\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\nfunction parseBoundedInteger(url: URL, name: string, minimum: number, maximum: number): number {\n const raw = url.searchParams.get(name);\n const value = raw === null ? Number.NaN : Number(raw);\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: { 'content-type': STREAM_BATCH_CONTENT_TYPE },\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 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] === 'index' && parts.length === 4) {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n const contentLength = Number(request.headers.get('content-length') ?? '0');\n if (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 try {\n const index = workflowIndex(env);\n let result: unknown;\n const operation = `${parts[2]}.${parts[3]}`;\n if (operation === 'runs.list') {\n result = await index.listRuns(args[0] as IndexListOptions | undefined);\n } else if (operation === 'runs.commit') {\n result = await index.commitRun(\n args[0] as WorkflowRun,\n args[1] as string,\n args[2] as number,\n );\n } else if (operation === 'runs.expire') {\n result = await index.expireRun(args[0] as ExpireRunIndexesRequest);\n } else if (operation === 'hooks.reserve') {\n result = await index.reserveHook(args[0] as string, args[1] as HookTokenOwner);\n } else if (operation === 'hooks.finalize') {\n result = await index.finalizeHookIndexes(\n args[0] as string,\n args[1] as string,\n args[2] as string,\n args[3] as HookTokenOwner,\n args[4] as HookReservation | undefined,\n );\n } else if (operation === 'hooks.release-reservation') {\n result = await index.releaseHookReservation(\n args[0] as string,\n args[1] as HookTokenOwner,\n args[2] as HookReservation,\n );\n } else if (operation === 'hooks.release') {\n result = await index.releaseHookIndexes(args[0] as ReleaseHookIndexesRequest);\n } else {\n return errorResponse(404, 'NotFound', `unknown index operation: ${operation}`);\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 namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const name = decodeURIComponent(parts[2]);\n const runId = url.searchParams.get('runId');\n if (!runId) return errorResponse(400, 'BadRequest', 'runId is required');\n const stub = namespace.get(namespace.idFromName(name)) as {\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n };\n\n try {\n if (request.method === 'POST') {\n if (!request.headers.get('content-type')?.startsWith(STREAM_BATCH_CONTENT_TYPE)) {\n return errorResponse(415, 'UnsupportedMediaType', STREAM_BATCH_CONTENT_TYPE);\n }\n const contentLength = Number(request.headers.get('content-length') ?? '0');\n if (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 result = await stub.writeChunks(runId, decodeStreamWriteBatch(body));\n return streamResponse(encodeStreamWriteResult(result));\n }\n\n if (request.method === 'GET') {\n const result = await stub.readChunks(\n {\n runId,\n startIndex: parseBoundedInteger(url, 'startIndex', 0, 0x7fffffff),\n maxChunks: parseBoundedInteger(url, 'maxChunks', 0, MAX_STREAM_READ_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 },\n request.signal,\n );\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 { status: err?.name === 'StreamProtocolError' ? 400 : 500 },\n );\n }\n }\n\n if (parts[1] !== 'rpc') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (request.method !== 'POST' || parts.length !== 5) {\n return errorResponse(404, 'NotFound', 'expected POST /v1/rpc/{binding}/{name}/{method}');\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 const contentLength = Number(request.headers.get('content-length') ?? '0');\n if (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 const name = decodeURIComponent(encodedName);\n const namespace = env[binding.env] as DONamespaceLike | undefined;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${binding.env}`);\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 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","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","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","/**\n * Hard protocol bounds used by lifecycle leases and derivative-fence cleanup.\n *\n * These are not retention TTLs. They bound how long a request which was\n * admitted before expiry may still mutate a derivative Durable Object:\n *\n * - fleet calls have at most three 5-minute attempts plus bounded retry delay;\n * - one queue delivery owns its lease for at most 5 minutes plus 30 seconds;\n * - hook admission spans reserve retries, one authoritative apply, and\n * finalize retries before the exact claim must be reacquired.\n */\nexport const MAX_FLEET_RPC_TIMEOUT_MS = 5 * 60 * 1000;\nexport const FLEET_IDEMPOTENT_ATTEMPTS = 3;\nexport const FLEET_RETRY_BACKOFF_MAX_MS = 900;\n\nexport const MAX_IDEMPOTENT_RPC_LIFETIME_MS =\n FLEET_IDEMPOTENT_ATTEMPTS * MAX_FLEET_RPC_TIMEOUT_MS + FLEET_RETRY_BACKOFF_MAX_MS;\nexport const MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS =\n MAX_FLEET_RPC_TIMEOUT_MS + MAX_IDEMPOTENT_RPC_LIFETIME_MS;\n\nexport const MAX_QUEUE_DELIVERY_TIMEOUT_MS = 5 * 60 * 1000;\nexport const QUEUE_INFLIGHT_GRACE_MS = 30 * 1000;\nexport const MAX_QUEUE_INFLIGHT_LEASE_MS = MAX_QUEUE_DELIVERY_TIMEOUT_MS + QUEUE_INFLIGHT_GRACE_MS;\n\nexport const CATALOG_FENCE_GRACE_MS = MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS;\nexport const QUEUE_FENCE_GRACE_MS = Math.max(MAX_FLEET_RPC_TIMEOUT_MS, MAX_QUEUE_INFLIGHT_LEASE_MS);\n\nexport const HOOK_CLAIM_LEASE_MS =\n (FLEET_IDEMPOTENT_ATTEMPTS * 2 + 1) * MAX_FLEET_RPC_TIMEOUT_MS + FLEET_RETRY_BACKOFF_MAX_MS * 2;\n\nexport const LIFECYCLE_COMPACTION_BATCH = 128;\nexport const LIFECYCLE_COMPACTION_RETRY_MS = 1000;\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 { DurableObject } from '../do-base.js';\nimport type { EnqueueOutcome, EnqueueRequest } from '../../queue.js';\nimport type {\n AcknowledgeQueueExpiryResult,\n ExpireQueueRunResult,\n QueueExpiryReceipt,\n} from '../../retention.js';\nimport type { RunLifecycleStatus } from '../../retention.js';\nimport {\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n QUEUE_FENCE_GRACE_MS,\n QUEUE_INFLIGHT_GRACE_MS,\n} from '../../lifecycle.js';\n\n/**\n * Queue cell: the celld replacement for Cloudflare Queues.\n *\n * One cell (`q:<shard>`) owns the full lifecycle of its messages: durable\n * scheduling via the cell alarm, delivery via outbound fetch (the same x-vqs\n * dialect as the in-process test pump), retries with capped exponential\n * backoff, idempotencyKey dedup, and a dead-letter table.\n *\n * Storage layout (KV-style, ordered scans via zero-padded epoch-ms keys):\n * cfg pinned QueueCellConfig (first-enqueue wins)\n * msg:<messageId> MessageRow\n * due:<paddedMs>:<messageId> schedule index -> messageId\n * inflight-deadline:<paddedMs>:<messageId>\n * ordered crash-recovery index -> messageId\n * key:<idempotencyKey> active dedup claim -> messageId\n * dlq:<paddedMs>:<messageId> DeadLetterRow\n * run:<runId>:<messageId> QueueRunReference for retention cleanup\n * expired-run:<runId> cumulative cleanup receipt; compactable only\n * after RunDO acknowledgement\n * expired-run-gc:<paddedMs>:<runId>\n * ordered compaction deadline -> runId\n *\n * celld gotchas designed around:\n * - celld#144 (alarm handlers can overlap): the storage-only claim phase runs\n * inside blockConcurrencyWhile; slow delivery I/O runs outside the gate via\n * waitUntil.\n * - six-failure alarm abandonment: the alarm handler never throws for data\n * conditions — backoff reschedules the alarm instead. rearmAlarm() is the\n * recovery hatch, and every enqueue also re-arms.\n * - deploys restart the fleet: in-flight deliveries die with the isolate; the\n * inflight-deadline sweep on the next alarm redelivers (at-least-once).\n */\n\nexport interface MessageRow {\n messageId: string;\n queueName: string;\n pathname: 'flow' | 'step';\n /** Pre-encoded tagged-JSON payload — forwarded byte-identical. */\n body: string;\n runId?: string;\n /**\n * Delivery target captured at enqueue time. Carried per message (not\n * pinned on the cell) so an app redeploy at a new URL never bricks the\n * queue: old messages deliver (or dead-letter) against their original\n * target, new messages against the new one.\n */\n targetBaseUrl: string;\n idempotencyKey?: string;\n /** Completed delivery attempts. */\n attempt: number;\n enqueuedAt: number;\n lastError?: string;\n}\n\nexport interface DeadLetterRow extends MessageRow {\n failedAt: number;\n}\n\nexport interface QueueStats {\n pending: number;\n inflight: number;\n deadLetters: number;\n alarmAt: number | null;\n}\n\ninterface QueueRunReference {\n messageId: string;\n dueKey?: string;\n inflightKey?: string;\n dlqKey?: string;\n idempotencyKey?: string;\n}\n\ninterface InflightClaim {\n row: MessageRow;\n /** The exact index key is also the lease token for this delivery attempt. */\n inflightKey: string;\n}\n\ninterface ExpiredRunFence {\n expiredAt: number;\n deleted: number;\n compactAt: number | null;\n}\n\ninterface ExpiredRunGc {\n runId: string;\n compactAt: number;\n}\n\nconst PERMANENT_STATUSES = new Set([404, 409, 410, 422]);\n\nconst DEFAULT_MAX_ATTEMPTS = 5;\nconst DEFAULT_MAX_INFLIGHT = 5;\nconst DEFAULT_DELIVERY_TIMEOUT_MS = 300_000;\n/** Move overdue alarms to a new timestamp so celld observes a fresh edge. */\nconst MIN_ALARM_DELAY_MS = 1;\n/** Bound expiry recovery so one alarm cannot monopolize the cell. */\nconst EXPIRED_INFLIGHT_BATCH = 128;\nconst STORAGE_BATCH_SIZE = 128;\nconst EXPIRE_RUN_REFERENCE_BATCH = 64;\nconst PURGE_DEAD_LETTER_BATCH = 128;\n\nconst INFLIGHT_DEADLINE_PREFIX = 'inflight-deadline:';\nconst EXPIRED_RUN_GC_PREFIX = 'expired-run-gc:';\n\ntype AlarmStorage = Pick<DurableObjectStorage, 'list' | 'getAlarm' | 'setAlarm' | 'deleteAlarm'>;\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction dueKey(atMs: number, messageId: string): string {\n return `due:${pad(atMs)}:${messageId}`;\n}\n\nfunction inflightKey(deadlineMs: number, messageId: string): string {\n return `${INFLIGHT_DEADLINE_PREFIX}${pad(deadlineMs)}:${messageId}`;\n}\n\nfunction deadlineFromInflightKey(key: string): number {\n return Number.parseInt(\n key.slice(INFLIGHT_DEADLINE_PREFIX.length, INFLIGHT_DEADLINE_PREFIX.length + 13),\n 10,\n );\n}\n\nfunction runReferenceKey(runId: string, messageId: string): string {\n return `run:${runId}:${messageId}`;\n}\n\nfunction expiredRunKey(runId: string): string {\n return `expired-run:${runId}`;\n}\n\nfunction expiredRunGcKey(runId: string, compactAt: number): string {\n return `${EXPIRED_RUN_GC_PREFIX}${pad(compactAt)}:${encodeURIComponent(runId)}`;\n}\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\nasync function getMany<T>(\n storage: DurableObjectTransaction,\n keys: string[],\n): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n const page = await storage.get<T>(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n for (const [key, value] of page) result.set(key, value);\n }\n return result;\n}\n\nasync function putMany(\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\nasync function deleteMany(storage: DurableObjectTransaction, keys: string[]): Promise<number> {\n let deleted = 0;\n const unique = Array.from(new Set(keys));\n for (let offset = 0; offset < unique.length; offset += STORAGE_BATCH_SIZE) {\n deleted += await storage.delete(unique.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n return deleted;\n}\n\nfunction backoffSeconds(attempt: number): number {\n return Math.min(60, 2 ** attempt);\n}\n\nasync function cancelUnusedResponseBody(response: Response): Promise<void> {\n try {\n await response.body?.cancel();\n } catch {\n // The delivery outcome is already known from the status. A cancellation\n // failure must not turn an acknowledged callback into a retry.\n }\n}\n\ninterface QueueCellEnv {\n QUEUE_MAX_ATTEMPTS?: string;\n QUEUE_MAX_INFLIGHT?: string;\n QUEUE_DELIVERY_TIMEOUT_MS?: string;\n WORKFLOW_CALLBACK_SECRET?: string;\n /** Test seams (never set by a real deploy — celld vars are strings). */\n clock?: () => number;\n fetch?: typeof fetch;\n WORKFLOW_DB?: {\n idFromName(name: string): { toString(): string };\n get(id: { toString(): string }): { getLifecycleStatus(): Promise<RunLifecycleStatus> };\n };\n}\n\nconst MAX_QUEUE_INFLIGHT = 128;\n\nexport class QueueDO extends DurableObject {\n #now(): number {\n const clock = (this.env as QueueCellEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n #fetch(): typeof fetch {\n const impl = (this.env as QueueCellEnv)?.fetch;\n return typeof impl === 'function' ? impl : fetch;\n }\n\n #intVar(\n name: 'QUEUE_MAX_ATTEMPTS' | 'QUEUE_MAX_INFLIGHT' | 'QUEUE_DELIVERY_TIMEOUT_MS',\n fallback: number,\n ): number {\n const raw = (this.env as QueueCellEnv)?.[name];\n const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n }\n\n #maxInflight(): number {\n const configured = this.#intVar('QUEUE_MAX_INFLIGHT', DEFAULT_MAX_INFLIGHT);\n if (configured > MAX_QUEUE_INFLIGHT) {\n throw new Error(`QUEUE_MAX_INFLIGHT must be at most ${MAX_QUEUE_INFLIGHT}`);\n }\n return configured;\n }\n\n #deliveryTimeoutMs(): number {\n const configured = this.#intVar('QUEUE_DELIVERY_TIMEOUT_MS', DEFAULT_DELIVERY_TIMEOUT_MS);\n if (configured > MAX_QUEUE_DELIVERY_TIMEOUT_MS) {\n throw new Error(`QUEUE_DELIVERY_TIMEOUT_MS must be at most ${MAX_QUEUE_DELIVERY_TIMEOUT_MS}`);\n }\n return configured;\n }\n\n async #authoritativeRunExpired(runId: string): Promise<boolean> {\n const namespace = (this.env as QueueCellEnv)?.WORKFLOW_DB;\n if (!namespace) throw new Error('world-celld queue missing WORKFLOW_DB binding');\n const status = await namespace.get(namespace.idFromName(runId)).getLifecycleStatus();\n return status === 'expired';\n }\n\n async #withRunMutation<T>(\n runId: string,\n onExpired: (txn: DurableObjectTransaction) => Promise<T>,\n onAllowed: (txn: DurableObjectTransaction) => Promise<T>,\n ): Promise<T> {\n // A non-expired proof is intentionally not cached: a run may become\n // terminal and reach its retention boundary between any two requests.\n // Recheck the exact derivative marker in the queue transaction so cleanup\n // which raced the authority read still wins before the mutation commits.\n const expired = await this.#authoritativeRunExpired(runId);\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get<ExpiredRunFence>(expiredRunKey(runId))) || expired) {\n return await onExpired(txn);\n }\n return await onAllowed(txn);\n });\n }\n\n async enqueue(request: EnqueueRequest): Promise<EnqueueOutcome> {\n this.#maxInflight();\n this.#deliveryTimeoutMs();\n const storage = this.ctx.storage;\n const now = this.#now();\n\n const persist = async (txn: DurableObjectTransaction): Promise<EnqueueOutcome> => {\n // Pin the shard count from the first enqueue and reject drift loudly:\n // idempotencyKey -> cell affinity (and therefore dedup correctness)\n // depends on every producer agreeing on the shard count. The delivery\n // URL deliberately is NOT pinned — it travels per message.\n const pinned = await txn.get<{ queueShards: number; pinnedAt: number }>('cfg');\n if (!pinned) {\n await txn.put('cfg', { queueShards: request.config.queueShards, pinnedAt: now });\n } else if (pinned.queueShards !== request.config.queueShards) {\n return {\n ok: false,\n code: 'CONFIG_MISMATCH',\n message:\n `queue cell shard-count mismatch: pinned ${pinned.queueShards}, ` +\n `got ${request.config.queueShards} — changing queueShards requires draining the fleet`,\n };\n }\n\n // Dedup: while a message with this idempotencyKey is active, return the\n // original messageId (core re-enqueues pending steps on every replay and\n // relies on this).\n if (request.idempotencyKey) {\n const existing = await txn.get<string>(`key:${request.idempotencyKey}`);\n if (existing) {\n if (await txn.get(`msg:${existing}`)) {\n await this.#scheduleNextAlarm(txn, now);\n return { ok: true, messageId: existing, deduped: true };\n }\n // Stale claim (message gone without release) — steal it.\n await txn.delete(`key:${request.idempotencyKey}`);\n }\n await txn.put(`key:${request.idempotencyKey}`, request.messageId);\n }\n\n const row: MessageRow = {\n messageId: request.messageId,\n queueName: request.queueName,\n pathname: request.pathname,\n body: request.body,\n runId: request.runId,\n targetBaseUrl: request.config.targetBaseUrl,\n idempotencyKey: request.idempotencyKey,\n attempt: 0,\n enqueuedAt: now,\n };\n const dueAt = now + Math.max(0, request.delaySeconds ?? 0) * 1000;\n const scheduleKey = dueKey(dueAt, row.messageId);\n await txn.put(`msg:${row.messageId}`, row);\n await txn.put(scheduleKey, row.messageId);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#armAlarmAtMost(txn, dueAt, now);\n\n return { ok: true, messageId: row.messageId, deduped: false };\n };\n\n const outcome = request.runId\n ? await this.#withRunMutation<EnqueueOutcome>(\n request.runId,\n async (): Promise<EnqueueOutcome> => ({\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${request.runId}\" has expired`,\n }),\n persist,\n )\n : await storage.transaction(persist);\n\n return outcome;\n }\n\n async alarm(): Promise<void> {\n // celld#144: alarm handlers can overlap while awaiting. The storage-only\n // claim phase runs under the input gate; a failure is carried out and\n // rethrown outside so a failed critical section cannot reset the cell.\n let claimed: InflightClaim[] = [];\n let failure: unknown = null;\n const attempt = async () => {\n try {\n claimed = await this.#claimPhase();\n } catch (error) {\n failure = error;\n }\n };\n if (typeof this.ctx.blockConcurrencyWhile === 'function') {\n await this.ctx.blockConcurrencyWhile(attempt);\n } else {\n await attempt();\n }\n if (failure !== null) {\n await this.ctx.storage.setAlarm(this.#now() + LIFECYCLE_COMPACTION_RETRY_MS);\n throw failure;\n }\n\n for (const claim of claimed) {\n this.ctx.waitUntil(this.#deliver(claim));\n }\n }\n\n /**\n * Storage-only: recover lost inflight claims, claim due messages up to the\n * inflight cap, and re-arm the alarm. Never throws for data conditions.\n */\n async #claimPhase(): Promise<InflightClaim[]> {\n const storage = this.ctx.storage;\n const now = this.#now();\n const maxInflight = this.#maxInflight();\n const claimed = await storage.transaction<InflightClaim[]>(async (txn) => {\n // 1. Compact a bounded page of acknowledged derivative expiry fences.\n // Queue operations always consult the authoritative RunDO tombstone, so\n // deleting the receipt cannot reopen the run.\n if (await this.#compactExpiredRunFences(txn, now)) {\n await txn.setAlarm(now + MIN_ALARM_DELAY_MS);\n return [];\n }\n\n // 2. Recover: an inflight entry past its deadline is a lost delivery\n // (node crash, deploy restart) — back to due for redelivery.\n const expiredPage = await txn.list<string>({\n prefix: INFLIGHT_DEADLINE_PREFIX,\n end: `${INFLIGHT_DEADLINE_PREFIX}${pad(now + 1)}`,\n limit: EXPIRED_INFLIGHT_BATCH + 1,\n });\n const expired = Array.from(expiredPage.entries()).slice(0, EXPIRED_INFLIGHT_BATCH);\n const expiredRows = await getMany<MessageRow>(\n txn,\n expired.map(([, messageId]) => `msg:${messageId}`),\n );\n await deleteMany(\n txn,\n expired.map(([key]) => key),\n );\n const recoveryWrites: Array<readonly [string, unknown]> = [];\n for (const [, messageId] of expired) {\n const row = expiredRows.get(`msg:${messageId}`);\n if (row) {\n const scheduleKey = dueKey(now, messageId);\n recoveryWrites.push([scheduleKey, messageId]);\n if (row.runId) {\n recoveryWrites.push([\n runReferenceKey(row.runId, row.messageId),\n {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n } satisfies QueueRunReference,\n ]);\n }\n }\n }\n await putMany(txn, recoveryWrites);\n if (expiredPage.size > EXPIRED_INFLIGHT_BATCH) {\n await txn.setAlarm(now + MIN_ALARM_DELAY_MS);\n return [];\n }\n\n // Only the configured concurrency cap matters here. Reading at most the\n // cap avoids replacing the expiry scan with an unbounded count scan.\n const activeInflight = await txn.list<string>({\n prefix: INFLIGHT_DEADLINE_PREFIX,\n limit: maxInflight,\n });\n const inflightCount = activeInflight.size;\n\n // 3. Claim due messages up to the cap.\n const rows: InflightClaim[] = [];\n if (inflightCount < maxInflight) {\n const due = await txn.list<string>({\n prefix: 'due:',\n end: `due:${pad(now + 1)}`,\n limit: maxInflight - inflightCount,\n });\n const timeoutMs = this.#deliveryTimeoutMs();\n const dueRows = await getMany<MessageRow>(\n txn,\n Array.from(due.values(), (messageId) => `msg:${messageId}`),\n );\n await deleteMany(txn, Array.from(due.keys()));\n const claimWrites: Array<readonly [string, unknown]> = [];\n for (const [, messageId] of due) {\n const row = dueRows.get(`msg:${messageId}`);\n if (!row) continue; // orphaned schedule entry\n const claimKey = inflightKey(now + timeoutMs + QUEUE_INFLIGHT_GRACE_MS, messageId);\n claimWrites.push([claimKey, messageId]);\n if (row.runId) {\n claimWrites.push([\n runReferenceKey(row.runId, row.messageId),\n {\n messageId: row.messageId,\n inflightKey: claimKey,\n idempotencyKey: row.idempotencyKey,\n } satisfies QueueRunReference,\n ]);\n }\n rows.push({ row, inflightKey: claimKey });\n }\n await putMany(txn, claimWrites);\n }\n await this.#scheduleNextAlarm(txn, now);\n return rows;\n });\n\n return claimed;\n }\n\n async #deliver({ row, inflightKey: claimKey }: InflightClaim): Promise<void> {\n const storage = this.ctx.storage;\n const timeoutMs = this.#deliveryTimeoutMs();\n const callbackSecret = (this.env as QueueCellEnv)?.WORKFLOW_CALLBACK_SECRET;\n const url = `${row.targetBaseUrl.replace(/\\/$/, '')}/.well-known/workflow/v1/${row.pathname}`;\n\n // Claiming is storage-only so it can stay bounded and atomic. Resolve the\n // authoritative lifecycle immediately before external I/O; if retention\n // expired after the claim, consume the claim without publishing a hook.\n if (row.runId && (await this.#authoritativeRunExpired(row.runId))) {\n await storage.transaction((txn) => this.#dropExpiredMessage(txn, row, claimKey, this.#now()));\n return;\n }\n\n let response: Response | null = null;\n let transportError: unknown = null;\n try {\n response = await this.#fetch()(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-vqs-queue-name': row.queueName,\n 'x-vqs-message-id': row.messageId,\n 'x-vqs-message-attempt': String(row.attempt + 1),\n ...(callbackSecret ? { 'x-workflow-callback-secret': callbackSecret } : {}),\n },\n body: row.body,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n transportError = error;\n }\n\n const now = this.#now();\n\n if (response?.ok) {\n // Ack: the message is done; release the dedup claim.\n await cancelUnusedResponseBody(response);\n await this.#ack(row, claimKey);\n } else if (response && response.status === 503) {\n // {timeoutSeconds} means \"redeliver later, same message\": the attempt\n // count does not advance and the dedup key stays claimed.\n let timeoutSeconds: number | undefined;\n try {\n const parsed = (await response.json()) as { timeoutSeconds?: number };\n timeoutSeconds = parsed?.timeoutSeconds;\n } catch {\n timeoutSeconds = undefined;\n }\n if (typeof timeoutSeconds === 'number') {\n const reschedule = async (txn: DurableObjectTransaction) => {\n // Deleting the exact deadline key doubles as a lease-token check. A\n // late response from an expired claim must not mutate a newer claim.\n if (!(await txn.delete(claimKey))) return;\n const scheduleKey = dueKey(now + timeoutSeconds * 1000, row.messageId);\n await txn.put(scheduleKey, row.messageId);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#scheduleNextAlarm(txn, now);\n };\n if (row.runId) {\n await this.#withRunMutation(\n row.runId,\n (txn) => this.#dropExpiredMessage(txn, row, claimKey, now),\n reschedule,\n );\n } else {\n await storage.transaction(reschedule);\n }\n } else {\n await this.#retry(row, claimKey, 'HTTP 503');\n }\n } else if (response && PERMANENT_STATUSES.has(response.status)) {\n // Permanent: drop without burning retries; the handler already\n // classified this as unreplayable.\n await cancelUnusedResponseBody(response);\n await this.#ack(row, claimKey);\n } else {\n const reason = response\n ? `HTTP ${response.status}`\n : `transport error: ${String(transportError)}`;\n if (response) await cancelUnusedResponseBody(response);\n await this.#retry(row, claimKey, reason);\n }\n }\n\n async #ack(row: MessageRow, claimKey: string): Promise<void> {\n const storage = this.ctx.storage;\n await storage.transaction(async (txn) => {\n if (!(await txn.delete(claimKey))) return;\n await txn.delete(`msg:${row.messageId}`);\n if (row.idempotencyKey) {\n const holder = await txn.get<string>(`key:${row.idempotencyKey}`);\n if (holder === row.messageId) {\n await txn.delete(`key:${row.idempotencyKey}`);\n }\n }\n if (row.runId) {\n await txn.delete(runReferenceKey(row.runId, row.messageId));\n }\n await this.#scheduleNextAlarm(txn, this.#now());\n });\n }\n\n async #dropExpiredMessage(\n txn: DurableObjectTransaction,\n row: MessageRow,\n claimKey: string,\n now: number,\n ): Promise<void> {\n if (!(await txn.delete(claimKey))) return;\n await txn.delete(`msg:${row.messageId}`);\n if (row.runId) await txn.delete(runReferenceKey(row.runId, row.messageId));\n if (row.idempotencyKey) {\n const dedupKey = `key:${row.idempotencyKey}`;\n if ((await txn.get<string>(dedupKey)) === row.messageId) await txn.delete(dedupKey);\n }\n await this.#scheduleNextAlarm(txn, now);\n }\n\n async #retry(row: MessageRow, claimKey: string, reason: string): Promise<void> {\n const storage = this.ctx.storage;\n const now = this.#now();\n const maxAttempts = this.#intVar('QUEUE_MAX_ATTEMPTS', DEFAULT_MAX_ATTEMPTS);\n const attempt = row.attempt + 1;\n\n const persistRetry = async (txn: DurableObjectTransaction) => {\n if (!(await txn.delete(claimKey))) return;\n\n if (attempt >= maxAttempts) {\n const dead: DeadLetterRow = { ...row, attempt, lastError: reason, failedAt: now };\n const deadKey = `dlq:${pad(now)}:${row.messageId}`;\n await txn.put(deadKey, dead);\n await txn.delete(`msg:${row.messageId}`);\n if (row.idempotencyKey) {\n const holder = await txn.get<string>(`key:${row.idempotencyKey}`);\n if (holder === row.messageId) {\n await txn.delete(`key:${row.idempotencyKey}`);\n }\n }\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dlqKey: deadKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#scheduleNextAlarm(txn, now);\n return;\n }\n\n const updated: MessageRow = { ...row, attempt, lastError: reason };\n const scheduleKey = dueKey(now + backoffSeconds(attempt) * 1000, row.messageId);\n await txn.put(`msg:${row.messageId}`, updated);\n await txn.put(scheduleKey, row.messageId);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#scheduleNextAlarm(txn, now);\n };\n if (row.runId) {\n await this.#withRunMutation(\n row.runId,\n (txn) => this.#dropExpiredMessage(txn, row, claimKey, now),\n persistRetry,\n );\n } else {\n await storage.transaction(persistRetry);\n }\n }\n\n /** Return true when another due compaction page must run immediately. */\n async #compactExpiredRunFences(txn: DurableObjectTransaction, now: number): Promise<boolean> {\n const due = await txn.list<ExpiredRunGc>({\n prefix: EXPIRED_RUN_GC_PREFIX,\n end: `${EXPIRED_RUN_GC_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n if (page.length === 0) return false;\n\n const markerKeys = page.map(([, item]) => expiredRunKey(item.runId));\n const markers = await getMany<ExpiredRunFence>(txn, markerKeys);\n const deletes: string[] = [];\n for (let index = 0; index < page.length; index++) {\n const [gcKey, item] = page[index];\n const markerKey = markerKeys[index];\n const marker = markers.get(markerKey);\n deletes.push(gcKey);\n if (marker?.compactAt !== item.compactAt) continue;\n deletes.push(markerKey);\n }\n await deleteMany(txn, deletes);\n return due.size > LIFECYCLE_COMPACTION_BATCH;\n }\n\n /** Arm the alarm no later than `atMs` (durable backoff never throws). */\n async #armAlarmAtMost(storage: AlarmStorage, atMs: number, now: number): Promise<void> {\n const current = await storage.getAlarm();\n if (current !== null && current <= now) {\n await storage.setAlarm(now + MIN_ALARM_DELAY_MS);\n return;\n }\n\n const target = atMs <= now ? now + MIN_ALARM_DELAY_MS : atMs;\n if (current === null || target < current) {\n await storage.setAlarm(target);\n }\n }\n\n /** Recompute the alarm from the earliest due entry / inflight deadline. */\n async #rearm(): Promise<void> {\n await this.#scheduleNextAlarm(this.ctx.storage, this.#now());\n }\n\n /** Keep the alarm index consistent with message state in the same transaction. */\n async #scheduleNextAlarm(storage: AlarmStorage, now: number): Promise<void> {\n let next: number | null = null;\n\n const due = await storage.list<string>({ prefix: 'due:', limit: 1 });\n for (const key of due.keys()) {\n next = Number.parseInt(key.slice('due:'.length, 'due:'.length + 13), 10);\n }\n\n const inflight = await storage.list<string>({ prefix: INFLIGHT_DEADLINE_PREFIX, limit: 1 });\n for (const key of inflight.keys()) {\n const deadline = deadlineFromInflightKey(key);\n if (next === null || deadline < next) next = deadline;\n }\n\n const expiryGc = await storage.list<ExpiredRunGc>({ prefix: EXPIRED_RUN_GC_PREFIX, limit: 1 });\n for (const item of expiryGc.values()) {\n if (next === null || item.compactAt < next) next = item.compactAt;\n }\n\n if (next !== null) {\n await storage.setAlarm(next <= now ? now + MIN_ALARM_DELAY_MS : next);\n } else {\n await storage.deleteAlarm();\n }\n }\n\n // ---- Admin RPC (exposed through the router's queue binding) ----\n\n async stats(): Promise<QueueStats> {\n const storage = this.ctx.storage;\n const [due, inflight, dlq, alarmAt] = await Promise.all([\n storage.list({ prefix: 'due:' }),\n storage.list({ prefix: INFLIGHT_DEADLINE_PREFIX }),\n storage.list({ prefix: 'dlq:' }),\n storage.getAlarm(),\n ]);\n return {\n pending: due.size,\n inflight: inflight.size,\n deadLetters: dlq.size,\n alarmAt,\n };\n }\n\n async listDeadLetters(params?: {\n limit?: number;\n cursor?: string;\n }): Promise<{ data: DeadLetterRow[]; cursor: string | null; hasMore: boolean }> {\n const limit = params?.limit ?? 100;\n const entries = await this.ctx.storage.list<DeadLetterRow>({\n prefix: 'dlq:',\n startAfter: params?.cursor,\n limit: limit + 1,\n });\n const keys = Array.from(entries.keys());\n const page = keys.slice(0, limit);\n const hasMore = keys.length > limit;\n return {\n data: page.map((k) => entries.get(k) as DeadLetterRow),\n cursor: hasMore ? page.at(-1)! : null,\n hasMore,\n };\n }\n\n /** Move a dead letter back to the live queue (attempt count reset). */\n async redriveDeadLetter(messageId: string): Promise<{ ok: boolean }> {\n const storage = this.ctx.storage;\n const now = this.#now();\n const found = Array.from(await storage.list<DeadLetterRow>({ prefix: 'dlq:' })).find(\n ([, dead]) => dead.messageId === messageId,\n );\n if (!found) return { ok: false };\n const [deadKey, candidate] = found;\n\n const redrive = async (txn: DurableObjectTransaction): Promise<{ ok: boolean }> => {\n const dead = await txn.get<DeadLetterRow>(deadKey);\n if (!dead || dead.messageId !== messageId) return { ok: false };\n const { failedAt: _failedAt, ...rest } = dead;\n const row: MessageRow = { ...rest, attempt: 0, lastError: undefined };\n\n if (row.idempotencyKey) {\n const dedupKey = `key:${row.idempotencyKey}`;\n const holder = await txn.get<string>(dedupKey);\n if (holder && holder !== row.messageId && (await txn.get(`msg:${holder}`))) {\n return { ok: false };\n }\n if (holder && holder !== row.messageId) await txn.delete(dedupKey);\n await txn.put(dedupKey, row.messageId);\n }\n\n await txn.put(`msg:${row.messageId}`, row);\n const scheduleKey = dueKey(now, row.messageId);\n await txn.put(scheduleKey, row.messageId);\n await txn.delete(deadKey);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#armAlarmAtMost(txn, now, now);\n return { ok: true };\n };\n\n const rejectExpired = async (txn: DurableObjectTransaction): Promise<{ ok: boolean }> => {\n const current = await txn.get<DeadLetterRow>(deadKey);\n if (current?.messageId === messageId) {\n await txn.delete([deadKey, runReferenceKey(candidate.runId!, messageId)]);\n }\n return { ok: false };\n };\n\n const outcome = candidate.runId\n ? await this.#withRunMutation(candidate.runId, rejectExpired, redrive)\n : await storage.transaction(redrive);\n\n return outcome;\n }\n\n async purgeDeadLetters(): Promise<{ purged: number; hasMore: boolean }> {\n const storage = this.ctx.storage;\n return await storage.transaction(async (txn) => {\n const entries = await txn.list<DeadLetterRow>({\n prefix: 'dlq:',\n limit: PURGE_DEAD_LETTER_BATCH + 1,\n });\n const page = Array.from(entries).slice(0, PURGE_DEAD_LETTER_BATCH);\n const keys = page.flatMap(([key, dead]) => [\n key,\n ...(dead.runId ? [runReferenceKey(dead.runId, dead.messageId)] : []),\n ]);\n await deleteMany(txn, keys);\n return { purged: page.length, hasMore: entries.size > PURGE_DEAD_LETTER_BATCH };\n });\n }\n\n /**\n * Recovery hatch for celld's six-failure alarm abandonment: derive the due\n * time again and arm it.\n */\n async rearmAlarm(): Promise<{ alarmAt: number | null }> {\n await this.#rearm();\n return { alarmAt: await this.ctx.storage.getAlarm() };\n }\n\n /** Fence a run and purge every live, inflight, and dead-letter message it owns. */\n async expireRun(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireQueueRunResult> {\n const storage = this.ctx.storage;\n const limit = boundedLimit(\n options?.limit,\n EXPIRE_RUN_REFERENCE_BATCH,\n EXPIRE_RUN_REFERENCE_BATCH,\n );\n return await storage.transaction(async (txn) => {\n const existing = await txn.get<ExpiredRunFence>(expiredRunKey(runId));\n const references = await txn.list<QueueRunReference>({\n prefix: `run:${runId}:`,\n limit: limit + 1,\n });\n const page = Array.from(references).slice(0, limit);\n const dedupKeys = page.flatMap(([, reference]) =>\n reference.idempotencyKey ? [`key:${reference.idempotencyKey}`] : [],\n );\n const dedupHolders = await getMany<string>(txn, dedupKeys);\n const keys: string[] = [];\n let count = existing?.deleted ?? 0;\n for (const [key, reference] of page) {\n keys.push(`msg:${reference.messageId}`, key);\n if (reference.inflightKey) keys.push(reference.inflightKey);\n if (reference.dueKey) keys.push(reference.dueKey);\n if (reference.dlqKey) keys.push(reference.dlqKey);\n if (reference.idempotencyKey) {\n const dedupKey = `key:${reference.idempotencyKey}`;\n if (dedupHolders.get(dedupKey) === reference.messageId) keys.push(dedupKey);\n }\n count++;\n }\n await deleteMany(txn, keys);\n const done = references.size <= limit;\n const markerExpiredAt = existing?.expiredAt ?? expiredAt;\n await txn.put<ExpiredRunFence>(expiredRunKey(runId), {\n expiredAt: markerExpiredAt,\n deleted: count,\n // Keep the cumulative receipt until the cleanup coordinator has first\n // persisted it and then explicitly acknowledged it.\n compactAt: existing?.compactAt ?? null,\n });\n await this.#scheduleNextAlarm(txn, this.#now());\n return done\n ? { deleted: count, done: true, receipt: { expiredAt: markerExpiredAt, deleted: count } }\n : { deleted: count, done: false };\n });\n }\n\n /** Acknowledge a final cleanup receipt before making its marker compactable. */\n async acknowledgeExpireRun(\n runId: string,\n receipt: QueueExpiryReceipt,\n ): Promise<AcknowledgeQueueExpiryResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const key = expiredRunKey(runId);\n const marker = await txn.get<ExpiredRunFence>(key);\n // A response may be lost after acknowledgement and its grace alarm may\n // compact the marker before the coordinator retries. Absence is therefore\n // the idempotent success state.\n if (!marker) return { acknowledged: true };\n if (marker.expiredAt !== receipt.expiredAt || marker.deleted !== receipt.deleted) {\n return { acknowledged: false };\n }\n if (marker.compactAt === null) {\n const compactAt = this.#now() + QUEUE_FENCE_GRACE_MS;\n await txn.put<ExpiredRunFence>(key, { ...marker, compactAt });\n await txn.put<ExpiredRunGc>(expiredRunGcKey(runId, compactAt), { runId, compactAt });\n }\n await this.#scheduleNextAlarm(txn, this.#now());\n return { acknowledged: true };\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:';\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\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 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 if (keys.length !== 2) throw new Error('Run catalog commit requires exactly two keys');\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.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 await txn.put(Object.fromEntries(keys.map((key) => [key, serializedMetadata])));\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 prefix: options.prefix ?? '',\n ...(options.reverse\n ? { reverse: true, end: options.cursor }\n : { startAfter: options.cursor }),\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 async expireRun(\n runId: string,\n keys: string[],\n expiredAt: number,\n ): Promise<ExpireRunIndexesResult> {\n if (keys.length !== 2) throw new Error('Run catalog expiry requires exactly two keys');\n return await this.ctx.storage.transaction(async (txn) => {\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 return { deleted: await txn.delete(keys) };\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; one delete accepts at most 128 keys. */\nconst DEFAULT_EXPIRE_CHUNK_LIMIT = 64;\nconst MAX_EXPIRE_CHUNK_LIMIT = 64;\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;\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: StreamMeta): StreamMeta {\n if (\n !Number.isSafeInteger(meta.count) ||\n meta.count < 0 ||\n meta.count > 0x7fffffff ||\n !['open', 'closed', 'errored', 'expired'].includes(meta.state)\n ) {\n throw new Error('Invalid persisted stream metadata');\n }\n if (meta.state === 'errored' && !meta.error) {\n throw new Error('Invalid persisted stream error metadata');\n }\n return meta;\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 (!/^\\d{12}$/.test(suffix) || !Number.isSafeInteger(index) || index < 0) {\n throw new Error(`Invalid persisted stream chunk size 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 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 ? validateMeta(meta) : emptyMeta();\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.ctx.storage.get<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.ctx.storage.get<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 ? validateMeta(stored) : emptyMeta();\n this.assertWritable(meta, runId);\n const startIndex = meta.count;\n if (startIndex + chunks.length > 0x7fffffff) {\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: Record<string, StreamMeta | Uint8Array | number> = { [META_KEY]: nextMeta };\n for (let offset = 0; offset < storedChunks.length; offset++) {\n const index = startIndex + offset;\n entries[chunkKey(index)] = storedChunks[offset];\n entries[chunkSizeKey(index)] = storedChunks[offset].byteLength;\n }\n await txn.put(entries);\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 ? validateMeta(stored) : emptyMeta();\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 ? validateMeta(stored) : emptyMeta();\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 ? validateMeta(stored) : emptyMeta();\n this.assertOwner(meta, runId);\n const firstFence = meta.state !== 'expired';\n if (meta.state === 'expired' && meta.payloadDeleted) {\n return {\n meta,\n result: { deleted: false, chunks: 0, bytes: 0, done: true },\n };\n }\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 const keys = page.flatMap(({ index }) => [chunkKey(index), chunkSizeKey(index)]);\n if (keys.length > 0) await txn.delete(keys);\n const done = candidates.size === page.length;\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","/**\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 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\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}\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 (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","import type { TerminalWorkflowRunStatus, WorkflowRun } 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 completedAt: Date;\n terminalStatus: TerminalWorkflowRunStatus;\n dueAt: Date;\n queueShards: number;\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 deletedQueueMessages: number;\n}\n\nexport interface RunTombstone {\n version: 1;\n runId: string;\n terminalStatus: TerminalWorkflowRunStatus;\n completedAt: Date;\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 keys: 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 QueueExpiryReceipt {\n expiredAt: number;\n deleted: number;\n}\n\nexport type ExpireQueueRunResult = {\n /** Cumulative messages removed for this run in this queue shard. */\n deleted: number;\n} & (\n | { done: false }\n | {\n done: true;\n /** Durable receipt which the cleanup coordinator must acknowledge. */\n receipt: QueueExpiryReceipt;\n }\n);\n\nexport interface AcknowledgeQueueExpiryResult {\n acknowledged: boolean;\n}\n\nexport interface ScheduleCleanupRequest {\n retentionMs: number;\n queueShards: number;\n}\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 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 { 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 STEP_CREATED_KEY_PREFIX,\n STEP_KEY_PREFIX,\n WAIT_KEY_PREFIX,\n} from '../../apply-event.js';\nimport {\n type AcknowledgeQueueExpiryResult,\n CLEANUP_RECORD_KEY,\n type CleanupRecord,\n cleanupFromTombstone,\n cleanupTombstone,\n type ExpireQueueRunResult,\n type ExpireRunStreamsResult,\n type ExpireStreamResult,\n type FinalizeRunStreamsResult,\n expiredRead,\n globalRunIndexKey,\n HOOK_MARKER_PREFIX,\n type HookIndexReference,\n hookMarkerKey,\n type RunReadOutcome,\n type RunLifecycleStatus,\n type QueueExpiryReceipt,\n type RunTombstone,\n type ScheduleCleanupRequest,\n TERMINAL_CLEANUP_KEY,\n type TerminalCleanupRecord,\n TOMBSTONE_KEY,\n workflowRunIndexKey,\n} from '../../retention.js';\nimport { MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS } from '../../lifecycle.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 QueueCleanupStub {\n expireRun(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireQueueRunResult>;\n acknowledgeExpireRun(\n runId: string,\n receipt: QueueExpiryReceipt,\n ): Promise<AcknowledgeQueueExpiryResult>;\n}\n\ninterface WorkflowRunDOEnv {\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?: CellNamespace<QueueCleanupStub>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\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;\nconst STREAM_CHUNKS_PER_CLEANUP_PAGE = STORAGE_BATCH_SIZE;\nconst STREAM_BYTES_PER_CLEANUP_PAGE = 16 * 1024 * 1024;\nconst QUEUE_REFERENCES_PER_CLEANUP_PAGE = 64;\nconst CLEANUP_RETRY_MAX_MS = 60 * 60 * 1000;\nconst CLEANUP_PROGRESS_KEY = 'retention:progress';\ntype TerminalRun = Extract<WorkflowRun, { status: 'completed' | 'failed' | 'cancelled' }>;\n\ninterface CleanupProgress {\n queueShard: number;\n queueShardDeleted: number;\n pendingAck?: {\n queueShard: number;\n receipt: QueueExpiryReceipt;\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 claimedAt: number;\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>` are used purely as\n * queue-message dedup claims (see claimInflight/releaseInflight).\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 ): Promise<{ cleanup?: CleanupRecord; tombstone: RunTombstone | null }> {\n const values = await storage.get<RunTombstone | CleanupRecord>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n ]);\n return {\n cleanup: values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined,\n tombstone: this.tombstoneFrom(values, now),\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 return await this.ctx.storage.transaction(async (txn) => {\n const now = new Date(this.now());\n const retention = await this.retentionState(txn, now.getTime());\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 let eventSequence = (await txn.get<number>('event_sequence')) ?? 0;\n const outcome = await applyEvent(storeFrom(txn), {\n ...request,\n nextEventId: () => slotToEventId(++eventSequence),\n now,\n });\n if (!outcome.ok) return outcome;\n\n await txn.put('event_sequence', 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(terminalRun.completedAt.getTime() + retentionMs);\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup: CleanupRecord = {\n version: 1,\n runId: run.runId,\n workflowName: run.workflowName,\n createdAt: run.createdAt,\n completedAt: run.completedAt,\n terminalStatus: run.status,\n dueAt,\n queueShards: request.cleanup?.queueShards ?? 1,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueueMessages: 0,\n };\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 if (request.retentionMs <= 0) return this.getCleanupStatus();\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(terminalRun.completedAt.getTime() + request.retentionMs);\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup: CleanupRecord = {\n version: 1,\n runId: run.runId,\n workflowName: run.workflowName,\n createdAt: run.createdAt,\n completedAt: run.completedAt,\n terminalStatus: run.status,\n dueAt,\n queueShards: request.queueShards,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueueMessages: 0,\n };\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 async cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n if (!(await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY))) {\n await this.scheduleCleanup({ ...request, retentionMs: Math.max(1, request.retentionMs) });\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 terminalCleanup = await this.ctx.storage.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\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 const cleanup = await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY);\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') {\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 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 keys: [workflowRunIndexKey(cleanup), globalRunIndexKey(cleanup)],\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 queues = this.namespace<QueueCleanupStub>('WORKFLOW_QUEUE');\n const progress =\n (await this.ctx.storage.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n\n if (progress.pendingAck) {\n const { queueShard, receipt } = progress.pendingAck;\n const queue = queues.get(queues.idFromName(`q:${queueShard}`));\n const result = await queue.acknowledgeExpireRun(cleanup.runId, receipt);\n if (!result.acknowledged) {\n throw new Error(`queue shard ${queueShard} rejected expiry receipt for ${cleanup.runId}`);\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 const persisted = await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY);\n if (\n persisted?.pendingAck?.queueShard !== queueShard ||\n persisted.pendingAck.receipt.expiredAt !== receipt.expiredAt ||\n persisted.pendingAck.receipt.deleted !== receipt.deleted\n ) {\n return;\n }\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.put<CleanupProgress>(CLEANUP_PROGRESS_KEY, {\n queueShard: queueShard + 1,\n queueShardDeleted: 0,\n });\n await txn.setAlarm(this.now() + 1);\n });\n return;\n }\n\n if (progress.queueShard < cleanup.queueShards) {\n const requestedShard = progress.queueShard;\n const queue = queues.get(queues.idFromName(`q:${requestedShard}`));\n const result = await queue.expireRun(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: QUEUE_REFERENCES_PER_CLEANUP_PAGE,\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 const persisted =\n (await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n if (persisted.queueShard !== requestedShard || persisted.pendingAck) return;\n if (result.deleted < persisted.queueShardDeleted) {\n throw new Error(\n `queue shard ${requestedShard} regressed expiry receipt for ${cleanup.runId}`,\n );\n }\n const delta = result.deleted - persisted.queueShardDeleted;\n const next: CleanupProgress = result.done\n ? {\n queueShard: requestedShard,\n queueShardDeleted: result.deleted,\n pendingAck: { queueShard: requestedShard, receipt: result.receipt },\n }\n : { queueShard: requestedShard, queueShardDeleted: result.deleted };\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedQueueMessages: current.deletedQueueMessages + delta,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.put(CLEANUP_PROGRESS_KEY, next);\n await txn.setAlarm(this.now() + 1);\n });\n return;\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 const persisted =\n (await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n if (persisted.queueShard >= current.queueShards && !persisted.pendingAck) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n phase: 'payload',\n generation: current.generation + 1,\n });\n await txn.delete(CLEANUP_PROGRESS_KEY);\n await txn.setAlarm(this.now() + 1);\n }\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 claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<InflightClaim>('claim');\n const now = this.now();\n if (\n existing &&\n existing.messageId !== params.messageId &&\n now - existing.claimedAt < params.staleMs\n ) {\n return { claimed: false };\n }\n await txn.put<InflightClaim>('claim', { messageId: params.messageId, claimedAt: now });\n return { claimed: true };\n });\n }\n\n async releaseInflight(): Promise<void> {\n await this.ctx.storage.delete('claim');\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 */\nimport { createRouter, type WorkerEnv } from './router.js';\n\nexport { HookIdDO } from './durable-objects/HookIdDO.js';\nexport { HookTokenDO } from './durable-objects/HookTokenDO.js';\nexport { QueueDO } from './durable-objects/QueueDO.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\nexport default {\n async fetch(request: Request, env: WorkerEnv): Promise<Response> {\n return createRouter(env)(request);\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"worker.js","names":["sameOwner","MAX_RELEASE_BATCH","CLAIM_DEADLINE_PREFIX","pad","recordKey","claimKey","claimDeadlineKey","pad","STORAGE_BATCH_SIZE","pad","boundedLimit","getMany","deleteMany","#intVar","#authoritativeRunExpired","#withRunMutation","#maxInflight","#deliveryTimeoutMs","#now","#scheduleNextAlarm","#armAlarmAtMost","#claimPhase","#deliver","#compactExpiredRunFences","#dropExpiredMessage","#fetch","#ack","#retry","#rearm","STORAGE_BATCH_SIZE"],"sources":["../src/vendor/shared/serialization.ts","../src/codec.ts","../src/indexes.ts","../src/stream-protocol.ts","../src/worker/auth.ts","../src/worker/router.ts","../src/retention.ts","../src/worker/retention-sweep.ts","../src/vendor/shared/util.ts","../src/worker/durable-objects/hook-index-shared.ts","../src/lifecycle.ts","../src/worker/durable-objects/HookIdDO.ts","../src/worker/durable-objects/HookTokenDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/RunCatalogDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/apply-event.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"sourcesContent":["/** 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 over atob/btoa instead of\n * Buffer so this module is safe inside the celld worker bundle (workerd has\n * no Buffer global); atob/btoa are global in both workerd and Node >= 16.\n */\nexport function b64encode(bytes: Uint8Array): string {\n let bin = '';\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(bin);\n}\n\nexport function b64decode(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\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' && typeof obj.data === 'string') {\n return b64decode(obj.data);\n }\n // Legacy format: number array (backwards compat with NATS JetStream data)\n if (obj.__uint8array === true && Array.isArray(obj.data)) {\n return new Uint8Array(obj.data as number[]);\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","/**\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 goes through 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' && typeof obj.iso === 'string') {\n return new Date(obj.iso);\n }\n if (obj.__type === 'Uint8Array' && typeof obj.data === 'string') {\n return b64decode(obj.data);\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 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 keys: Array<{ name: string; value: 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, keys: 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 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\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 pages = await Promise.all(\n allRunCatalogShardNames().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) =>\n shardPage.keys.map((entry) => ({ entry, encodedName: encoder.encode(entry.name) })),\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.keys,\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/** Metadata plus payload and size-index entries remain below the 128-key platform limit. */\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;\nexport const MAX_STREAM_READ_CHUNKS = 32;\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\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 > MAX_STREAM_WRITE_CHUNKS) {\n throw protocolError(`batch exceeds ${MAX_STREAM_WRITE_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 (!Number.isSafeInteger(request.startIndex) || request.startIndex < 0) {\n throw protocolError('startIndex must be a non-negative safe integer');\n }\n if (\n !Number.isSafeInteger(request.maxChunks) ||\n request.maxChunks < 0 ||\n request.maxChunks > MAX_STREAM_READ_CHUNKS\n ) {\n throw protocolError(`maxChunks must be between 0 and ${MAX_STREAM_READ_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 > MAX_STREAM_WRITE_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 > MAX_STREAM_WRITE_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 (result.chunks.length > MAX_STREAM_READ_CHUNKS || chunkBytes > MAX_STREAM_READ_BYTES + 128) {\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 > MAX_STREAM_READ_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","/**\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 */\nasync 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 * 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 { rpcParse, rpcStringify } from '../codec.js';\nimport type { HookTokenOwner } from '../config.js';\nimport {\n createWorkflowIndex,\n type CellNamespaceLike,\n type HookReservation,\n type HookIdShardStub,\n type HookTokenShardStub,\n type IndexListOptions,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport type { ExpireRunIndexesRequest, ReleaseHookIndexesRequest } from '../retention.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n MAX_STREAM_READ_CHUNKS,\n STREAM_BATCH_CONTENT_TYPE,\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';\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\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: DONamespaceLike;\n WORLD_SECRET?: string;\n WORKFLOW_RETENTION_MS?: string | number;\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n WORKFLOW_RETENTION_QUEUE_SHARDS?: 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\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 queue: {\n env: 'WORKFLOW_QUEUE',\n methods: new Set([\n 'enqueue',\n 'stats',\n 'listDeadLetters',\n 'redriveDeadLetter',\n 'purgeDeadLetters',\n 'rearmAlarm',\n 'expireRun',\n 'acknowledgeExpireRun',\n ]),\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 + 1024;\n\nfunction errorResponse(status: number, name: string, message: string): Response {\n return Response.json({ error: { name, message } }, { status });\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\nfunction parseBoundedInteger(url: URL, name: string, minimum: number, maximum: number): number {\n const raw = url.searchParams.get(name);\n const value = raw === null ? Number.NaN : Number(raw);\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: { 'content-type': STREAM_BATCH_CONTENT_TYPE },\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 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] === 'index' && parts.length === 4) {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n const contentLength = Number(request.headers.get('content-length') ?? '0');\n if (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 try {\n const index = workflowIndex(env);\n let result: unknown;\n const operation = `${parts[2]}.${parts[3]}`;\n if (operation === 'runs.list') {\n result = await index.listRuns(args[0] as IndexListOptions | undefined);\n } else if (operation === 'runs.commit') {\n result = await index.commitRun(\n args[0] as WorkflowRun,\n args[1] as string,\n args[2] as number,\n );\n } else if (operation === 'runs.expire') {\n result = await index.expireRun(args[0] as ExpireRunIndexesRequest);\n } else if (operation === 'hooks.reserve') {\n result = await index.reserveHook(args[0] as string, args[1] as HookTokenOwner);\n } else if (operation === 'hooks.finalize') {\n result = await index.finalizeHookIndexes(\n args[0] as string,\n args[1] as string,\n args[2] as string,\n args[3] as HookTokenOwner,\n args[4] as HookReservation | undefined,\n );\n } else if (operation === 'hooks.release-reservation') {\n result = await index.releaseHookReservation(\n args[0] as string,\n args[1] as HookTokenOwner,\n args[2] as HookReservation,\n );\n } else if (operation === 'hooks.release') {\n result = await index.releaseHookIndexes(args[0] as ReleaseHookIndexesRequest);\n } else {\n return errorResponse(404, 'NotFound', `unknown index operation: ${operation}`);\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 namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const name = decodeURIComponent(parts[2]);\n const runId = url.searchParams.get('runId');\n if (!runId) return errorResponse(400, 'BadRequest', 'runId is required');\n const stub = namespace.get(namespace.idFromName(name)) as {\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n };\n\n try {\n if (request.method === 'POST') {\n if (!request.headers.get('content-type')?.startsWith(STREAM_BATCH_CONTENT_TYPE)) {\n return errorResponse(415, 'UnsupportedMediaType', STREAM_BATCH_CONTENT_TYPE);\n }\n const contentLength = Number(request.headers.get('content-length') ?? '0');\n if (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 result = await stub.writeChunks(runId, decodeStreamWriteBatch(body));\n return streamResponse(encodeStreamWriteResult(result));\n }\n\n if (request.method === 'GET') {\n const result = await stub.readChunks(\n {\n runId,\n startIndex: parseBoundedInteger(url, 'startIndex', 0, 0x7fffffff),\n maxChunks: parseBoundedInteger(url, 'maxChunks', 0, MAX_STREAM_READ_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 },\n request.signal,\n );\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 { status: err?.name === 'StreamProtocolError' ? 400 : 500 },\n );\n }\n }\n\n if (parts[1] !== 'rpc') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (request.method !== 'POST' || parts.length !== 5) {\n return errorResponse(404, 'NotFound', 'expected POST /v1/rpc/{binding}/{name}/{method}');\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 const contentLength = Number(request.headers.get('content-length') ?? '0');\n if (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 const name = decodeURIComponent(encodedName);\n const namespace = env[binding.env] as DONamespaceLike | undefined;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${binding.env}`);\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 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 queueShards: number;\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 deletedQueueMessages: 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 keys: 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 QueueExpiryReceipt {\n expiredAt: number;\n deleted: number;\n}\n\nexport type ExpireQueueRunResult = {\n /** Cumulative messages removed for this run in this queue shard. */\n deleted: number;\n} & (\n | { done: false }\n | {\n done: true;\n /** Durable receipt which the cleanup coordinator must acknowledge. */\n receipt: QueueExpiryReceipt;\n }\n);\n\nexport interface AcknowledgeQueueExpiryResult {\n acknowledged: boolean;\n}\n\nexport interface ScheduleCleanupRequest {\n retentionMs: number;\n queueShards: 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 runCatalogShardName,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n sortableTimestamp,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n} from '../retention.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 /** Queue-shard fallback for runs created before placement was persisted. */\n WORKFLOW_RETENTION_QUEUE_SHARDS?: 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}\n\nfunction integerSetting(\n name: string,\n raw: string | number | undefined,\n fallback: number,\n minimum: number,\n maximum = Number.MAX_SAFE_INTEGER,\n): number {\n const value = raw === undefined || raw === '' ? fallback : Number(raw);\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n throw new Error(`world-celld: ${name} must be an integer between ${minimum} and ${maximum}`);\n }\n return value;\n}\n\nfunction runIdFromCatalogValue(value: string): string {\n const parsed = JSON.parse(value) as { runId?: unknown };\n if (typeof parsed.runId !== 'string' || parsed.runId.length === 0) {\n throw new Error('world-celld: run catalog entry has no runId');\n }\n return parsed.runId;\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 = integerSetting('WORKFLOW_RETENTION_MS', env.WORKFLOW_RETENTION_MS, 0, 0);\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 };\n }\n const batchSize = integerSetting(\n '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 queueShards = integerSetting(\n 'WORKFLOW_RETENTION_QUEUE_SHARDS',\n env.WORKFLOW_RETENTION_QUEUE_SHARDS,\n 1,\n 1,\n );\n const cutoff = scheduledTime - retentionMs;\n const index = createWorkflowIndex({\n runCatalog: env.WORKFLOW_RUN_CATALOG,\n hookTokens: env.WORKFLOW_HOOK_TOKENS,\n hookIds: 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 };\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 = runIdFromCatalogValue(entry.value);\n const run = env.WORKFLOW_DB.get(env.WORKFLOW_DB.idFromName(runId));\n const outcome = await run.enforceRetention({ retentionMs, queueShards, scheduledTime });\n if (outcome.state === 'missing' || outcome.state === 'not-due') {\n const catalog = env.WORKFLOW_RUN_CATALOG.get(\n env.WORKFLOW_RUN_CATALOG.idFromName(runCatalogShardName(runId)),\n );\n await catalog.deleteStaleGlobalRun(runId, entry.name, entry.value);\n }\n return outcome;\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 }\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","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","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","/**\n * Hard protocol bounds used by lifecycle leases and derivative-fence cleanup.\n *\n * These are not retention TTLs. They bound how long a request which was\n * admitted before expiry may still mutate a derivative Durable Object:\n *\n * - fleet calls have at most three 5-minute attempts plus bounded retry delay;\n * - one queue delivery owns its lease for at most 5 minutes plus 30 seconds;\n * - hook admission spans reserve retries, one authoritative apply, and\n * finalize retries before the exact claim must be reacquired.\n */\nexport const MAX_FLEET_RPC_TIMEOUT_MS = 5 * 60 * 1000;\nexport const FLEET_IDEMPOTENT_ATTEMPTS = 3;\nexport const FLEET_RETRY_BACKOFF_MAX_MS = 900;\n\nexport const MAX_IDEMPOTENT_RPC_LIFETIME_MS =\n FLEET_IDEMPOTENT_ATTEMPTS * MAX_FLEET_RPC_TIMEOUT_MS + FLEET_RETRY_BACKOFF_MAX_MS;\nexport const MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS =\n MAX_FLEET_RPC_TIMEOUT_MS + MAX_IDEMPOTENT_RPC_LIFETIME_MS;\n\nexport const MAX_QUEUE_DELIVERY_TIMEOUT_MS = 5 * 60 * 1000;\nexport const QUEUE_INFLIGHT_GRACE_MS = 30 * 1000;\nexport const MAX_QUEUE_INFLIGHT_LEASE_MS = MAX_QUEUE_DELIVERY_TIMEOUT_MS + QUEUE_INFLIGHT_GRACE_MS;\n\nexport const CATALOG_FENCE_GRACE_MS = MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS;\nexport const QUEUE_FENCE_GRACE_MS = Math.max(MAX_FLEET_RPC_TIMEOUT_MS, MAX_QUEUE_INFLIGHT_LEASE_MS);\n\nexport const HOOK_CLAIM_LEASE_MS =\n (FLEET_IDEMPOTENT_ATTEMPTS * 2 + 1) * MAX_FLEET_RPC_TIMEOUT_MS + FLEET_RETRY_BACKOFF_MAX_MS * 2;\n\nexport const LIFECYCLE_COMPACTION_BATCH = 128;\nexport const LIFECYCLE_COMPACTION_RETRY_MS = 1000;\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 { DurableObject } from '../do-base.js';\nimport type { EnqueueOutcome, EnqueueRequest } from '../../queue.js';\nimport type {\n AcknowledgeQueueExpiryResult,\n ExpireQueueRunResult,\n QueueExpiryReceipt,\n} from '../../retention.js';\nimport type { RunLifecycleStatus } from '../../retention.js';\nimport {\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n QUEUE_FENCE_GRACE_MS,\n QUEUE_INFLIGHT_GRACE_MS,\n} from '../../lifecycle.js';\n\n/**\n * Queue cell: the celld replacement for Cloudflare Queues.\n *\n * One cell (`q:<shard>`) owns the full lifecycle of its messages: durable\n * scheduling via the cell alarm, delivery via outbound fetch (the same x-vqs\n * dialect as the in-process test pump), retries with capped exponential\n * backoff, idempotencyKey dedup, and a dead-letter table.\n *\n * Storage layout (KV-style, ordered scans via zero-padded epoch-ms keys):\n * cfg pinned QueueCellConfig (first-enqueue wins)\n * msg:<messageId> MessageRow\n * due:<paddedMs>:<messageId> schedule index -> messageId\n * inflight-deadline:<paddedMs>:<messageId>\n * ordered crash-recovery index -> messageId\n * key:<idempotencyKey> active dedup claim -> messageId\n * dlq:<paddedMs>:<messageId> DeadLetterRow\n * run:<runId>:<messageId> QueueRunReference for retention cleanup\n * expired-run:<runId> cumulative cleanup receipt; compactable only\n * after RunDO acknowledgement\n * expired-run-gc:<paddedMs>:<runId>\n * ordered compaction deadline -> runId\n *\n * celld gotchas designed around:\n * - celld#144 (alarm handlers can overlap): the storage-only claim phase runs\n * inside blockConcurrencyWhile; slow delivery I/O runs outside the gate via\n * waitUntil.\n * - six-failure alarm abandonment: the alarm handler never throws for data\n * conditions — backoff reschedules the alarm instead. rearmAlarm() is the\n * recovery hatch, and every enqueue also re-arms.\n * - deploys restart the fleet: in-flight deliveries die with the isolate; the\n * inflight-deadline sweep on the next alarm redelivers (at-least-once).\n */\n\nexport interface MessageRow {\n messageId: string;\n queueName: string;\n pathname: 'flow' | 'step';\n /** Pre-encoded tagged-JSON payload — forwarded byte-identical. */\n body: string;\n runId?: string;\n /**\n * Delivery target captured at enqueue time. Carried per message (not\n * pinned on the cell) so an app redeploy at a new URL never bricks the\n * queue: old messages deliver (or dead-letter) against their original\n * target, new messages against the new one.\n */\n targetBaseUrl: string;\n idempotencyKey?: string;\n /** Completed delivery attempts. */\n attempt: number;\n enqueuedAt: number;\n lastError?: string;\n}\n\nexport interface DeadLetterRow extends MessageRow {\n failedAt: number;\n}\n\nexport interface QueueStats {\n pending: number;\n inflight: number;\n deadLetters: number;\n alarmAt: number | null;\n}\n\ninterface QueueRunReference {\n messageId: string;\n dueKey?: string;\n inflightKey?: string;\n dlqKey?: string;\n idempotencyKey?: string;\n}\n\ninterface InflightClaim {\n row: MessageRow;\n /** The exact index key is also the lease token for this delivery attempt. */\n inflightKey: string;\n}\n\ninterface ExpiredRunFence {\n expiredAt: number;\n deleted: number;\n compactAt: number | null;\n}\n\ninterface ExpiredRunGc {\n runId: string;\n compactAt: number;\n}\n\nconst PERMANENT_STATUSES = new Set([404, 409, 410, 422]);\n\nconst DEFAULT_MAX_ATTEMPTS = 5;\nconst DEFAULT_MAX_INFLIGHT = 5;\nconst DEFAULT_DELIVERY_TIMEOUT_MS = 300_000;\n/** Move overdue alarms to a new timestamp so celld observes a fresh edge. */\nconst MIN_ALARM_DELAY_MS = 1;\n/** Bound expiry recovery so one alarm cannot monopolize the cell. */\nconst EXPIRED_INFLIGHT_BATCH = 128;\nconst STORAGE_BATCH_SIZE = 128;\nconst EXPIRE_RUN_REFERENCE_BATCH = 64;\nconst PURGE_DEAD_LETTER_BATCH = 128;\n\nconst INFLIGHT_DEADLINE_PREFIX = 'inflight-deadline:';\nconst EXPIRED_RUN_GC_PREFIX = 'expired-run-gc:';\n\ntype AlarmStorage = Pick<DurableObjectStorage, 'list' | 'getAlarm' | 'setAlarm' | 'deleteAlarm'>;\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction dueKey(atMs: number, messageId: string): string {\n return `due:${pad(atMs)}:${messageId}`;\n}\n\nfunction inflightKey(deadlineMs: number, messageId: string): string {\n return `${INFLIGHT_DEADLINE_PREFIX}${pad(deadlineMs)}:${messageId}`;\n}\n\nfunction deadlineFromInflightKey(key: string): number {\n return Number.parseInt(\n key.slice(INFLIGHT_DEADLINE_PREFIX.length, INFLIGHT_DEADLINE_PREFIX.length + 13),\n 10,\n );\n}\n\nfunction runReferenceKey(runId: string, messageId: string): string {\n return `run:${runId}:${messageId}`;\n}\n\nfunction expiredRunKey(runId: string): string {\n return `expired-run:${runId}`;\n}\n\nfunction expiredRunGcKey(runId: string, compactAt: number): string {\n return `${EXPIRED_RUN_GC_PREFIX}${pad(compactAt)}:${encodeURIComponent(runId)}`;\n}\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\nasync function getMany<T>(\n storage: DurableObjectTransaction,\n keys: string[],\n): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n const page = await storage.get<T>(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n for (const [key, value] of page) result.set(key, value);\n }\n return result;\n}\n\nasync function putMany(\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\nasync function deleteMany(storage: DurableObjectTransaction, keys: string[]): Promise<number> {\n let deleted = 0;\n const unique = Array.from(new Set(keys));\n for (let offset = 0; offset < unique.length; offset += STORAGE_BATCH_SIZE) {\n deleted += await storage.delete(unique.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n return deleted;\n}\n\nfunction backoffSeconds(attempt: number): number {\n return Math.min(60, 2 ** attempt);\n}\n\nasync function cancelUnusedResponseBody(response: Response): Promise<void> {\n try {\n await response.body?.cancel();\n } catch {\n // The delivery outcome is already known from the status. A cancellation\n // failure must not turn an acknowledged callback into a retry.\n }\n}\n\ninterface QueueCellEnv {\n QUEUE_MAX_ATTEMPTS?: string;\n QUEUE_MAX_INFLIGHT?: string;\n QUEUE_DELIVERY_TIMEOUT_MS?: string;\n WORKFLOW_CALLBACK_SECRET?: string;\n /** Test seams (never set by a real deploy — celld vars are strings). */\n clock?: () => number;\n fetch?: typeof fetch;\n WORKFLOW_DB?: {\n idFromName(name: string): { toString(): string };\n get(id: { toString(): string }): { getLifecycleStatus(): Promise<RunLifecycleStatus> };\n };\n}\n\nconst MAX_QUEUE_INFLIGHT = 128;\n\nexport class QueueDO extends DurableObject {\n #now(): number {\n const clock = (this.env as QueueCellEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n #fetch(): typeof fetch {\n const impl = (this.env as QueueCellEnv)?.fetch;\n return typeof impl === 'function' ? impl : fetch;\n }\n\n #intVar(\n name: 'QUEUE_MAX_ATTEMPTS' | 'QUEUE_MAX_INFLIGHT' | 'QUEUE_DELIVERY_TIMEOUT_MS',\n fallback: number,\n ): number {\n const raw = (this.env as QueueCellEnv)?.[name];\n const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n }\n\n #maxInflight(): number {\n const configured = this.#intVar('QUEUE_MAX_INFLIGHT', DEFAULT_MAX_INFLIGHT);\n if (configured > MAX_QUEUE_INFLIGHT) {\n throw new Error(`QUEUE_MAX_INFLIGHT must be at most ${MAX_QUEUE_INFLIGHT}`);\n }\n return configured;\n }\n\n #deliveryTimeoutMs(): number {\n const configured = this.#intVar('QUEUE_DELIVERY_TIMEOUT_MS', DEFAULT_DELIVERY_TIMEOUT_MS);\n if (configured > MAX_QUEUE_DELIVERY_TIMEOUT_MS) {\n throw new Error(`QUEUE_DELIVERY_TIMEOUT_MS must be at most ${MAX_QUEUE_DELIVERY_TIMEOUT_MS}`);\n }\n return configured;\n }\n\n async #authoritativeRunExpired(runId: string): Promise<boolean> {\n const namespace = (this.env as QueueCellEnv)?.WORKFLOW_DB;\n if (!namespace) throw new Error('world-celld queue missing WORKFLOW_DB binding');\n const status = await namespace.get(namespace.idFromName(runId)).getLifecycleStatus();\n return status === 'expired';\n }\n\n async #withRunMutation<T>(\n runId: string,\n onExpired: (txn: DurableObjectTransaction) => Promise<T>,\n onAllowed: (txn: DurableObjectTransaction) => Promise<T>,\n ): Promise<T> {\n // A non-expired proof is intentionally not cached: a run may become\n // terminal and reach its retention boundary between any two requests.\n // Recheck the exact derivative marker in the queue transaction so cleanup\n // which raced the authority read still wins before the mutation commits.\n const expired = await this.#authoritativeRunExpired(runId);\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get<ExpiredRunFence>(expiredRunKey(runId))) || expired) {\n return await onExpired(txn);\n }\n return await onAllowed(txn);\n });\n }\n\n async enqueue(request: EnqueueRequest): Promise<EnqueueOutcome> {\n this.#maxInflight();\n this.#deliveryTimeoutMs();\n const storage = this.ctx.storage;\n const now = this.#now();\n\n const persist = async (txn: DurableObjectTransaction): Promise<EnqueueOutcome> => {\n // Pin the shard count from the first enqueue and reject drift loudly:\n // idempotencyKey -> cell affinity (and therefore dedup correctness)\n // depends on every producer agreeing on the shard count. The delivery\n // URL deliberately is NOT pinned — it travels per message.\n const pinned = await txn.get<{ queueShards: number; pinnedAt: number }>('cfg');\n if (!pinned) {\n await txn.put('cfg', { queueShards: request.config.queueShards, pinnedAt: now });\n } else if (pinned.queueShards !== request.config.queueShards) {\n return {\n ok: false,\n code: 'CONFIG_MISMATCH',\n message:\n `queue cell shard-count mismatch: pinned ${pinned.queueShards}, ` +\n `got ${request.config.queueShards} — changing queueShards requires draining the fleet`,\n };\n }\n\n // Dedup: while a message with this idempotencyKey is active, return the\n // original messageId (core re-enqueues pending steps on every replay and\n // relies on this).\n if (request.idempotencyKey) {\n const existing = await txn.get<string>(`key:${request.idempotencyKey}`);\n if (existing) {\n if (await txn.get(`msg:${existing}`)) {\n await this.#scheduleNextAlarm(txn, now);\n return { ok: true, messageId: existing, deduped: true };\n }\n // Stale claim (message gone without release) — steal it.\n await txn.delete(`key:${request.idempotencyKey}`);\n }\n await txn.put(`key:${request.idempotencyKey}`, request.messageId);\n }\n\n const row: MessageRow = {\n messageId: request.messageId,\n queueName: request.queueName,\n pathname: request.pathname,\n body: request.body,\n runId: request.runId,\n targetBaseUrl: request.config.targetBaseUrl,\n idempotencyKey: request.idempotencyKey,\n attempt: 0,\n enqueuedAt: now,\n };\n const dueAt = now + Math.max(0, request.delaySeconds ?? 0) * 1000;\n const scheduleKey = dueKey(dueAt, row.messageId);\n await txn.put(`msg:${row.messageId}`, row);\n await txn.put(scheduleKey, row.messageId);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#armAlarmAtMost(txn, dueAt, now);\n\n return { ok: true, messageId: row.messageId, deduped: false };\n };\n\n const outcome = request.runId\n ? await this.#withRunMutation<EnqueueOutcome>(\n request.runId,\n async (): Promise<EnqueueOutcome> => ({\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${request.runId}\" has expired`,\n }),\n persist,\n )\n : await storage.transaction(persist);\n\n return outcome;\n }\n\n async alarm(): Promise<void> {\n // celld#144: alarm handlers can overlap while awaiting. The storage-only\n // claim phase runs under the input gate; a failure is carried out and\n // rethrown outside so a failed critical section cannot reset the cell.\n let claimed: InflightClaim[] = [];\n let failure: unknown = null;\n const attempt = async () => {\n try {\n claimed = await this.#claimPhase();\n } catch (error) {\n failure = error;\n }\n };\n if (typeof this.ctx.blockConcurrencyWhile === 'function') {\n await this.ctx.blockConcurrencyWhile(attempt);\n } else {\n await attempt();\n }\n if (failure !== null) {\n await this.ctx.storage.setAlarm(this.#now() + LIFECYCLE_COMPACTION_RETRY_MS);\n throw failure;\n }\n\n for (const claim of claimed) {\n this.ctx.waitUntil(this.#deliver(claim));\n }\n }\n\n /**\n * Storage-only: recover lost inflight claims, claim due messages up to the\n * inflight cap, and re-arm the alarm. Never throws for data conditions.\n */\n async #claimPhase(): Promise<InflightClaim[]> {\n const storage = this.ctx.storage;\n const now = this.#now();\n const maxInflight = this.#maxInflight();\n const claimed = await storage.transaction<InflightClaim[]>(async (txn) => {\n // 1. Compact a bounded page of acknowledged derivative expiry fences.\n // Queue operations always consult the authoritative RunDO tombstone, so\n // deleting the receipt cannot reopen the run.\n if (await this.#compactExpiredRunFences(txn, now)) {\n await txn.setAlarm(now + MIN_ALARM_DELAY_MS);\n return [];\n }\n\n // 2. Recover: an inflight entry past its deadline is a lost delivery\n // (node crash, deploy restart) — back to due for redelivery.\n const expiredPage = await txn.list<string>({\n prefix: INFLIGHT_DEADLINE_PREFIX,\n end: `${INFLIGHT_DEADLINE_PREFIX}${pad(now + 1)}`,\n limit: EXPIRED_INFLIGHT_BATCH + 1,\n });\n const expired = Array.from(expiredPage.entries()).slice(0, EXPIRED_INFLIGHT_BATCH);\n const expiredRows = await getMany<MessageRow>(\n txn,\n expired.map(([, messageId]) => `msg:${messageId}`),\n );\n await deleteMany(\n txn,\n expired.map(([key]) => key),\n );\n const recoveryWrites: Array<readonly [string, unknown]> = [];\n for (const [, messageId] of expired) {\n const row = expiredRows.get(`msg:${messageId}`);\n if (row) {\n const scheduleKey = dueKey(now, messageId);\n recoveryWrites.push([scheduleKey, messageId]);\n if (row.runId) {\n recoveryWrites.push([\n runReferenceKey(row.runId, row.messageId),\n {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n } satisfies QueueRunReference,\n ]);\n }\n }\n }\n await putMany(txn, recoveryWrites);\n if (expiredPage.size > EXPIRED_INFLIGHT_BATCH) {\n await txn.setAlarm(now + MIN_ALARM_DELAY_MS);\n return [];\n }\n\n // Only the configured concurrency cap matters here. Reading at most the\n // cap avoids replacing the expiry scan with an unbounded count scan.\n const activeInflight = await txn.list<string>({\n prefix: INFLIGHT_DEADLINE_PREFIX,\n limit: maxInflight,\n });\n const inflightCount = activeInflight.size;\n\n // 3. Claim due messages up to the cap.\n const rows: InflightClaim[] = [];\n if (inflightCount < maxInflight) {\n const due = await txn.list<string>({\n prefix: 'due:',\n end: `due:${pad(now + 1)}`,\n limit: maxInflight - inflightCount,\n });\n const timeoutMs = this.#deliveryTimeoutMs();\n const dueRows = await getMany<MessageRow>(\n txn,\n Array.from(due.values(), (messageId) => `msg:${messageId}`),\n );\n await deleteMany(txn, Array.from(due.keys()));\n const claimWrites: Array<readonly [string, unknown]> = [];\n for (const [, messageId] of due) {\n const row = dueRows.get(`msg:${messageId}`);\n if (!row) continue; // orphaned schedule entry\n const claimKey = inflightKey(now + timeoutMs + QUEUE_INFLIGHT_GRACE_MS, messageId);\n claimWrites.push([claimKey, messageId]);\n if (row.runId) {\n claimWrites.push([\n runReferenceKey(row.runId, row.messageId),\n {\n messageId: row.messageId,\n inflightKey: claimKey,\n idempotencyKey: row.idempotencyKey,\n } satisfies QueueRunReference,\n ]);\n }\n rows.push({ row, inflightKey: claimKey });\n }\n await putMany(txn, claimWrites);\n }\n await this.#scheduleNextAlarm(txn, now);\n return rows;\n });\n\n return claimed;\n }\n\n async #deliver({ row, inflightKey: claimKey }: InflightClaim): Promise<void> {\n const storage = this.ctx.storage;\n const timeoutMs = this.#deliveryTimeoutMs();\n const callbackSecret = (this.env as QueueCellEnv)?.WORKFLOW_CALLBACK_SECRET;\n const url = `${row.targetBaseUrl.replace(/\\/$/, '')}/.well-known/workflow/v1/${row.pathname}`;\n\n // Claiming is storage-only so it can stay bounded and atomic. Resolve the\n // authoritative lifecycle immediately before external I/O; if retention\n // expired after the claim, consume the claim without publishing a hook.\n if (row.runId && (await this.#authoritativeRunExpired(row.runId))) {\n await storage.transaction((txn) => this.#dropExpiredMessage(txn, row, claimKey, this.#now()));\n return;\n }\n\n let response: Response | null = null;\n let transportError: unknown = null;\n try {\n response = await this.#fetch()(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-vqs-queue-name': row.queueName,\n 'x-vqs-message-id': row.messageId,\n 'x-vqs-message-attempt': String(row.attempt + 1),\n ...(callbackSecret ? { 'x-workflow-callback-secret': callbackSecret } : {}),\n },\n body: row.body,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n transportError = error;\n }\n\n const now = this.#now();\n\n if (response?.ok) {\n // Ack: the message is done; release the dedup claim.\n await cancelUnusedResponseBody(response);\n await this.#ack(row, claimKey);\n } else if (response && response.status === 503) {\n // {timeoutSeconds} means \"redeliver later, same message\": the attempt\n // count does not advance and the dedup key stays claimed.\n let timeoutSeconds: number | undefined;\n try {\n const parsed = (await response.json()) as { timeoutSeconds?: number };\n timeoutSeconds = parsed?.timeoutSeconds;\n } catch {\n timeoutSeconds = undefined;\n }\n if (typeof timeoutSeconds === 'number') {\n const reschedule = async (txn: DurableObjectTransaction) => {\n // Deleting the exact deadline key doubles as a lease-token check. A\n // late response from an expired claim must not mutate a newer claim.\n if (!(await txn.delete(claimKey))) return;\n const scheduleKey = dueKey(now + timeoutSeconds * 1000, row.messageId);\n await txn.put(scheduleKey, row.messageId);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#scheduleNextAlarm(txn, now);\n };\n if (row.runId) {\n await this.#withRunMutation(\n row.runId,\n (txn) => this.#dropExpiredMessage(txn, row, claimKey, now),\n reschedule,\n );\n } else {\n await storage.transaction(reschedule);\n }\n } else {\n await this.#retry(row, claimKey, 'HTTP 503');\n }\n } else if (response && PERMANENT_STATUSES.has(response.status)) {\n // Permanent: drop without burning retries; the handler already\n // classified this as unreplayable.\n await cancelUnusedResponseBody(response);\n await this.#ack(row, claimKey);\n } else {\n const reason = response\n ? `HTTP ${response.status}`\n : `transport error: ${String(transportError)}`;\n if (response) await cancelUnusedResponseBody(response);\n await this.#retry(row, claimKey, reason);\n }\n }\n\n async #ack(row: MessageRow, claimKey: string): Promise<void> {\n const storage = this.ctx.storage;\n await storage.transaction(async (txn) => {\n if (!(await txn.delete(claimKey))) return;\n await txn.delete(`msg:${row.messageId}`);\n if (row.idempotencyKey) {\n const holder = await txn.get<string>(`key:${row.idempotencyKey}`);\n if (holder === row.messageId) {\n await txn.delete(`key:${row.idempotencyKey}`);\n }\n }\n if (row.runId) {\n await txn.delete(runReferenceKey(row.runId, row.messageId));\n }\n await this.#scheduleNextAlarm(txn, this.#now());\n });\n }\n\n async #dropExpiredMessage(\n txn: DurableObjectTransaction,\n row: MessageRow,\n claimKey: string,\n now: number,\n ): Promise<void> {\n if (!(await txn.delete(claimKey))) return;\n await txn.delete(`msg:${row.messageId}`);\n if (row.runId) await txn.delete(runReferenceKey(row.runId, row.messageId));\n if (row.idempotencyKey) {\n const dedupKey = `key:${row.idempotencyKey}`;\n if ((await txn.get<string>(dedupKey)) === row.messageId) await txn.delete(dedupKey);\n }\n await this.#scheduleNextAlarm(txn, now);\n }\n\n async #retry(row: MessageRow, claimKey: string, reason: string): Promise<void> {\n const storage = this.ctx.storage;\n const now = this.#now();\n const maxAttempts = this.#intVar('QUEUE_MAX_ATTEMPTS', DEFAULT_MAX_ATTEMPTS);\n const attempt = row.attempt + 1;\n\n const persistRetry = async (txn: DurableObjectTransaction) => {\n if (!(await txn.delete(claimKey))) return;\n\n if (attempt >= maxAttempts) {\n const dead: DeadLetterRow = { ...row, attempt, lastError: reason, failedAt: now };\n const deadKey = `dlq:${pad(now)}:${row.messageId}`;\n await txn.put(deadKey, dead);\n await txn.delete(`msg:${row.messageId}`);\n if (row.idempotencyKey) {\n const holder = await txn.get<string>(`key:${row.idempotencyKey}`);\n if (holder === row.messageId) {\n await txn.delete(`key:${row.idempotencyKey}`);\n }\n }\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dlqKey: deadKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#scheduleNextAlarm(txn, now);\n return;\n }\n\n const updated: MessageRow = { ...row, attempt, lastError: reason };\n const scheduleKey = dueKey(now + backoffSeconds(attempt) * 1000, row.messageId);\n await txn.put(`msg:${row.messageId}`, updated);\n await txn.put(scheduleKey, row.messageId);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#scheduleNextAlarm(txn, now);\n };\n if (row.runId) {\n await this.#withRunMutation(\n row.runId,\n (txn) => this.#dropExpiredMessage(txn, row, claimKey, now),\n persistRetry,\n );\n } else {\n await storage.transaction(persistRetry);\n }\n }\n\n /** Return true when another due compaction page must run immediately. */\n async #compactExpiredRunFences(txn: DurableObjectTransaction, now: number): Promise<boolean> {\n const due = await txn.list<ExpiredRunGc>({\n prefix: EXPIRED_RUN_GC_PREFIX,\n end: `${EXPIRED_RUN_GC_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n if (page.length === 0) return false;\n\n const markerKeys = page.map(([, item]) => expiredRunKey(item.runId));\n const markers = await getMany<ExpiredRunFence>(txn, markerKeys);\n const deletes: string[] = [];\n for (let index = 0; index < page.length; index++) {\n const [gcKey, item] = page[index];\n const markerKey = markerKeys[index];\n const marker = markers.get(markerKey);\n deletes.push(gcKey);\n if (marker?.compactAt !== item.compactAt) continue;\n deletes.push(markerKey);\n }\n await deleteMany(txn, deletes);\n return due.size > LIFECYCLE_COMPACTION_BATCH;\n }\n\n /** Arm the alarm no later than `atMs` (durable backoff never throws). */\n async #armAlarmAtMost(storage: AlarmStorage, atMs: number, now: number): Promise<void> {\n const current = await storage.getAlarm();\n if (current !== null && current <= now) {\n await storage.setAlarm(now + MIN_ALARM_DELAY_MS);\n return;\n }\n\n const target = atMs <= now ? now + MIN_ALARM_DELAY_MS : atMs;\n if (current === null || target < current) {\n await storage.setAlarm(target);\n }\n }\n\n /** Recompute the alarm from the earliest due entry / inflight deadline. */\n async #rearm(): Promise<void> {\n await this.#scheduleNextAlarm(this.ctx.storage, this.#now());\n }\n\n /** Keep the alarm index consistent with message state in the same transaction. */\n async #scheduleNextAlarm(storage: AlarmStorage, now: number): Promise<void> {\n let next: number | null = null;\n\n const due = await storage.list<string>({ prefix: 'due:', limit: 1 });\n for (const key of due.keys()) {\n next = Number.parseInt(key.slice('due:'.length, 'due:'.length + 13), 10);\n }\n\n const inflight = await storage.list<string>({ prefix: INFLIGHT_DEADLINE_PREFIX, limit: 1 });\n for (const key of inflight.keys()) {\n const deadline = deadlineFromInflightKey(key);\n if (next === null || deadline < next) next = deadline;\n }\n\n const expiryGc = await storage.list<ExpiredRunGc>({ prefix: EXPIRED_RUN_GC_PREFIX, limit: 1 });\n for (const item of expiryGc.values()) {\n if (next === null || item.compactAt < next) next = item.compactAt;\n }\n\n if (next !== null) {\n await storage.setAlarm(next <= now ? now + MIN_ALARM_DELAY_MS : next);\n } else {\n await storage.deleteAlarm();\n }\n }\n\n // ---- Admin RPC (exposed through the router's queue binding) ----\n\n async stats(): Promise<QueueStats> {\n const storage = this.ctx.storage;\n const [due, inflight, dlq, alarmAt] = await Promise.all([\n storage.list({ prefix: 'due:' }),\n storage.list({ prefix: INFLIGHT_DEADLINE_PREFIX }),\n storage.list({ prefix: 'dlq:' }),\n storage.getAlarm(),\n ]);\n return {\n pending: due.size,\n inflight: inflight.size,\n deadLetters: dlq.size,\n alarmAt,\n };\n }\n\n async listDeadLetters(params?: {\n limit?: number;\n cursor?: string;\n }): Promise<{ data: DeadLetterRow[]; cursor: string | null; hasMore: boolean }> {\n const limit = params?.limit ?? 100;\n const entries = await this.ctx.storage.list<DeadLetterRow>({\n prefix: 'dlq:',\n startAfter: params?.cursor,\n limit: limit + 1,\n });\n const keys = Array.from(entries.keys());\n const page = keys.slice(0, limit);\n const hasMore = keys.length > limit;\n return {\n data: page.map((k) => entries.get(k) as DeadLetterRow),\n cursor: hasMore ? page.at(-1)! : null,\n hasMore,\n };\n }\n\n /** Move a dead letter back to the live queue (attempt count reset). */\n async redriveDeadLetter(messageId: string): Promise<{ ok: boolean }> {\n const storage = this.ctx.storage;\n const now = this.#now();\n const found = Array.from(await storage.list<DeadLetterRow>({ prefix: 'dlq:' })).find(\n ([, dead]) => dead.messageId === messageId,\n );\n if (!found) return { ok: false };\n const [deadKey, candidate] = found;\n\n const redrive = async (txn: DurableObjectTransaction): Promise<{ ok: boolean }> => {\n const dead = await txn.get<DeadLetterRow>(deadKey);\n if (!dead || dead.messageId !== messageId) return { ok: false };\n const { failedAt: _failedAt, ...rest } = dead;\n const row: MessageRow = { ...rest, attempt: 0, lastError: undefined };\n\n if (row.idempotencyKey) {\n const dedupKey = `key:${row.idempotencyKey}`;\n const holder = await txn.get<string>(dedupKey);\n if (holder && holder !== row.messageId && (await txn.get(`msg:${holder}`))) {\n return { ok: false };\n }\n if (holder && holder !== row.messageId) await txn.delete(dedupKey);\n await txn.put(dedupKey, row.messageId);\n }\n\n await txn.put(`msg:${row.messageId}`, row);\n const scheduleKey = dueKey(now, row.messageId);\n await txn.put(scheduleKey, row.messageId);\n await txn.delete(deadKey);\n if (row.runId) {\n await txn.put<QueueRunReference>(runReferenceKey(row.runId, row.messageId), {\n messageId: row.messageId,\n dueKey: scheduleKey,\n idempotencyKey: row.idempotencyKey,\n });\n }\n await this.#armAlarmAtMost(txn, now, now);\n return { ok: true };\n };\n\n const rejectExpired = async (txn: DurableObjectTransaction): Promise<{ ok: boolean }> => {\n const current = await txn.get<DeadLetterRow>(deadKey);\n if (current?.messageId === messageId) {\n await txn.delete([deadKey, runReferenceKey(candidate.runId!, messageId)]);\n }\n return { ok: false };\n };\n\n const outcome = candidate.runId\n ? await this.#withRunMutation(candidate.runId, rejectExpired, redrive)\n : await storage.transaction(redrive);\n\n return outcome;\n }\n\n async purgeDeadLetters(): Promise<{ purged: number; hasMore: boolean }> {\n const storage = this.ctx.storage;\n return await storage.transaction(async (txn) => {\n const entries = await txn.list<DeadLetterRow>({\n prefix: 'dlq:',\n limit: PURGE_DEAD_LETTER_BATCH + 1,\n });\n const page = Array.from(entries).slice(0, PURGE_DEAD_LETTER_BATCH);\n const keys = page.flatMap(([key, dead]) => [\n key,\n ...(dead.runId ? [runReferenceKey(dead.runId, dead.messageId)] : []),\n ]);\n await deleteMany(txn, keys);\n return { purged: page.length, hasMore: entries.size > PURGE_DEAD_LETTER_BATCH };\n });\n }\n\n /**\n * Recovery hatch for celld's six-failure alarm abandonment: derive the due\n * time again and arm it.\n */\n async rearmAlarm(): Promise<{ alarmAt: number | null }> {\n await this.#rearm();\n return { alarmAt: await this.ctx.storage.getAlarm() };\n }\n\n /** Fence a run and purge every live, inflight, and dead-letter message it owns. */\n async expireRun(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireQueueRunResult> {\n const storage = this.ctx.storage;\n const limit = boundedLimit(\n options?.limit,\n EXPIRE_RUN_REFERENCE_BATCH,\n EXPIRE_RUN_REFERENCE_BATCH,\n );\n return await storage.transaction(async (txn) => {\n const existing = await txn.get<ExpiredRunFence>(expiredRunKey(runId));\n const references = await txn.list<QueueRunReference>({\n prefix: `run:${runId}:`,\n limit: limit + 1,\n });\n const page = Array.from(references).slice(0, limit);\n const dedupKeys = page.flatMap(([, reference]) =>\n reference.idempotencyKey ? [`key:${reference.idempotencyKey}`] : [],\n );\n const dedupHolders = await getMany<string>(txn, dedupKeys);\n const keys: string[] = [];\n let count = existing?.deleted ?? 0;\n for (const [key, reference] of page) {\n keys.push(`msg:${reference.messageId}`, key);\n if (reference.inflightKey) keys.push(reference.inflightKey);\n if (reference.dueKey) keys.push(reference.dueKey);\n if (reference.dlqKey) keys.push(reference.dlqKey);\n if (reference.idempotencyKey) {\n const dedupKey = `key:${reference.idempotencyKey}`;\n if (dedupHolders.get(dedupKey) === reference.messageId) keys.push(dedupKey);\n }\n count++;\n }\n await deleteMany(txn, keys);\n const done = references.size <= limit;\n const markerExpiredAt = existing?.expiredAt ?? expiredAt;\n await txn.put<ExpiredRunFence>(expiredRunKey(runId), {\n expiredAt: markerExpiredAt,\n deleted: count,\n // Keep the cumulative receipt until the cleanup coordinator has first\n // persisted it and then explicitly acknowledged it.\n compactAt: existing?.compactAt ?? null,\n });\n await this.#scheduleNextAlarm(txn, this.#now());\n return done\n ? { deleted: count, done: true, receipt: { expiredAt: markerExpiredAt, deleted: count } }\n : { deleted: count, done: false };\n });\n }\n\n /** Acknowledge a final cleanup receipt before making its marker compactable. */\n async acknowledgeExpireRun(\n runId: string,\n receipt: QueueExpiryReceipt,\n ): Promise<AcknowledgeQueueExpiryResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const key = expiredRunKey(runId);\n const marker = await txn.get<ExpiredRunFence>(key);\n // A response may be lost after acknowledgement and its grace alarm may\n // compact the marker before the coordinator retries. Absence is therefore\n // the idempotent success state.\n if (!marker) return { acknowledged: true };\n if (marker.expiredAt !== receipt.expiredAt || marker.deleted !== receipt.deleted) {\n return { acknowledged: false };\n }\n if (marker.compactAt === null) {\n const compactAt = this.#now() + QUEUE_FENCE_GRACE_MS;\n await txn.put<ExpiredRunFence>(key, { ...marker, compactAt });\n await txn.put<ExpiredRunGc>(expiredRunGcKey(runId, compactAt), { runId, compactAt });\n }\n await this.#scheduleNextAlarm(txn, this.#now());\n return { acknowledged: true };\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:';\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\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 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 if (keys.length !== 2) throw new Error('Run catalog commit requires exactly two keys');\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.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 await txn.put(Object.fromEntries(keys.map((key) => [key, serializedMetadata])));\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 prefix: options.prefix ?? '',\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 const metadata = JSON.parse(expectedValue) as { runId?: unknown };\n if (metadata.runId !== runId) {\n throw new Error('Stale run catalog deletion requires matching run metadata');\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(\n runId: string,\n keys: string[],\n expiredAt: number,\n ): Promise<ExpireRunIndexesResult> {\n if (keys.length !== 2) throw new Error('Run catalog expiry requires exactly two keys');\n return await this.ctx.storage.transaction(async (txn) => {\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 return { deleted: await txn.delete(keys) };\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; one delete accepts at most 128 keys. */\nconst DEFAULT_EXPIRE_CHUNK_LIMIT = 64;\nconst MAX_EXPIRE_CHUNK_LIMIT = 64;\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;\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: StreamMeta): StreamMeta {\n if (\n !Number.isSafeInteger(meta.count) ||\n meta.count < 0 ||\n meta.count > 0x7fffffff ||\n !['open', 'closed', 'errored', 'expired'].includes(meta.state)\n ) {\n throw new Error('Invalid persisted stream metadata');\n }\n if (meta.state === 'errored' && !meta.error) {\n throw new Error('Invalid persisted stream error metadata');\n }\n return meta;\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 (!/^\\d{12}$/.test(suffix) || !Number.isSafeInteger(index) || index < 0) {\n throw new Error(`Invalid persisted stream chunk size 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 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 ? validateMeta(meta) : emptyMeta();\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.ctx.storage.get<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.ctx.storage.get<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 ? validateMeta(stored) : emptyMeta();\n this.assertWritable(meta, runId);\n const startIndex = meta.count;\n if (startIndex + chunks.length > 0x7fffffff) {\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: Record<string, StreamMeta | Uint8Array | number> = { [META_KEY]: nextMeta };\n for (let offset = 0; offset < storedChunks.length; offset++) {\n const index = startIndex + offset;\n entries[chunkKey(index)] = storedChunks[offset];\n entries[chunkSizeKey(index)] = storedChunks[offset].byteLength;\n }\n await txn.put(entries);\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 ? validateMeta(stored) : emptyMeta();\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 ? validateMeta(stored) : emptyMeta();\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 ? validateMeta(stored) : emptyMeta();\n this.assertOwner(meta, runId);\n const firstFence = meta.state !== 'expired';\n if (meta.state === 'expired' && meta.payloadDeleted) {\n return {\n meta,\n result: { deleted: false, chunks: 0, bytes: 0, done: true },\n };\n }\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 const keys = page.flatMap(({ index }) => [chunkKey(index), chunkSizeKey(index)]);\n if (keys.length > 0) await txn.delete(keys);\n const done = candidates.size === page.length;\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","/**\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 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\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}\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 (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","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 STEP_CREATED_KEY_PREFIX,\n STEP_KEY_PREFIX,\n WAIT_KEY_PREFIX,\n} from '../../apply-event.js';\nimport {\n type AcknowledgeQueueExpiryResult,\n CLEANUP_RECORD_KEY,\n type CleanupRecord,\n cleanupFromTombstone,\n cleanupTombstone,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n type ExpireQueueRunResult,\n type ExpireRunStreamsResult,\n type ExpireStreamResult,\n type FinalizeRunStreamsResult,\n expiredRead,\n globalRunIndexKey,\n HOOK_MARKER_PREFIX,\n type HookIndexReference,\n hookMarkerKey,\n type RunReadOutcome,\n type RunLifecycleStatus,\n type QueueExpiryReceipt,\n type RunTombstone,\n type ScheduleCleanupRequest,\n TERMINAL_CLEANUP_KEY,\n type TerminalCleanupRecord,\n TOMBSTONE_KEY,\n workflowRunIndexKey,\n} from '../../retention.js';\nimport { MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS } from '../../lifecycle.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 QueueCleanupStub {\n expireRun(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireQueueRunResult>;\n acknowledgeExpireRun(\n runId: string,\n receipt: QueueExpiryReceipt,\n ): Promise<AcknowledgeQueueExpiryResult>;\n}\n\ninterface WorkflowRunDOEnv {\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?: CellNamespace<QueueCleanupStub>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\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;\nconst STREAM_CHUNKS_PER_CLEANUP_PAGE = STORAGE_BATCH_SIZE;\nconst STREAM_BYTES_PER_CLEANUP_PAGE = 16 * 1024 * 1024;\nconst QUEUE_REFERENCES_PER_CLEANUP_PAGE = 64;\nconst CLEANUP_RETRY_MAX_MS = 60 * 60 * 1000;\nconst CLEANUP_PROGRESS_KEY = 'retention:progress';\nconst RUN_QUEUE_SHARDS_KEY = 'retention:queue-shards';\ntype TerminalRun = Extract<WorkflowRun, { status: 'completed' | 'failed' | 'cancelled' }>;\n\nfunction cleanupRecord(\n run: WorkflowRun,\n dueAt: Date,\n queueShards: number,\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 queueShards,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueueMessages: 0,\n };\n}\n\ninterface CleanupProgress {\n queueShard: number;\n queueShardDeleted: number;\n pendingAck?: {\n queueShard: number;\n receipt: QueueExpiryReceipt;\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 claimedAt: number;\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>` are used purely as\n * queue-message dedup claims (see claimInflight/releaseInflight).\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 ): Promise<{ cleanup?: CleanupRecord; tombstone: RunTombstone | null }> {\n const values = await storage.get<RunTombstone | CleanupRecord>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n ]);\n return {\n cleanup: values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined,\n tombstone: this.tombstoneFrom(values, now),\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 return await this.ctx.storage.transaction(async (txn) => {\n const now = new Date(this.now());\n const retention = await this.retentionState(txn, now.getTime());\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 let eventSequence = (await txn.get<number>('event_sequence')) ?? 0;\n const outcome = await applyEvent(storeFrom(txn), {\n ...request,\n nextEventId: () => slotToEventId(++eventSequence),\n now,\n });\n if (!outcome.ok) return outcome;\n\n if (outcome.runCreated && request.cleanup) {\n await txn.put(RUN_QUEUE_SHARDS_KEY, request.cleanup.queueShards);\n }\n\n await txn.put('event_sequence', 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(terminalRun.completedAt.getTime() + retentionMs);\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(\n run,\n dueAt,\n request.cleanup?.queueShards ?? 1,\n 'terminal-retention',\n );\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 if (request.retentionMs <= 0) return this.getCleanupStatus();\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(terminalRun.completedAt.getTime() + request.retentionMs);\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, request.queueShards, '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 if (!Number.isSafeInteger(request.retentionMs) || request.retentionMs <= 0) {\n throw new Error('world-celld retentionMs must be a positive safe integer');\n }\n if (!Number.isSafeInteger(request.queueShards) || request.queueShards <= 0) {\n throw new Error('world-celld retention queueShards must be a positive safe integer');\n }\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 | number>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n RUN_QUEUE_SHARDS_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 = run.createdAt.getTime() + request.retentionMs;\n if (!Number.isSafeInteger(dueAtMs) || dueAtMs > 8_640_000_000_000_000) {\n throw new Error(`world-celld retention deadline is out of range for ${run.runId}`);\n }\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 const storedQueueShards = values.get(RUN_QUEUE_SHARDS_KEY) as number | undefined;\n const queueShards =\n Number.isSafeInteger(storedQueueShards) && (storedQueueShards as number) > 0\n ? (storedQueueShards as number)\n : request.queueShards;\n let cleanup = existing;\n if (!cleanup) {\n cleanup = cleanupRecord(run, dueAt, queueShards, '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 if (!(await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY))) {\n await this.scheduleCleanup({ ...request, retentionMs: Math.max(1, request.retentionMs) });\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<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\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') {\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 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 keys: [workflowRunIndexKey(cleanup), globalRunIndexKey(cleanup)],\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 queues = this.namespace<QueueCleanupStub>('WORKFLOW_QUEUE');\n const progress =\n (await this.ctx.storage.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n\n if (progress.pendingAck) {\n const { queueShard, receipt } = progress.pendingAck;\n const queue = queues.get(queues.idFromName(`q:${queueShard}`));\n const result = await queue.acknowledgeExpireRun(cleanup.runId, receipt);\n if (!result.acknowledged) {\n throw new Error(`queue shard ${queueShard} rejected expiry receipt for ${cleanup.runId}`);\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 const persisted = await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY);\n if (\n persisted?.pendingAck?.queueShard !== queueShard ||\n persisted.pendingAck.receipt.expiredAt !== receipt.expiredAt ||\n persisted.pendingAck.receipt.deleted !== receipt.deleted\n ) {\n return;\n }\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.put<CleanupProgress>(CLEANUP_PROGRESS_KEY, {\n queueShard: queueShard + 1,\n queueShardDeleted: 0,\n });\n await txn.setAlarm(this.now() + 1);\n });\n return;\n }\n\n if (progress.queueShard < cleanup.queueShards) {\n const requestedShard = progress.queueShard;\n const queue = queues.get(queues.idFromName(`q:${requestedShard}`));\n const result = await queue.expireRun(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: QUEUE_REFERENCES_PER_CLEANUP_PAGE,\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 const persisted =\n (await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n if (persisted.queueShard !== requestedShard || persisted.pendingAck) return;\n if (result.deleted < persisted.queueShardDeleted) {\n throw new Error(\n `queue shard ${requestedShard} regressed expiry receipt for ${cleanup.runId}`,\n );\n }\n const delta = result.deleted - persisted.queueShardDeleted;\n const next: CleanupProgress = result.done\n ? {\n queueShard: requestedShard,\n queueShardDeleted: result.deleted,\n pendingAck: { queueShard: requestedShard, receipt: result.receipt },\n }\n : { queueShard: requestedShard, queueShardDeleted: result.deleted };\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedQueueMessages: current.deletedQueueMessages + delta,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.put(CLEANUP_PROGRESS_KEY, next);\n await txn.setAlarm(this.now() + 1);\n });\n return;\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 const persisted =\n (await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n if (persisted.queueShard >= current.queueShards && !persisted.pendingAck) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n phase: 'payload',\n generation: current.generation + 1,\n });\n await txn.delete(CLEANUP_PROGRESS_KEY);\n await txn.setAlarm(this.now() + 1);\n }\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 claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<InflightClaim>('claim');\n const now = this.now();\n if (\n existing &&\n existing.messageId !== params.messageId &&\n now - existing.claimedAt < params.staleMs\n ) {\n return { claimed: false };\n }\n await txn.put<InflightClaim>('claim', { messageId: params.messageId, claimedAt: now });\n return { claimed: true };\n });\n }\n\n async releaseInflight(): Promise<void> {\n await this.ctx.storage.delete('claim');\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 */\nimport { createRouter, type WorkerEnv } from './router.js';\nimport { runRetentionSweep, type RetentionSweepEnv } from './retention-sweep.js';\n\nexport { HookIdDO } from './durable-objects/HookIdDO.js';\nexport { HookTokenDO } from './durable-objects/HookTokenDO.js';\nexport { QueueDO } from './durable-objects/QueueDO.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\nasync function scheduled(controller: ScheduledControllerLike, env: WorkerEnv): 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: WorkerEnv): Promise<Response> {\n return createRouter(env)(request);\n },\n scheduled,\n};\n"],"mappings":"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"}
|