@ewhauser/world-celld 0.3.1 → 0.3.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","names":["MAX_RELEASE_BATCH","recordKey","claimKey","STORAGE_BATCH_SIZE","boundedLimit","getMany","deleteMany","#intVar","#maxInflight","#now","#scheduleNextAlarm","#armAlarmAtMost","#claimPhase","#deliver","#fetch","#ack","#retry","#rearm","STORAGE_BATCH_SIZE"],"sources":["../src/testing/fake-cell.ts","../src/worker/auth.ts","../src/worker/router.ts","../src/worker/do-base.ts","../src/worker/durable-objects/hook-index-shared.ts","../src/worker/durable-objects/HookIdDO.ts","../src/worker/durable-objects/HookTokenDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/RunCatalogDO.ts","../src/worker/durable-objects/RunFenceDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/apply-event.ts","../src/retention.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/testing/http-harness.ts","../src/testing/index.ts"],"sourcesContent":["/**\n * In-process fake celld fleet (the eve-ambient celld-harness pattern):\n * instantiate the REAL cell classes against Map-backed fake DO state, with a\n * virtual-clock alarm dispatcher. Only the runtime plumbing is faked — every\n * storage/alarm/lifecycle behavior under test is the real class's code.\n */\n\nexport interface FakeListOptions {\n prefix?: string;\n start?: string;\n startAfter?: string;\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\nexport interface FakeStorageMutation {\n operation: 'put' | 'delete';\n key: string;\n value?: unknown;\n}\n\nexport interface FakeStorageOperationCounts {\n get: number;\n getMany: number;\n list: number;\n put: number;\n putMany: number;\n delete: number;\n deleteMany: number;\n transaction: number;\n}\n\nexport interface FakeStorageListCall {\n options: FakeListOptions;\n resultSize: number;\n transactional: boolean;\n}\n\nexport interface FakeStorageOperationCall {\n operation: 'get' | 'put' | 'delete';\n keys: string[];\n transactional: boolean;\n synchronous: boolean;\n}\n\nfunction applyListOptions(keys: string[], options: FakeListOptions): string[] {\n let result = keys.toSorted();\n if (options.prefix !== undefined) {\n const prefix = options.prefix;\n result = result.filter((k) => k.startsWith(prefix));\n }\n if (options.start !== undefined) {\n const bound = options.start;\n result = result.filter((k) => k >= bound);\n }\n if (options.startAfter !== undefined) {\n const bound = options.startAfter;\n result = result.filter((k) => k > bound);\n }\n if (options.end !== undefined) {\n const bound = options.end;\n result = result.filter((k) => k < bound);\n }\n if (options.reverse) {\n result = result.toReversed();\n }\n if (options.limit !== undefined) {\n result = result.slice(0, options.limit);\n }\n return result;\n}\n\n/**\n * Fake DurableObjectStorage over a Map. Transactions stage writes and commit\n * on success (discard on throw), with reads seeing staged state — the\n * semantics apply-event.ts relies on.\n */\nexport class FakeStorage {\n data = new Map<string, unknown>();\n alarmAt: number | null = null;\n readonly getManyCalls: string[][] = [];\n readonly operationCounts: FakeStorageOperationCounts = {\n get: 0,\n getMany: 0,\n list: 0,\n put: 0,\n putMany: 0,\n delete: 0,\n deleteMany: 0,\n transaction: 0,\n };\n private transactionTail: Promise<void> = Promise.resolve();\n private transactionDelayMs = 0;\n /** Deterministic query-shape instrumentation for storage scaling tests. */\n listCalls: FakeStorageListCall[] = [];\n operationCalls: FakeStorageOperationCall[] = [];\n private mutationFailure?: {\n predicate: (mutation: FakeStorageMutation) => boolean;\n error: Error;\n };\n\n constructor(private clock: () => number = () => Date.now()) {}\n\n async get<T>(key: string): Promise<T | undefined>;\n async get<T>(keys: string[]): Promise<Map<string, T>>;\n async get<T>(keyOrKeys: string | string[]): Promise<T | undefined | Map<string, T>> {\n if (Array.isArray(keyOrKeys)) {\n this.operationCounts.getMany += 1;\n this.getManyCalls.push([...keyOrKeys]);\n this.recordStorageCall('get', keyOrKeys, false);\n return new Map(\n keyOrKeys.filter((key) => this.data.has(key)).map((key) => [key, this.data.get(key) as T]),\n );\n }\n this.operationCounts.get += 1;\n this.recordStorageCall('get', [keyOrKeys], false);\n return this.data.get(keyOrKeys) as T | undefined;\n }\n\n async put<T>(key: string, value: T): Promise<void>;\n async put<T>(entries: Record<string, T>): Promise<void>;\n async put<T>(keyOrEntries: string | Record<string, T>, value?: T): Promise<void> {\n if (typeof keyOrEntries === 'string') {\n this.operationCounts.put += 1;\n this.maybeFailMutation({ operation: 'put', key: keyOrEntries, value });\n this.recordStorageCall('put', [keyOrEntries], false);\n this.data.set(keyOrEntries, structuredClone(value));\n return;\n }\n this.operationCounts.putMany += 1;\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.maybeFailMutation({ operation: 'put', key, value: entryValue });\n }\n this.recordStorageCall('put', Object.keys(keyOrEntries), false);\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.data.set(key, structuredClone(entryValue));\n }\n }\n\n async delete(key: string): Promise<boolean>;\n async delete(keys: string[]): Promise<number>;\n async delete(keyOrKeys: string | string[]): Promise<boolean | number> {\n if (typeof keyOrKeys === 'string') {\n this.operationCounts.delete += 1;\n this.maybeFailMutation({ operation: 'delete', key: keyOrKeys });\n this.recordStorageCall('delete', [keyOrKeys], false);\n return this.data.delete(keyOrKeys);\n }\n this.operationCounts.deleteMany += 1;\n for (const key of keyOrKeys) this.maybeFailMutation({ operation: 'delete', key });\n this.recordStorageCall('delete', keyOrKeys, false);\n let deleted = 0;\n for (const key of keyOrKeys) if (this.data.delete(key)) deleted += 1;\n return deleted;\n }\n\n async deleteAll(): Promise<void> {\n this.data.clear();\n }\n\n async list<T>(options: FakeListOptions = {}): Promise<Map<string, T>> {\n this.operationCounts.list += 1;\n const keys = applyListOptions(Array.from(this.data.keys()), options);\n this.recordList(options, keys.length, false);\n return new Map(keys.map((k) => [k, this.data.get(k) as T]));\n }\n\n async transaction<T>(cb: (txn: FakeTransaction) => Promise<T>): Promise<T> {\n this.operationCounts.transaction += 1;\n let release!: () => void;\n const previous = this.transactionTail;\n this.transactionTail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n if (this.transactionDelayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.transactionDelayMs));\n }\n const txn = new FakeTransaction(this);\n const result = await cb(txn);\n txn.commit();\n return result;\n } finally {\n release();\n }\n }\n\n /** Add deterministic per-transaction work for contention benchmarks. */\n setTransactionDelay(ms: number): void {\n if (!Number.isFinite(ms) || ms < 0) throw new Error('transaction delay must be non-negative');\n this.transactionDelayMs = ms;\n }\n\n async getAlarm(): Promise<number | null> {\n return this.alarmAt;\n }\n\n async setAlarm(at: number | Date): Promise<void> {\n this.alarmAt = typeof at === 'number' ? at : at.getTime();\n }\n\n async deleteAlarm(): Promise<void> {\n this.alarmAt = null;\n }\n\n now(): number {\n return this.clock();\n }\n\n resetOperationCounts(): void {\n for (const key of Object.keys(this.operationCounts) as (keyof FakeStorageOperationCounts)[]) {\n this.operationCounts[key] = 0;\n }\n this.getManyCalls.length = 0;\n this.operationCalls.length = 0;\n }\n\n /** @internal Used by FakeTransaction to count the same platform operations. */\n recordOperation(operation: keyof FakeStorageOperationCounts): void {\n this.operationCounts[operation] += 1;\n }\n\n /** @internal Shared with FakeTransaction for deterministic key tracing. */\n recordStorageCall(\n operation: FakeStorageOperationCall['operation'],\n keys: string[],\n transactional: boolean,\n ): void {\n this.operationCalls.push({ operation, keys: [...keys], transactional, synchronous: false });\n }\n\n /** Inject one matching write failure, including writes inside transactions. */\n failNextMutation(\n predicate: (mutation: FakeStorageMutation) => boolean,\n error = new Error('injected fake storage mutation failure'),\n ): void {\n this.mutationFailure = { predicate, error };\n }\n\n /** @internal Shared with FakeTransaction so failure injection survives a transaction fix. */\n maybeFailMutation(mutation: FakeStorageMutation): void {\n if (!this.mutationFailure?.predicate(mutation)) return;\n const { error } = this.mutationFailure;\n this.mutationFailure = undefined;\n throw error;\n }\n\n /** @internal Shared with FakeTransaction for deterministic query tracing. */\n recordList(options: FakeListOptions, resultSize: number, transactional: boolean): void {\n this.listCalls.push({ options: { ...options }, resultSize, transactional });\n }\n}\n\nclass FakeTransaction {\n private staged = new Map<string, unknown>();\n private deleted = new Set<string>();\n private stagedAlarm: number | null | undefined;\n\n constructor(private storage: FakeStorage) {}\n\n async get<T>(key: string): Promise<T | undefined>;\n async get<T>(keys: string[]): Promise<Map<string, T>>;\n async get<T>(keyOrKeys: string | string[]): Promise<T | undefined | Map<string, T>> {\n if (Array.isArray(keyOrKeys)) {\n this.storage.recordOperation('getMany');\n this.storage.getManyCalls.push([...keyOrKeys]);\n this.storage.recordStorageCall('get', keyOrKeys, true);\n const result = new Map<string, T>();\n for (const key of keyOrKeys) {\n if (this.deleted.has(key)) continue;\n if (this.staged.has(key)) result.set(key, this.staged.get(key) as T);\n else if (this.storage.data.has(key)) result.set(key, this.storage.data.get(key) as T);\n }\n return result;\n }\n this.storage.recordOperation('get');\n const key = keyOrKeys;\n this.storage.recordStorageCall('get', [key], true);\n if (this.deleted.has(key)) return undefined;\n if (this.staged.has(key)) return this.staged.get(key) as T;\n return this.storage.data.get(key) as T | undefined;\n }\n\n async put<T>(key: string, value: T): Promise<void>;\n async put<T>(entries: Record<string, T>): Promise<void>;\n async put<T>(keyOrEntries: string | Record<string, T>, value?: T): Promise<void> {\n if (typeof keyOrEntries === 'string') {\n this.storage.recordOperation('put');\n this.storage.maybeFailMutation({ operation: 'put', key: keyOrEntries, value });\n this.storage.recordStorageCall('put', [keyOrEntries], true);\n this.deleted.delete(keyOrEntries);\n this.staged.set(keyOrEntries, structuredClone(value));\n return;\n }\n this.storage.recordOperation('putMany');\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.storage.maybeFailMutation({ operation: 'put', key, value: entryValue });\n }\n this.storage.recordStorageCall('put', Object.keys(keyOrEntries), true);\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.deleted.delete(key);\n this.staged.set(key, structuredClone(entryValue));\n }\n }\n\n async delete(key: string): Promise<boolean>;\n async delete(keys: string[]): Promise<number>;\n async delete(keyOrKeys: string | string[]): Promise<boolean | number> {\n if (typeof keyOrKeys === 'string') {\n this.storage.recordOperation('delete');\n this.storage.recordStorageCall('delete', [keyOrKeys], true);\n return this.deleteOne(keyOrKeys);\n }\n this.storage.recordOperation('deleteMany');\n this.storage.recordStorageCall('delete', keyOrKeys, true);\n let deleted = 0;\n for (const key of keyOrKeys) if (this.deleteOne(key)) deleted += 1;\n return deleted;\n }\n\n private deleteOne(key: string): boolean {\n this.storage.maybeFailMutation({ operation: 'delete', key });\n const existed = (!this.deleted.has(key) && this.staged.has(key)) || this.storage.data.has(key);\n this.staged.delete(key);\n this.deleted.add(key);\n return existed;\n }\n\n async list<T>(options: FakeListOptions = {}): Promise<Map<string, T>> {\n this.storage.recordOperation('list');\n const merged = new Map(this.storage.data);\n for (const key of this.deleted) merged.delete(key);\n for (const [key, value] of this.staged) merged.set(key, value);\n const keys = applyListOptions(Array.from(merged.keys()), options);\n this.storage.recordList(options, keys.length, true);\n return new Map(keys.map((k) => [k, merged.get(k) as T]));\n }\n\n async getAlarm(): Promise<number | null> {\n return this.stagedAlarm === undefined ? this.storage.alarmAt : this.stagedAlarm;\n }\n\n async setAlarm(at: number | Date): Promise<void> {\n this.stagedAlarm = typeof at === 'number' ? at : at.getTime();\n }\n\n async deleteAlarm(): Promise<void> {\n this.stagedAlarm = null;\n }\n\n commit(): void {\n for (const key of this.deleted) this.storage.data.delete(key);\n for (const [key, value] of this.staged) this.storage.data.set(key, value);\n if (this.stagedAlarm !== undefined) this.storage.alarmAt = this.stagedAlarm;\n }\n}\n\ntype CellClass = new (\n ctx: unknown,\n env: unknown,\n) => {\n alarm?(info?: { retryCount?: number }): Promise<void>;\n};\n\ninterface CellSlot {\n instance: InstanceType<CellClass>;\n storage: FakeStorage;\n pendingWaits: Promise<unknown>[];\n alarmRetryCount: number;\n alarmAbandoned: boolean;\n}\n\n/** celld abandons an alarm after six counted handler failures. */\nconst ALARM_FAILURE_LIMIT = 6;\n\n/**\n * A fake fleet: one namespace per binding, each lazily instantiating the real\n * cell class with a fake ctx. `fireDueAlarms()` drives alarm dispatch\n * deterministically (alarms never fire on their own), reproducing celld's\n * retry ladder including the six-failure abandonment.\n */\nexport class FakeFleet {\n private cells = new Map<string, CellSlot>();\n now: number;\n\n constructor(\n private classes: Record<string, CellClass>,\n private cellEnv: Record<string, unknown> = {},\n startTime = Date.now(),\n ) {\n this.now = startTime;\n }\n\n namespace(bindingKey: string) {\n return {\n idFromName(name: string) {\n return { toString: () => name };\n },\n get: (id: { toString(): string }) => this.cell(bindingKey, id.toString()).instance,\n };\n }\n\n private instantiate(\n bindingKey: string,\n name: string,\n storage: FakeStorage,\n pendingWaits: Promise<unknown>[],\n ): InstanceType<CellClass> {\n const CellCtor = this.classes[bindingKey];\n if (!CellCtor) throw new Error(`no cell class registered for binding: ${bindingKey}`);\n const ctx = {\n storage,\n id: { toString: () => name, name },\n waitUntil(promise: Promise<unknown>) {\n pendingWaits.push(promise);\n },\n async blockConcurrencyWhile<T>(cb: () => Promise<T>): Promise<T> {\n return cb();\n },\n };\n return new CellCtor(ctx, this.cellEnv);\n }\n\n cell(bindingKey: string, name: string): CellSlot {\n const key = `${bindingKey}\\0${name}`;\n let slot = this.cells.get(key);\n if (!slot) {\n const storage = new FakeStorage(() => this.now);\n const pendingWaits: Promise<unknown>[] = [];\n slot = {\n instance: this.instantiate(bindingKey, name, storage, pendingWaits),\n storage,\n pendingWaits,\n alarmRetryCount: 0,\n alarmAbandoned: false,\n };\n this.cells.set(key, slot);\n }\n return slot;\n }\n\n /** Recreate one in-memory DO instance while preserving its durable storage. */\n restartCell(bindingKey: string, name: string): InstanceType<CellClass> {\n const slot = this.cell(bindingKey, name);\n slot.instance = this.instantiate(bindingKey, name, slot.storage, slot.pendingWaits);\n return slot.instance;\n }\n\n advance(ms: number): void {\n this.now += ms;\n }\n\n /**\n * Dispatch every alarm due at the virtual current time, awaiting waitUntil\n * work. A throwing handler re-arms per celld's ladder (2s doubling) and\n * abandons the alarm after the sixth counted failure — the cell keeps its\n * state but has no timer.\n */\n async fireDueAlarms(): Promise<void> {\n for (const slot of this.cells.values()) {\n const due = slot.storage.alarmAt;\n if (due === null || due > this.now || slot.alarmAbandoned) continue;\n if (typeof slot.instance.alarm !== 'function') continue;\n\n slot.storage.alarmAt = null;\n try {\n await slot.instance.alarm({ retryCount: slot.alarmRetryCount });\n slot.alarmRetryCount = 0;\n } catch {\n slot.alarmRetryCount += 1;\n if (slot.alarmRetryCount >= ALARM_FAILURE_LIMIT) {\n slot.alarmAbandoned = true;\n } else if (slot.storage.alarmAt === null) {\n slot.storage.alarmAt = this.now + 2000 * 2 ** (slot.alarmRetryCount - 1);\n }\n }\n await this.drainWaits(slot);\n }\n }\n\n private async drainWaits(slot: CellSlot): Promise<void> {\n while (slot.pendingWaits.length > 0) {\n const batch = slot.pendingWaits.splice(0);\n await Promise.allSettled(batch);\n }\n }\n\n /** Await all waitUntil work across the fleet (delivery fetches, etc.). */\n async settle(): Promise<void> {\n for (const slot of this.cells.values()) {\n await this.drainWaits(slot);\n }\n }\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 type RunFenceStub,\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_RUN_FENCES: 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 runFences: env.WORKFLOW_RUN_FENCES as CellNamespaceLike<RunFenceStub>,\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 '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 ]),\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(args[0] as WorkflowRun, args[1] as string);\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","/**\n * Durable Object base class — Node variant.\n *\n * The cell classes extend `DurableObject` so celld's JS RPC works on their\n * stubs. This module is what Node builds (tests, the `./testing` in-process\n * fleet) resolve; the worker build swaps it for do-base-workerd.ts, which\n * re-exports the real `cloudflare:workers` base (see tsdown.config.ts).\n * Behaviorally identical at this layer: the base only assigns ctx/env.\n */\nexport class DurableObject<TEnv = unknown> {\n constructor(\n readonly ctx: DurableObjectState,\n readonly env: TEnv,\n ) {}\n}\n","import type { Hook } from '@workflow/world';\nimport type { HookTokenOwner } from '../../config.js';\nimport { runFenceCellName, type CellNamespaceLike, type RunFenceStub } from '../../indexes.js';\nimport { parse } from '../../vendor/shared/index.js';\n\nexport interface HookIndexEnv {\n WORKFLOW_RUN_FENCES?: CellNamespaceLike<RunFenceStub>;\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\n/** Compact shard-local fence for every hook owned by one terminal or expired run. */\nexport function shardRunFenceKey(runId: string): string {\n return `runfence:${encodeURIComponent(runId)}`;\n}\n\nexport async function runIsActive(env: HookIndexEnv, runId: string): Promise<boolean> {\n const namespace = env.WORKFLOW_RUN_FENCES;\n if (!namespace) throw new Error('world-celld hook index missing WORKFLOW_RUN_FENCES binding');\n const target = namespace.get(namespace.idFromName(runFenceCellName(runId)));\n return (await target.getStatus()) === 'active';\n}\n","import type { HookTokenOwner } from '../../config.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n indexKey,\n ownerFromSerializedHook,\n runIsActive,\n sameOwner,\n shardRunFenceKey,\n type HookIndexEnv,\n} from './hook-index-shared.js';\n\nconst MAX_RELEASE_BATCH = 64;\n\ninterface HookClaim {\n owner: HookTokenOwner;\n claimId: string;\n reservedAt: number;\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\n/** Hook-ID ownership and lookup shard; every hook ID has one transaction domain. */\nexport class HookIdDO extends DurableObject<HookIndexEnv> {\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 const existing = values.get(claim) as HookClaim | undefined;\n if (existing !== undefined && !sameOwner(existing.owner, owner)) {\n return { claimed: false, holder: existing.owner };\n }\n if (existing === undefined || existing.claimId !== proposedClaimId) {\n await txn.put(claim, {\n owner,\n claimId: proposedClaimId,\n reservedAt: Date.now(),\n } satisfies HookClaim);\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 }], Date.now(), true);\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 runFence = shardRunFenceKey(owner.runId);\n const values = await txn.get<string | HookClaim | number>([record, claim, runFence]);\n if (values.has(runFence)) {\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (existingClaim && sameOwner(existingClaim.owner, owner)) await txn.delete(claim);\n return { stored: false };\n }\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 (\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);\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);\n }\n });\n }\n\n async releaseBatch(\n hooks: Array<{ hookId: string; owner: HookTokenOwner }>,\n fencedAt: number,\n runFenced: boolean,\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 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 }\n }\n if (runFenced) {\n await txn.put(shardRunFenceKey(hooks[0].owner.runId), fencedAt);\n }\n return { deleted: deletes.length === 0 ? 0 : await txn.delete(deletes) };\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 shardRunFenceKey,\n type HookIndexEnv,\n} from './hook-index-shared.js';\n\ninterface HookClaim {\n owner: HookTokenOwner;\n claimId: string;\n reservedAt: number;\n}\n\nconst MAX_RELEASE_BATCH = 64;\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\n/** Token-ownership shard. A token hashes to exactly one shard and transaction domain. */\nexport class HookTokenDO extends DurableObject<HookIndexEnv> {\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 const existing = values.get(claim) as HookClaim | undefined;\n if (existing !== undefined && !sameOwner(existing.owner, owner)) {\n return { claimed: false, holder: existing.owner };\n }\n if (existing === undefined) {\n await txn.put(claim, {\n owner,\n claimId: proposedClaimId,\n reservedAt: Date.now(),\n } satisfies HookClaim);\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 }], Date.now(), true);\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 runFence = shardRunFenceKey(owner.runId);\n const values = await txn.get<string | HookClaim | number>([record, claim, runFence]);\n if (values.has(runFence)) {\n const existingClaim = values.get(claim) as HookClaim | undefined;\n if (existingClaim && sameOwner(existingClaim.owner, owner)) await txn.delete(claim);\n return { stored: false };\n }\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 (\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);\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);\n }\n });\n }\n\n async releaseBatch(\n hooks: Array<{ token: string; owner: HookTokenOwner }>,\n fencedAt: number,\n runFenced: boolean,\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 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 }\n }\n if (runFenced) {\n await txn.put(shardRunFenceKey(hooks[0].owner.runId), fencedAt);\n }\n return { deleted: deletes.length === 0 ? 0 : await txn.delete(deletes) };\n });\n }\n}\n","import { DurableObject } from '../do-base.js';\nimport type { EnqueueOutcome, EnqueueRequest } from '../../queue.js';\nimport type { ExpireQueueRunResult } from '../../retention.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> run fence preventing delayed enqueue\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}\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/** Grace period past the delivery timeout before a claim counts as lost. */\nconst INFLIGHT_GRACE_MS = 30_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:';\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 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}\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 async enqueue(request: EnqueueRequest): Promise<EnqueueOutcome> {\n this.#maxInflight();\n const storage = this.ctx.storage;\n const now = this.#now();\n\n const outcome = await storage.transaction<EnqueueOutcome>(async (txn) => {\n if (request.runId && (await txn.get(expiredRunKey(request.runId))) !== undefined) {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${request.runId}\" has expired`,\n };\n }\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 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) throw failure;\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. 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 // 2. 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.#intVar('QUEUE_DELIVERY_TIMEOUT_MS', DEFAULT_DELIVERY_TIMEOUT_MS);\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 + 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.#intVar('QUEUE_DELIVERY_TIMEOUT_MS', DEFAULT_DELIVERY_TIMEOUT_MS);\n const callbackSecret = (this.env as QueueCellEnv)?.WORKFLOW_CALLBACK_SECRET;\n const url = `${row.targetBaseUrl.replace(/\\/$/, '')}/.well-known/workflow/v1/${row.pathname}`;\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 await storage.transaction(async (txn) => {\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 if (row.runId && (await txn.get(expiredRunKey(row.runId))) !== undefined) {\n await txn.delete(`msg:${row.messageId}`);\n 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) {\n await txn.delete(dedupKey);\n }\n }\n await this.#scheduleNextAlarm(txn, now);\n return;\n }\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 } 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 #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 await storage.transaction(async (txn) => {\n if (!(await txn.delete(claimKey))) return;\n if (row.runId && (await txn.get(expiredRunKey(row.runId))) !== undefined) {\n await txn.delete(`msg:${row.messageId}`);\n 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) {\n await txn.delete(dedupKey);\n }\n }\n await this.#scheduleNextAlarm(txn, now);\n return;\n }\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 }\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 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 outcome = await storage.transaction<{ ok: boolean }>(async (txn) => {\n const dlq = await txn.list<DeadLetterRow>({ prefix: 'dlq:' });\n for (const [key, dead] of dlq) {\n if (dead.messageId !== messageId) continue;\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) {\n await txn.delete(dedupKey);\n }\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(key);\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 return { ok: false };\n });\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 await txn.put<ExpiredRunFence>(expiredRunKey(runId), { expiredAt, deleted: count });\n await this.#scheduleNextAlarm(txn, this.#now());\n return { deleted: count, done: references.size <= limit };\n });\n }\n}\n","import type { ExpireRunIndexesResult } from '../../retention.js';\nimport type { IndexListOptions, IndexListPage } from '../../indexes.js';\nimport { DurableObject } from '../do-base.js';\n\nconst MAX_INDEX_LIST_SIZE = 1001;\n\n/** One of a fixed set of run-catalog shards, routed by the stable run ID hash. */\nexport class RunCatalogDO extends DurableObject {\n async upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\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(`expired:${runId}`)) !== undefined) return { stored: false };\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 await txn.put(`expired:${runId}`, expiredAt);\n return { deleted: await txn.delete(keys) };\n });\n }\n}\n","import type { RunFenceStatus } from '../../indexes.js';\nimport { DurableObject } from '../do-base.js';\n\ninterface StoredRunFence {\n status: Exclude<RunFenceStatus, 'active'>;\n at: number;\n}\n\n/** Per-run lifecycle fence used by hook shards without a global lookup cell. */\nexport class RunFenceDO extends DurableObject {\n async getStatus(): Promise<RunFenceStatus> {\n return (await this.ctx.storage.get<StoredRunFence>('fence'))?.status ?? 'active';\n }\n\n async fenceTerminal(at: number): Promise<RunFenceStatus> {\n return await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<StoredRunFence>('fence');\n if (current) return current.status;\n await txn.put('fence', { status: 'terminal', at } satisfies StoredRunFence);\n return 'terminal';\n });\n }\n\n async fenceExpired(at: number): Promise<RunFenceStatus> {\n return await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<StoredRunFence>('fence');\n if (current?.status === 'expired') return current.status;\n await txn.put('fence', { status: 'expired', at } satisfies StoredRunFence);\n return 'expired';\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}\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}\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 /** Install a fence that prevents delayed hook finalization after terminal state. */\n terminal: boolean;\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 ExpireQueueRunResult {\n /** Cumulative messages removed for this run in this queue shard. */\n deleted: number;\n done: 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 return {\n version: 1,\n runId: record.runId,\n terminalStatus: record.terminalStatus,\n completedAt: record.completedAt,\n expiredAt: record.dueAt,\n tombstonedAt: now,\n };\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 RunFenceStub,\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 CLEANUP_RECORD_KEY,\n type CleanupRecord,\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 RunTombstone,\n type ScheduleCleanupRequest,\n TERMINAL_CLEANUP_KEY,\n type TerminalCleanupRecord,\n TOMBSTONE_KEY,\n workflowRunIndexKey,\n} from '../../retention.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}\n\ninterface WorkflowRunDOEnv {\n WORKFLOW_RUN_CATALOG?: CellNamespace<RunCatalogShardStub>;\n WORKFLOW_RUN_FENCES?: CellNamespace<RunFenceStub>;\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 QUEUE_SHARDS_PER_CLEANUP_PAGE = 8;\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}\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 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 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 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 return (await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY)) ?? 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 runFences: this.namespace<RunFenceStub>('WORKFLOW_RUN_FENCES'),\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 terminal: true,\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 terminal: true,\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 let progress =\n (await this.ctx.storage.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n let remainingShards = QUEUE_SHARDS_PER_CLEANUP_PAGE;\n let expectedGeneration = cleanup.generation;\n\n while (progress.queueShard < cleanup.queueShards && remainingShards-- > 0) {\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 const reconciled = await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'queues') return null;\n if (current.generation !== expectedGeneration) {\n return { stale: true as const };\n }\n const persisted =\n (await txn.get<CleanupProgress>(CLEANUP_PROGRESS_KEY)) ??\n ({ queueShard: 0, queueShardDeleted: 0 } satisfies CleanupProgress);\n if (persisted.queueShard !== requestedShard) {\n return { stale: true as const };\n }\n if (result.deleted < persisted.queueShardDeleted) {\n return { stale: true as const };\n }\n const next: CleanupProgress = result.done\n ? { queueShard: persisted.queueShard + 1, queueShardDeleted: 0 }\n : { ...persisted, queueShardDeleted: result.deleted };\n const delta = result.deleted - persisted.queueShardDeleted;\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 return {\n stale: false as const,\n progress: next,\n generation: current.generation + 1,\n applied:\n result.done ||\n next.queueShard !== persisted.queueShard ||\n next.queueShardDeleted !== persisted.queueShardDeleted,\n };\n });\n if (!reconciled) return;\n if (reconciled.stale) return;\n progress = reconciled.progress;\n expectedGeneration = reconciled.generation;\n if (!reconciled.applied && progress.queueShard === requestedShard) break;\n if (!result.done && progress.queueShard === requestedShard) break;\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') 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) {\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 await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n phase: 'tombstoned',\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n tombstonedAt: now,\n });\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 * Boots the real worker router over real cell classes (on FakeFleet state)\n * behind a node:http server — the full wire protocol without a celld binary.\n */\nimport http from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { createRouter, type WorkerEnv } from '../worker/router.js';\nimport { HookIdDO } from '../worker/durable-objects/HookIdDO.js';\nimport { HookTokenDO } from '../worker/durable-objects/HookTokenDO.js';\nimport { QueueDO } from '../worker/durable-objects/QueueDO.js';\nimport { RunCatalogDO } from '../worker/durable-objects/RunCatalogDO.js';\nimport { RunFenceDO } from '../worker/durable-objects/RunFenceDO.js';\nimport { StreamDO } from '../worker/durable-objects/StreamDO.js';\nimport { WorkflowRunDO } from '../worker/durable-objects/WorkflowRunDO.js';\nimport { FakeFleet } from './fake-cell.js';\n\nexport interface Harness {\n url: string;\n fleet: FakeFleet;\n close(): Promise<void>;\n}\n\nexport interface HarnessOptions {\n secret?: string;\n /** Use FakeFleet's manually advanced clock instead of wall-clock time. */\n virtualClock?: boolean;\n /** Additional cell classes by binding key (e.g. { queue: QueueDO }). */\n extraClasses?: Record<string, new (ctx: unknown, env: unknown) => object>;\n /** env passed to cell constructors (celld `vars`). */\n cellEnv?: Record<string, unknown>;\n}\n\nexport async function startHarness(options: HarnessOptions = {}): Promise<Harness> {\n const cellEnv = { ...options.cellEnv };\n const fleet = new FakeFleet(\n {\n runs: WorkflowRunDO as never,\n streams: StreamDO as never,\n 'run-catalog': RunCatalogDO as never,\n 'run-fences': RunFenceDO as never,\n 'hook-tokens': HookTokenDO as never,\n 'hook-ids': HookIdDO as never,\n queue: QueueDO as never,\n ...options.extraClasses,\n },\n cellEnv,\n );\n cellEnv.clock ??= options.virtualClock ? () => fleet.now : () => Date.now();\n\n // Durable Object constructors receive both vars and sibling bindings in a\n // real celld deployment. Populate the same environment for cross-cell\n // retention cleanup in the in-process fleet.\n Object.assign(cellEnv, {\n WORKFLOW_DB: fleet.namespace('runs'),\n WORKFLOW_STREAMS: fleet.namespace('streams'),\n WORKFLOW_RUN_CATALOG: fleet.namespace('run-catalog'),\n WORKFLOW_RUN_FENCES: fleet.namespace('run-fences'),\n WORKFLOW_HOOK_TOKENS: fleet.namespace('hook-tokens'),\n WORKFLOW_HOOK_IDS: fleet.namespace('hook-ids'),\n WORKFLOW_QUEUE: fleet.namespace('queue'),\n });\n\n const env: WorkerEnv = {\n WORKFLOW_DB: fleet.namespace('runs'),\n WORKFLOW_STREAMS: fleet.namespace('streams'),\n WORKFLOW_RUN_CATALOG: fleet.namespace('run-catalog'),\n WORKFLOW_RUN_FENCES: fleet.namespace('run-fences'),\n WORKFLOW_HOOK_TOKENS: fleet.namespace('hook-tokens'),\n WORKFLOW_HOOK_IDS: fleet.namespace('hook-ids'),\n WORKFLOW_QUEUE: fleet.namespace('queue'),\n WORLD_SECRET: options.secret,\n };\n\n const router = createRouter(env);\n\n const server = http.createServer(async (req, res) => {\n const requestAbort = new AbortController();\n const abortRequest = () => {\n if (!requestAbort.signal.aborted) {\n requestAbort.abort(new DOMException('HTTP client disconnected', 'AbortError'));\n }\n };\n const abortOnPrematureClose = () => {\n if (!res.writableEnded) abortRequest();\n };\n req.once('aborted', abortRequest);\n res.once('close', abortOnPrematureClose);\n try {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks);\n const request = new Request(`http://127.0.0.1${req.url ?? '/'}`, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: req.method === 'GET' || req.method === 'HEAD' || body.length === 0 ? null : body,\n signal: requestAbort.signal,\n });\n const response = await router(request);\n if (requestAbort.signal.aborted || res.destroyed) return;\n res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n res.end(Buffer.from(await response.arrayBuffer()));\n } catch (error) {\n if (requestAbort.signal.aborted || res.destroyed) return;\n res.writeHead(500, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: { name: 'HarnessError', message: String(error) } }));\n } finally {\n req.off('aborted', abortRequest);\n res.off('close', abortOnPrematureClose);\n }\n });\n\n await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));\n const { port } = server.address() as AddressInfo;\n\n return {\n url: `http://127.0.0.1:${port}`,\n fleet,\n close: () =>\n new Promise<void>((resolve, reject) => {\n // Test clients may retain an active keep-alive connection after their\n // assertions finish. Stop accepting connections first, then destroy\n // any that remain so teardown cannot wait indefinitely.\n server.close((err) => (err ? reject(err) : resolve()));\n server.closeAllConnections();\n }),\n };\n}\n","/**\n * In-process celld-world emulation for tests and local development: the real\n * worker router and the real cell classes over Map-backed fake state, behind\n * node:http — the full wire protocol without a celld fleet.\n *\n * `startDevFleet()` additionally drives cell alarms on real time, so QueueDO\n * deliveries flow — a drop-in local stand-in for a deployed fleet.\n */\nexport { FakeFleet, FakeStorage } from './fake-cell.js';\nexport { startHarness, type Harness, type HarnessOptions } from './http-harness.js';\n\nimport { startHarness, type Harness, type HarnessOptions } from './http-harness.js';\n\nexport interface DevFleet extends Harness {\n stop(): Promise<void>;\n}\n\n/** Alarm-pump interval for the dev fleet (real time). */\nconst PUMP_INTERVAL_MS = 25;\n\nexport async function startDevFleet(options: HarnessOptions = {}): Promise<DevFleet> {\n const harness = await startHarness(options);\n let pumping = false;\n const pump = setInterval(async () => {\n if (pumping) return;\n pumping = true;\n try {\n harness.fleet.now = Date.now();\n await harness.fleet.fireDueAlarms();\n } catch (error) {\n console.error('[world-celld dev fleet] alarm pump error:', error);\n } finally {\n pumping = false;\n }\n }, PUMP_INTERVAL_MS);\n // Don't hold the process open just for the pump.\n pump.unref?.();\n\n return {\n ...harness,\n async stop() {\n clearInterval(pump);\n await harness.close();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testing.js","names":["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/testing/fake-cell.ts","../src/worker/auth.ts","../src/worker/router.ts","../src/worker/do-base.ts","../src/worker/durable-objects/hook-index-shared.ts","../src/worker/durable-objects/HookIdDO.ts","../src/worker/durable-objects/HookTokenDO.ts","../src/worker/durable-objects/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/testing/http-harness.ts","../src/testing/index.ts"],"sourcesContent":["/**\n * In-process fake celld fleet (the eve-ambient celld-harness pattern):\n * instantiate the REAL cell classes against Map-backed fake DO state, with a\n * virtual-clock alarm dispatcher. Only the runtime plumbing is faked — every\n * storage/alarm/lifecycle behavior under test is the real class's code.\n */\n\nexport interface FakeListOptions {\n prefix?: string;\n start?: string;\n startAfter?: string;\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\nexport interface FakeStorageMutation {\n operation: 'put' | 'delete';\n key: string;\n value?: unknown;\n}\n\nexport interface FakeStorageOperationCounts {\n get: number;\n getMany: number;\n list: number;\n put: number;\n putMany: number;\n delete: number;\n deleteMany: number;\n transaction: number;\n}\n\nexport interface FakeStorageListCall {\n options: FakeListOptions;\n resultSize: number;\n transactional: boolean;\n}\n\nexport interface FakeStorageOperationCall {\n operation: 'get' | 'put' | 'delete';\n keys: string[];\n transactional: boolean;\n synchronous: boolean;\n}\n\nfunction applyListOptions(keys: string[], options: FakeListOptions): string[] {\n let result = keys.toSorted();\n if (options.prefix !== undefined) {\n const prefix = options.prefix;\n result = result.filter((k) => k.startsWith(prefix));\n }\n if (options.start !== undefined) {\n const bound = options.start;\n result = result.filter((k) => k >= bound);\n }\n if (options.startAfter !== undefined) {\n const bound = options.startAfter;\n result = result.filter((k) => k > bound);\n }\n if (options.end !== undefined) {\n const bound = options.end;\n result = result.filter((k) => k < bound);\n }\n if (options.reverse) {\n result = result.toReversed();\n }\n if (options.limit !== undefined) {\n result = result.slice(0, options.limit);\n }\n return result;\n}\n\n/**\n * Fake DurableObjectStorage over a Map. Transactions stage writes and commit\n * on success (discard on throw), with reads seeing staged state — the\n * semantics apply-event.ts relies on.\n */\nexport class FakeStorage {\n data = new Map<string, unknown>();\n alarmAt: number | null = null;\n readonly getManyCalls: string[][] = [];\n readonly operationCounts: FakeStorageOperationCounts = {\n get: 0,\n getMany: 0,\n list: 0,\n put: 0,\n putMany: 0,\n delete: 0,\n deleteMany: 0,\n transaction: 0,\n };\n private transactionTail: Promise<void> = Promise.resolve();\n private transactionDelayMs = 0;\n /** Deterministic query-shape instrumentation for storage scaling tests. */\n listCalls: FakeStorageListCall[] = [];\n operationCalls: FakeStorageOperationCall[] = [];\n private mutationFailure?: {\n predicate: (mutation: FakeStorageMutation) => boolean;\n error: Error;\n };\n\n constructor(private clock: () => number = () => Date.now()) {}\n\n async get<T>(key: string): Promise<T | undefined>;\n async get<T>(keys: string[]): Promise<Map<string, T>>;\n async get<T>(keyOrKeys: string | string[]): Promise<T | undefined | Map<string, T>> {\n if (Array.isArray(keyOrKeys)) {\n this.operationCounts.getMany += 1;\n this.getManyCalls.push([...keyOrKeys]);\n this.recordStorageCall('get', keyOrKeys, false);\n return new Map(\n keyOrKeys.filter((key) => this.data.has(key)).map((key) => [key, this.data.get(key) as T]),\n );\n }\n this.operationCounts.get += 1;\n this.recordStorageCall('get', [keyOrKeys], false);\n return this.data.get(keyOrKeys) as T | undefined;\n }\n\n async put<T>(key: string, value: T): Promise<void>;\n async put<T>(entries: Record<string, T>): Promise<void>;\n async put<T>(keyOrEntries: string | Record<string, T>, value?: T): Promise<void> {\n if (typeof keyOrEntries === 'string') {\n this.operationCounts.put += 1;\n this.maybeFailMutation({ operation: 'put', key: keyOrEntries, value });\n this.recordStorageCall('put', [keyOrEntries], false);\n this.data.set(keyOrEntries, structuredClone(value));\n return;\n }\n this.operationCounts.putMany += 1;\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.maybeFailMutation({ operation: 'put', key, value: entryValue });\n }\n this.recordStorageCall('put', Object.keys(keyOrEntries), false);\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.data.set(key, structuredClone(entryValue));\n }\n }\n\n async delete(key: string): Promise<boolean>;\n async delete(keys: string[]): Promise<number>;\n async delete(keyOrKeys: string | string[]): Promise<boolean | number> {\n if (typeof keyOrKeys === 'string') {\n this.operationCounts.delete += 1;\n this.maybeFailMutation({ operation: 'delete', key: keyOrKeys });\n this.recordStorageCall('delete', [keyOrKeys], false);\n return this.data.delete(keyOrKeys);\n }\n this.operationCounts.deleteMany += 1;\n for (const key of keyOrKeys) this.maybeFailMutation({ operation: 'delete', key });\n this.recordStorageCall('delete', keyOrKeys, false);\n let deleted = 0;\n for (const key of keyOrKeys) if (this.data.delete(key)) deleted += 1;\n return deleted;\n }\n\n async deleteAll(): Promise<void> {\n this.data.clear();\n }\n\n async list<T>(options: FakeListOptions = {}): Promise<Map<string, T>> {\n this.operationCounts.list += 1;\n const keys = applyListOptions(Array.from(this.data.keys()), options);\n this.recordList(options, keys.length, false);\n return new Map(keys.map((k) => [k, this.data.get(k) as T]));\n }\n\n async transaction<T>(cb: (txn: FakeTransaction) => Promise<T>): Promise<T> {\n this.operationCounts.transaction += 1;\n let release!: () => void;\n const previous = this.transactionTail;\n this.transactionTail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n if (this.transactionDelayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, this.transactionDelayMs));\n }\n const txn = new FakeTransaction(this);\n const result = await cb(txn);\n txn.commit();\n return result;\n } finally {\n release();\n }\n }\n\n /** Add deterministic per-transaction work for contention benchmarks. */\n setTransactionDelay(ms: number): void {\n if (!Number.isFinite(ms) || ms < 0) throw new Error('transaction delay must be non-negative');\n this.transactionDelayMs = ms;\n }\n\n async getAlarm(): Promise<number | null> {\n return this.alarmAt;\n }\n\n async setAlarm(at: number | Date): Promise<void> {\n this.alarmAt = typeof at === 'number' ? at : at.getTime();\n }\n\n async deleteAlarm(): Promise<void> {\n this.alarmAt = null;\n }\n\n now(): number {\n return this.clock();\n }\n\n resetOperationCounts(): void {\n for (const key of Object.keys(this.operationCounts) as (keyof FakeStorageOperationCounts)[]) {\n this.operationCounts[key] = 0;\n }\n this.getManyCalls.length = 0;\n this.operationCalls.length = 0;\n }\n\n /** @internal Used by FakeTransaction to count the same platform operations. */\n recordOperation(operation: keyof FakeStorageOperationCounts): void {\n this.operationCounts[operation] += 1;\n }\n\n /** @internal Shared with FakeTransaction for deterministic key tracing. */\n recordStorageCall(\n operation: FakeStorageOperationCall['operation'],\n keys: string[],\n transactional: boolean,\n ): void {\n this.operationCalls.push({ operation, keys: [...keys], transactional, synchronous: false });\n }\n\n /** Inject one matching write failure, including writes inside transactions. */\n failNextMutation(\n predicate: (mutation: FakeStorageMutation) => boolean,\n error = new Error('injected fake storage mutation failure'),\n ): void {\n this.mutationFailure = { predicate, error };\n }\n\n /** @internal Shared with FakeTransaction so failure injection survives a transaction fix. */\n maybeFailMutation(mutation: FakeStorageMutation): void {\n if (!this.mutationFailure?.predicate(mutation)) return;\n const { error } = this.mutationFailure;\n this.mutationFailure = undefined;\n throw error;\n }\n\n /** @internal Shared with FakeTransaction for deterministic query tracing. */\n recordList(options: FakeListOptions, resultSize: number, transactional: boolean): void {\n this.listCalls.push({ options: { ...options }, resultSize, transactional });\n }\n}\n\nclass FakeTransaction {\n private staged = new Map<string, unknown>();\n private deleted = new Set<string>();\n private stagedAlarm: number | null | undefined;\n\n constructor(private storage: FakeStorage) {}\n\n async get<T>(key: string): Promise<T | undefined>;\n async get<T>(keys: string[]): Promise<Map<string, T>>;\n async get<T>(keyOrKeys: string | string[]): Promise<T | undefined | Map<string, T>> {\n if (Array.isArray(keyOrKeys)) {\n this.storage.recordOperation('getMany');\n this.storage.getManyCalls.push([...keyOrKeys]);\n this.storage.recordStorageCall('get', keyOrKeys, true);\n const result = new Map<string, T>();\n for (const key of keyOrKeys) {\n if (this.deleted.has(key)) continue;\n if (this.staged.has(key)) result.set(key, this.staged.get(key) as T);\n else if (this.storage.data.has(key)) result.set(key, this.storage.data.get(key) as T);\n }\n return result;\n }\n this.storage.recordOperation('get');\n const key = keyOrKeys;\n this.storage.recordStorageCall('get', [key], true);\n if (this.deleted.has(key)) return undefined;\n if (this.staged.has(key)) return this.staged.get(key) as T;\n return this.storage.data.get(key) as T | undefined;\n }\n\n async put<T>(key: string, value: T): Promise<void>;\n async put<T>(entries: Record<string, T>): Promise<void>;\n async put<T>(keyOrEntries: string | Record<string, T>, value?: T): Promise<void> {\n if (typeof keyOrEntries === 'string') {\n this.storage.recordOperation('put');\n this.storage.maybeFailMutation({ operation: 'put', key: keyOrEntries, value });\n this.storage.recordStorageCall('put', [keyOrEntries], true);\n this.deleted.delete(keyOrEntries);\n this.staged.set(keyOrEntries, structuredClone(value));\n return;\n }\n this.storage.recordOperation('putMany');\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.storage.maybeFailMutation({ operation: 'put', key, value: entryValue });\n }\n this.storage.recordStorageCall('put', Object.keys(keyOrEntries), true);\n for (const [key, entryValue] of Object.entries(keyOrEntries)) {\n this.deleted.delete(key);\n this.staged.set(key, structuredClone(entryValue));\n }\n }\n\n async delete(key: string): Promise<boolean>;\n async delete(keys: string[]): Promise<number>;\n async delete(keyOrKeys: string | string[]): Promise<boolean | number> {\n if (typeof keyOrKeys === 'string') {\n this.storage.recordOperation('delete');\n this.storage.recordStorageCall('delete', [keyOrKeys], true);\n return this.deleteOne(keyOrKeys);\n }\n this.storage.recordOperation('deleteMany');\n this.storage.recordStorageCall('delete', keyOrKeys, true);\n let deleted = 0;\n for (const key of keyOrKeys) if (this.deleteOne(key)) deleted += 1;\n return deleted;\n }\n\n private deleteOne(key: string): boolean {\n this.storage.maybeFailMutation({ operation: 'delete', key });\n const existed = (!this.deleted.has(key) && this.staged.has(key)) || this.storage.data.has(key);\n this.staged.delete(key);\n this.deleted.add(key);\n return existed;\n }\n\n async list<T>(options: FakeListOptions = {}): Promise<Map<string, T>> {\n this.storage.recordOperation('list');\n const merged = new Map(this.storage.data);\n for (const key of this.deleted) merged.delete(key);\n for (const [key, value] of this.staged) merged.set(key, value);\n const keys = applyListOptions(Array.from(merged.keys()), options);\n this.storage.recordList(options, keys.length, true);\n return new Map(keys.map((k) => [k, merged.get(k) as T]));\n }\n\n async getAlarm(): Promise<number | null> {\n return this.stagedAlarm === undefined ? this.storage.alarmAt : this.stagedAlarm;\n }\n\n async setAlarm(at: number | Date): Promise<void> {\n this.stagedAlarm = typeof at === 'number' ? at : at.getTime();\n }\n\n async deleteAlarm(): Promise<void> {\n this.stagedAlarm = null;\n }\n\n commit(): void {\n for (const key of this.deleted) this.storage.data.delete(key);\n for (const [key, value] of this.staged) this.storage.data.set(key, value);\n if (this.stagedAlarm !== undefined) this.storage.alarmAt = this.stagedAlarm;\n }\n}\n\ntype CellClass = new (\n ctx: unknown,\n env: unknown,\n) => {\n alarm?(info?: { retryCount?: number }): Promise<void>;\n};\n\ninterface CellSlot {\n instance: InstanceType<CellClass>;\n storage: FakeStorage;\n pendingWaits: Promise<unknown>[];\n alarmRetryCount: number;\n alarmAbandoned: boolean;\n}\n\n/** celld abandons an alarm after six counted handler failures. */\nconst ALARM_FAILURE_LIMIT = 6;\n\n/**\n * A fake fleet: one namespace per binding, each lazily instantiating the real\n * cell class with a fake ctx. `fireDueAlarms()` drives alarm dispatch\n * deterministically (alarms never fire on their own), reproducing celld's\n * retry ladder including the six-failure abandonment.\n */\nexport class FakeFleet {\n private cells = new Map<string, CellSlot>();\n now: number;\n\n constructor(\n private classes: Record<string, CellClass>,\n private cellEnv: Record<string, unknown> = {},\n startTime = Date.now(),\n ) {\n this.now = startTime;\n }\n\n namespace(bindingKey: string) {\n return {\n idFromName(name: string) {\n return { toString: () => name };\n },\n get: (id: { toString(): string }) => this.cell(bindingKey, id.toString()).instance,\n };\n }\n\n private instantiate(\n bindingKey: string,\n name: string,\n storage: FakeStorage,\n pendingWaits: Promise<unknown>[],\n ): InstanceType<CellClass> {\n const CellCtor = this.classes[bindingKey];\n if (!CellCtor) throw new Error(`no cell class registered for binding: ${bindingKey}`);\n const ctx = {\n storage,\n id: { toString: () => name, name },\n waitUntil(promise: Promise<unknown>) {\n pendingWaits.push(promise);\n },\n async blockConcurrencyWhile<T>(cb: () => Promise<T>): Promise<T> {\n return cb();\n },\n };\n return new CellCtor(ctx, this.cellEnv);\n }\n\n cell(bindingKey: string, name: string): CellSlot {\n const key = `${bindingKey}\\0${name}`;\n let slot = this.cells.get(key);\n if (!slot) {\n const storage = new FakeStorage(() => this.now);\n const pendingWaits: Promise<unknown>[] = [];\n slot = {\n instance: this.instantiate(bindingKey, name, storage, pendingWaits),\n storage,\n pendingWaits,\n alarmRetryCount: 0,\n alarmAbandoned: false,\n };\n this.cells.set(key, slot);\n }\n return slot;\n }\n\n /** Recreate one in-memory DO instance while preserving its durable storage. */\n restartCell(bindingKey: string, name: string): InstanceType<CellClass> {\n const slot = this.cell(bindingKey, name);\n slot.instance = this.instantiate(bindingKey, name, slot.storage, slot.pendingWaits);\n return slot.instance;\n }\n\n advance(ms: number): void {\n this.now += ms;\n }\n\n /**\n * Dispatch every alarm due at the virtual current time, awaiting waitUntil\n * work. A throwing handler re-arms per celld's ladder (2s doubling) and\n * abandons the alarm after the sixth counted failure — the cell keeps its\n * state but has no timer.\n */\n async fireDueAlarms(): Promise<void> {\n for (const slot of this.cells.values()) {\n const due = slot.storage.alarmAt;\n if (due === null || due > this.now || slot.alarmAbandoned) continue;\n if (typeof slot.instance.alarm !== 'function') continue;\n\n slot.storage.alarmAt = null;\n try {\n await slot.instance.alarm({ retryCount: slot.alarmRetryCount });\n slot.alarmRetryCount = 0;\n } catch {\n slot.alarmRetryCount += 1;\n if (slot.alarmRetryCount >= ALARM_FAILURE_LIMIT) {\n slot.alarmAbandoned = true;\n } else if (slot.storage.alarmAt === null) {\n slot.storage.alarmAt = this.now + 2000 * 2 ** (slot.alarmRetryCount - 1);\n }\n }\n await this.drainWaits(slot);\n }\n }\n\n private async drainWaits(slot: CellSlot): Promise<void> {\n while (slot.pendingWaits.length > 0) {\n const batch = slot.pendingWaits.splice(0);\n await Promise.allSettled(batch);\n }\n }\n\n /** Await all waitUntil work across the fleet (delivery fetches, etc.). */\n async settle(): Promise<void> {\n for (const slot of this.cells.values()) {\n await this.drainWaits(slot);\n }\n }\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","/**\n * Durable Object base class — Node variant.\n *\n * The cell classes extend `DurableObject` so celld's JS RPC works on their\n * stubs. This module is what Node builds (tests, the `./testing` in-process\n * fleet) resolve; the worker build swaps it for do-base-workerd.ts, which\n * re-exports the real `cloudflare:workers` base (see tsdown.config.ts).\n * Behaviorally identical at this layer: the base only assigns ctx/env.\n */\nexport class DurableObject<TEnv = unknown> {\n constructor(\n readonly ctx: DurableObjectState,\n readonly env: TEnv,\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","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 * Boots the real worker router over real cell classes (on FakeFleet state)\n * behind a node:http server — the full wire protocol without a celld binary.\n */\nimport http from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { createRouter, type WorkerEnv } from '../worker/router.js';\nimport { HookIdDO } from '../worker/durable-objects/HookIdDO.js';\nimport { HookTokenDO } from '../worker/durable-objects/HookTokenDO.js';\nimport { QueueDO } from '../worker/durable-objects/QueueDO.js';\nimport { RunCatalogDO } from '../worker/durable-objects/RunCatalogDO.js';\nimport { StreamDO } from '../worker/durable-objects/StreamDO.js';\nimport { WorkflowRunDO } from '../worker/durable-objects/WorkflowRunDO.js';\nimport { FakeFleet } from './fake-cell.js';\n\nexport interface Harness {\n url: string;\n fleet: FakeFleet;\n close(): Promise<void>;\n}\n\nexport interface HarnessOptions {\n secret?: string;\n /** Use FakeFleet's manually advanced clock instead of wall-clock time. */\n virtualClock?: boolean;\n /** Additional cell classes by binding key (e.g. { queue: QueueDO }). */\n extraClasses?: Record<string, new (ctx: unknown, env: unknown) => object>;\n /** env passed to cell constructors (celld `vars`). */\n cellEnv?: Record<string, unknown>;\n}\n\nexport async function startHarness(options: HarnessOptions = {}): Promise<Harness> {\n const cellEnv = { ...options.cellEnv };\n const fleet = new FakeFleet(\n {\n runs: WorkflowRunDO as never,\n streams: StreamDO as never,\n 'run-catalog': RunCatalogDO as never,\n 'hook-tokens': HookTokenDO as never,\n 'hook-ids': HookIdDO as never,\n queue: QueueDO as never,\n ...options.extraClasses,\n },\n cellEnv,\n );\n cellEnv.clock ??= options.virtualClock ? () => fleet.now : () => Date.now();\n\n // Durable Object constructors receive both vars and sibling bindings in a\n // real celld deployment. Populate the same environment for cross-cell\n // retention cleanup in the in-process fleet.\n Object.assign(cellEnv, {\n WORKFLOW_DB: fleet.namespace('runs'),\n WORKFLOW_STREAMS: fleet.namespace('streams'),\n WORKFLOW_RUN_CATALOG: fleet.namespace('run-catalog'),\n WORKFLOW_HOOK_TOKENS: fleet.namespace('hook-tokens'),\n WORKFLOW_HOOK_IDS: fleet.namespace('hook-ids'),\n WORKFLOW_QUEUE: fleet.namespace('queue'),\n });\n\n const env: WorkerEnv = {\n WORKFLOW_DB: fleet.namespace('runs'),\n WORKFLOW_STREAMS: fleet.namespace('streams'),\n WORKFLOW_RUN_CATALOG: fleet.namespace('run-catalog'),\n WORKFLOW_HOOK_TOKENS: fleet.namespace('hook-tokens'),\n WORKFLOW_HOOK_IDS: fleet.namespace('hook-ids'),\n WORKFLOW_QUEUE: fleet.namespace('queue'),\n WORLD_SECRET: options.secret,\n };\n\n const router = createRouter(env);\n\n const server = http.createServer(async (req, res) => {\n const requestAbort = new AbortController();\n const abortRequest = () => {\n if (!requestAbort.signal.aborted) {\n requestAbort.abort(new DOMException('HTTP client disconnected', 'AbortError'));\n }\n };\n const abortOnPrematureClose = () => {\n if (!res.writableEnded) abortRequest();\n };\n req.once('aborted', abortRequest);\n res.once('close', abortOnPrematureClose);\n try {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks);\n const request = new Request(`http://127.0.0.1${req.url ?? '/'}`, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: req.method === 'GET' || req.method === 'HEAD' || body.length === 0 ? null : body,\n signal: requestAbort.signal,\n });\n const response = await router(request);\n if (requestAbort.signal.aborted || res.destroyed) return;\n res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n res.end(Buffer.from(await response.arrayBuffer()));\n } catch (error) {\n if (requestAbort.signal.aborted || res.destroyed) return;\n res.writeHead(500, { 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: { name: 'HarnessError', message: String(error) } }));\n } finally {\n req.off('aborted', abortRequest);\n res.off('close', abortOnPrematureClose);\n }\n });\n\n await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));\n const { port } = server.address() as AddressInfo;\n\n return {\n url: `http://127.0.0.1:${port}`,\n fleet,\n close: () =>\n new Promise<void>((resolve, reject) => {\n // Test clients may retain an active keep-alive connection after their\n // assertions finish. Stop accepting connections first, then destroy\n // any that remain so teardown cannot wait indefinitely.\n server.close((err) => (err ? reject(err) : resolve()));\n server.closeAllConnections();\n }),\n };\n}\n","/**\n * In-process celld-world emulation for tests and local development: the real\n * worker router and the real cell classes over Map-backed fake state, behind\n * node:http — the full wire protocol without a celld fleet.\n *\n * `startDevFleet()` additionally drives cell alarms on real time, so QueueDO\n * deliveries flow — a drop-in local stand-in for a deployed fleet.\n */\nexport { FakeFleet, FakeStorage } from './fake-cell.js';\nexport { startHarness, type Harness, type HarnessOptions } from './http-harness.js';\n\nimport { startHarness, type Harness, type HarnessOptions } from './http-harness.js';\n\nexport interface DevFleet extends Harness {\n stop(): Promise<void>;\n}\n\n/** Alarm-pump interval for the dev fleet (real time). */\nconst PUMP_INTERVAL_MS = 25;\n\nexport async function startDevFleet(options: HarnessOptions = {}): Promise<DevFleet> {\n const harness = await startHarness(options);\n let pumping = false;\n const pump = setInterval(async () => {\n if (pumping) return;\n pumping = true;\n try {\n harness.fleet.now = Date.now();\n await harness.fleet.fireDueAlarms();\n } catch (error) {\n console.error('[world-celld dev fleet] alarm pump error:', error);\n } finally {\n pumping = false;\n }\n }, PUMP_INTERVAL_MS);\n // Don't hold the process open just for the pump.\n pump.unref?.();\n\n return {\n ...harness,\n async stop() {\n clearInterval(pump);\n await harness.close();\n },\n };\n}\n"],"mappings":"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"}