@ewhauser/world-celld 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/NOTICE +1 -1
- package/README.md +106 -106
- package/celld-queue-worker/README.md +26 -0
- package/celld-queue-worker/worker.ts +3 -0
- package/celld-queue-worker/wrangler.jsonc +26 -0
- package/celld-worker/README.md +33 -25
- package/celld-worker/worker.ts +1 -1
- package/celld-worker/wrangler.jsonc +12 -8
- package/dist/index.d.ts +32 -70
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -88
- package/dist/index.js.map +1 -1
- package/dist/queue-consumer.d.ts +33 -0
- package/dist/queue-consumer.d.ts.map +1 -0
- package/dist/queue-consumer.js +75 -0
- package/dist/queue-consumer.js.map +1 -0
- package/dist/queue-delivery-DzNOtCYA.d.ts +49 -0
- package/dist/queue-delivery-DzNOtCYA.d.ts.map +1 -0
- package/dist/{util-Cu09mVzK.js → queue-protocol-CmJNMH_5.js} +60 -12
- package/dist/queue-protocol-CmJNMH_5.js.map +1 -0
- package/dist/queue-protocol-Ds44uuND.js +104 -0
- package/dist/queue-protocol-Ds44uuND.js.map +1 -0
- package/dist/testing.d.ts +3 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +420 -833
- package/dist/testing.js.map +1 -1
- package/dist/worker.d.ts +106 -181
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +602 -955
- package/dist/worker.js.map +1 -1
- package/docs/celld-v0.5-upgrade.md +130 -0
- package/package.json +11 -3
- package/dist/util-Cu09mVzK.js.map +0 -1
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","names":["STORAGE_BATCH_SIZE","getMany","deleteMany","isRecord","MAX_RELEASE_BATCH","CLAIM_DEADLINE_PREFIX","pad","recordKey","claimKey","claimDeadlineKey","pad","STORAGE_BATCH_SIZE","pad","isRecord","#intVar","#maxAttempts","#maxInflight","#deliveryTimeoutMs","#authoritativeRunExpired","#withRunMutation","#validateRuntimeConfig","#now","#scheduleNextAlarm","#armAlarmAtMost","#claimPhase","#deliver","#compactExpiredRunFences","#deadLetter","#dropExpiredMessage","#fetch","#ack","#retry","#rearm","isRecord"],"sources":["../src/testing/fake-cell.ts","../src/apply-event.ts","../src/worker/auth.ts","../src/worker/index-validation.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/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 FakeStorageRead {\n operation: 'get' | 'list';\n keys?: string[];\n options?: FakeListOptions;\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 private readFailure?: {\n predicate: (read: FakeStorageRead) => 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 this.maybeFailRead({ operation: 'get', keys: keyOrKeys });\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 this.maybeFailRead({ operation: 'get', keys: [keyOrKeys] });\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 this.maybeFailRead({ operation: 'list', options });\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 /** Inject one matching storage read failure, including reads inside transactions. */\n failNextRead(\n predicate: (read: FakeStorageRead) => boolean,\n error = new Error('injected fake storage read failure'),\n ): void {\n this.readFailure = { 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 so read failures model transactional reads too. */\n maybeFailRead(read: FakeStorageRead): void {\n if (!this.readFailure?.predicate(read)) return;\n const { error } = this.readFailure;\n this.readFailure = 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 this.storage.maybeFailRead({ operation: 'get', keys: keyOrKeys });\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 this.storage.maybeFailRead({ operation: 'get', keys: [key] });\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 this.storage.maybeFailRead({ operation: 'list', options });\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 * Transactional event-application core shared by the real WorkflowRunDO and\n * the in-memory test mocks.\n *\n * All guard checks, the event append, and the entity mutation happen against a\n * single {@link EventStore}. The Durable Object wraps a call to\n * {@link applyEvent} in `ctx.storage.transaction()`, so the whole operation is\n * atomic; the mocks run it against an in-memory store.\n *\n * Guard semantics are ported from the upstream `@workflow/world-local` /\n * `@workflow/world-postgres` reference implementations (Workflow 5 contract):\n * - run_started on a terminal run -> RunExpiredError\n * - terminal transitions on a terminal run -> EntityConflictError\n * - run_cancelled is idempotent on an already-cancelled run\n * - duplicate step_created / hook_created -> EntityConflictError\n * - step events on a terminal step -> EntityConflictError\n * - step_started before step.retryAfter -> TooEarlyError\n * - error/output/completedAt are cleared whenever a run re-enters a\n * non-final status (WorkflowRunSchema is a discriminated union)\n *\n * Errors are returned as structured outcomes (never thrown) because custom\n * error classes do not survive the Durable Object RPC boundary with their\n * `name` intact — and `@workflow/errors` matches errors by name via `.is()`.\n * The storage layer converts outcomes back into the typed errors.\n */\n\nimport type {\n CreateEventParams,\n CreateEventRequest,\n Event,\n Hook,\n RunCreatedEventRequest,\n Step,\n Wait,\n WorkflowRun,\n} from '@workflow/world';\nimport {\n applyAttributeChanges,\n CreateEventSchema,\n eventIdToSlot,\n EventSchema,\n getMaxEventsPerRun,\n HookSchema,\n isChildEntityCreationEvent,\n isTerminalStepStatus,\n isTerminalWorkflowRunStatus,\n SPEC_VERSION_CURRENT,\n slotToEventId,\n StepSchema,\n validateAttributeChanges,\n WaitSchema,\n WorkflowRunSchema,\n} from '@workflow/world';\nimport { compact } from './util.js';\nimport type { ScheduleCleanupRequest } from './retention.js';\n\n/** Storage key for the run entity. */\nconst RUN_KEY = 'run';\n/** Key prefixes for per-entity storage. */\nexport const EVENT_KEY_PREFIX = 'event:';\nexport const STEP_KEY_PREFIX = 'step:';\nexport const HOOK_KEY_PREFIX = 'hook:';\nexport const WAIT_KEY_PREFIX = 'wait:';\nexport const STEP_CREATED_KEY_PREFIX = 'stepcreated:';\nexport const HOOK_CREATED_KEY_PREFIX = 'hookcreated:';\n/**\n * Marker recording that a hook_created event was committed for a hookId.\n * Mirrors postgres' `workflow_events_entity_creation_unique` partial index:\n * it outlives hook disposal so a replayed hook_created after dispose is\n * rejected as a duplicate instead of resurrecting the hook.\n */\nconst HOOK_EVENT_MARKER_PREFIX = 'hookevent:';\n/** Durable repair record for idempotent post-commit hook-index release. */\nconst HOOK_RELEASE_MARKER_PREFIX = 'hookreleased:';\n/** Exact ambiguous reservations canceled by a serialized RunDO resolution. */\nexport const HOOK_CLAIM_CANCELLATION_PREFIX = 'hookclaimcancelled:';\n/** Workflow-authored attr_set correlation claims. */\nconst ATTRIBUTE_EVENT_MARKER_PREFIX = 'attrevent:';\n/** Durable lazy-hook resume claims, scoped by the containing run DO. */\nconst HOOK_RESUME_CLAIM_PREFIX = 'hookresume:';\n\ninterface HookResumeClaim {\n hookId: string;\n eventId: string;\n payloadDigest?: string;\n}\n\nexport interface EventStoreListOptions {\n prefix: string;\n /** Exclusive lower bound (full key). */\n startAfter?: string;\n /** Exclusive upper bound (full key). */\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\n/**\n * Minimal transactional key-value surface, satisfied by\n * `DurableObjectTransaction` / `DurableObjectStorage` and by the in-memory\n * test-mock store. Keys list in lexicographic order (reversed when\n * `reverse: true`).\n */\nexport interface EventStore {\n get<T>(key: string): Promise<T | undefined>;\n /** Optional native multi-key read (128 keys per Durable Object call). */\n getMany?<T>(keys: string[]): Promise<Map<string, T>>;\n put<T>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<boolean>;\n /** Optional native multi-key delete. */\n deleteMany?(keys: string[]): Promise<number>;\n list<T>(options: EventStoreListOptions): Promise<Map<string, T>>;\n /**\n * Celld-only capability: terminal entity cleanup is persisted and paged by\n * WorkflowRunDO alarms instead of running inside the event transaction.\n */\n deferTerminalCleanup?: boolean;\n}\n\nconst STORAGE_BATCH_SIZE = 128;\nconst MAX_ENTITY_PAGE_SIZE = 1000;\n\nasync function getMany<T>(store: EventStore, keys: string[]): Promise<Map<string, T>> {\n if (store.getMany) {\n const result = new Map<string, T>();\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n const page = await store.getMany<T>(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n for (const entry of page) result.set(...entry);\n }\n return result;\n }\n const values = await Promise.all(keys.map((key) => store.get<T>(key)));\n return new Map(\n keys.flatMap((key, index) =>\n values[index] === undefined ? [] : ([[key, values[index] as T]] as Array<[string, T]>),\n ),\n );\n}\n\nasync function deleteMany(store: EventStore, keys: string[]): Promise<number> {\n if (store.deleteMany) {\n let deleted = 0;\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n deleted += await store.deleteMany(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n return deleted;\n }\n const results = await Promise.all(keys.map((key) => store.delete(key)));\n return results.filter(Boolean).length;\n}\n\nexport interface ApplyEventRequest {\n /** The effective run id (already resolved / generated by the caller). */\n runId: string;\n data: CreateEventRequest | RunCreatedEventRequest;\n /** Workflow 5 event-log position and preload options. */\n params?: CreateEventParams;\n /**\n * Current holder of the hook token per the sharded token-ownership index\n * (hook_created only). `null` means the token is unclaimed.\n */\n tokenHolder?: { runId: string; hookId: string } | null;\n /** Exact token/ID reservation fenced on ambiguous-delivery resolution. */\n hookClaimId?: string;\n /** Internal world-celld retention policy captured with the event. */\n cleanup?: ScheduleCleanupRequest;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Validate and canonicalize the untyped fleet-facing applyEvent envelope.\n * This runs before a RunDO transaction starts; in particular, malformed hook\n * events cannot allocate a sequence or touch hook/entity storage.\n */\nexport function parseApplyEventRequest(value: unknown): ApplyEventRequest {\n if (!isRecord(value)) throw new TypeError('applyEvent request must be an object');\n if (typeof value.runId !== 'string' || value.runId.length === 0) {\n throw new TypeError('applyEvent runId must be a non-empty string');\n }\n\n const data = CreateEventSchema.parse(isRecord(value.data) ? compact(value.data) : value.data);\n const params = value.params;\n if (params !== undefined) {\n if (!isRecord(params)) throw new TypeError('applyEvent params must be an object');\n if (\n params.occurredAt !== undefined &&\n (!(params.occurredAt instanceof Date) || Number.isNaN(params.occurredAt.getTime()))\n ) {\n throw new TypeError('applyEvent params.occurredAt must be a valid Date');\n }\n for (const key of ['resumeId', 'resumePayloadDigest', 'sinceCursor'] as const) {\n if (params[key] !== undefined && typeof params[key] !== 'string') {\n throw new TypeError(`applyEvent params.${key} must be a string`);\n }\n }\n if (\n params.eventCount !== undefined &&\n (typeof params.eventCount !== 'number' ||\n !Number.isSafeInteger(params.eventCount) ||\n params.eventCount < 0)\n ) {\n throw new TypeError('applyEvent params.eventCount must be a non-negative safe integer');\n }\n for (const key of ['skipPreload', 'preloadEvents'] as const) {\n if (params[key] !== undefined && params[key] !== true) {\n throw new TypeError(`applyEvent params.${key} must be true when present`);\n }\n }\n }\n\n let tokenHolder: ApplyEventRequest['tokenHolder'];\n if (value.tokenHolder === null) {\n tokenHolder = null;\n } else if (value.tokenHolder !== undefined) {\n if (\n !isRecord(value.tokenHolder) ||\n typeof value.tokenHolder.runId !== 'string' ||\n value.tokenHolder.runId.length === 0 ||\n typeof value.tokenHolder.hookId !== 'string' ||\n value.tokenHolder.hookId.length === 0\n ) {\n throw new TypeError('applyEvent tokenHolder must contain non-empty runId and hookId strings');\n }\n tokenHolder = { runId: value.tokenHolder.runId, hookId: value.tokenHolder.hookId };\n }\n\n if (\n value.hookClaimId !== undefined &&\n (typeof value.hookClaimId !== 'string' || value.hookClaimId.length === 0)\n ) {\n throw new TypeError('applyEvent hookClaimId must be a non-empty string');\n }\n\n return {\n runId: value.runId,\n data,\n ...(params === undefined ? {} : { params }),\n ...(value.tokenHolder === undefined ? {} : { tokenHolder }),\n ...(value.hookClaimId === undefined ? {} : { hookClaimId: value.hookClaimId }),\n ...(value.cleanup === undefined ? {} : { cleanup: value.cleanup as ScheduleCleanupRequest }),\n };\n}\n\nexport type ApplyEventErrorCode =\n | 'RUN_NOT_FOUND'\n | 'STEP_NOT_FOUND'\n | 'HOOK_NOT_FOUND'\n | 'WAIT_NOT_FOUND'\n | 'ENTITY_CONFLICT'\n | 'HOOK_CLAIM_CANCELLED'\n | 'RUN_EXPIRED'\n | 'TOO_EARLY'\n | 'RUN_NOT_SUPPORTED';\n\nexport interface ApplyEventFailure {\n ok: false;\n code: ApplyEventErrorCode;\n message: string;\n /** Seconds until retry is allowed (TOO_EARLY only). */\n retryAfterSeconds?: number;\n /** The run's spec version (RUN_NOT_SUPPORTED only). */\n runSpecVersion?: number;\n}\n\nexport interface ApplyEventSuccess {\n ok: true;\n /** Absent for idempotent replays that record no new event. */\n event?: Event;\n run?: WorkflowRun;\n step?: Step;\n hook?: Hook;\n wait?: Wait;\n /** True when a lazy step_started atomically created its step. */\n stepCreated?: true;\n /** Hooks whose token and ID indexes must be released. */\n releasedHooks: Array<{ hookId: string; token: string }>;\n /** Set when a run entity was created (run_created or resilient bootstrap). */\n runCreated?: { workflowName: string; createdAt: Date };\n /** Set when the sharded hook indexes must be (re)written. */\n hookToIndex?: Hook;\n /** All events (ascending), preloaded for run_started responses. */\n events?: Event[];\n /** Pagination metadata required whenever events are returned. */\n cursor?: string | null;\n hasMore?: boolean;\n /** Server-owned event ceiling advertised on run lifecycle writes. */\n maxEvents?: number;\n /** Deadline for publishing this authoritative mutation to derivative indexes. */\n indexPublicationExpiresAt?: number;\n}\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","/**\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","import { HookSchema, WorkflowRunSchema, type WorkflowRun } from '@workflow/world';\nimport type { HookTokenOwner } from '../config.js';\nimport type { HookReservation, IndexListOptions } from '../indexes.js';\nimport type { ExpireRunIndexesRequest, ReleaseHookIndexesRequest } from '../retention.js';\nimport { isRecord } from '../validation.js';\nimport { parse } from '../vendor/shared/index.js';\n\nexport type IndexOperation =\n | 'runs.list'\n | 'runs.commit'\n | 'runs.expire'\n | 'hooks.reserve'\n | 'hooks.finalize'\n | 'hooks.release-reservation'\n | 'hooks.release';\n\nexport type ValidatedIndexRequest =\n | { operation: 'runs.list'; args: [IndexListOptions | undefined] }\n | { operation: 'runs.commit'; args: [WorkflowRun, string, number] }\n | { operation: 'runs.expire'; args: [ExpireRunIndexesRequest] }\n | { operation: 'hooks.reserve'; args: [string, HookTokenOwner] }\n | {\n operation: 'hooks.finalize';\n args: [string, string, string, HookTokenOwner, HookReservation | undefined];\n }\n | {\n operation: 'hooks.release-reservation';\n args: [string, HookTokenOwner, HookReservation];\n }\n | { operation: 'hooks.release'; args: [ReleaseHookIndexesRequest] };\n\nfunction invalid(message: string): never {\n const error = new Error(`invalid index RPC arguments: ${message}`);\n error.name = 'RequestValidationError';\n throw error;\n}\n\nfunction exactArgs(args: unknown[], count: number): void {\n if (args.length !== count) invalid(`expected ${count} argument(s)`);\n}\n\nfunction nonEmptyString(value: unknown, name: string): string {\n if (typeof value !== 'string' || value.length === 0)\n invalid(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction stringValue(value: unknown, name: string): string {\n if (typeof value !== 'string') invalid(`${name} must be a string`);\n return value;\n}\n\nfunction nonNegativeSafeInteger(value: unknown, name: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n invalid(`${name} must be a non-negative safe integer`);\n }\n return value as number;\n}\n\nfunction positiveSafeInteger(value: unknown, name: string): number {\n const parsed = nonNegativeSafeInteger(value, name);\n if (parsed === 0) invalid(`${name} must be a positive safe integer`);\n return parsed;\n}\n\nfunction owner(value: unknown, name = 'owner'): HookTokenOwner {\n if (!isRecord(value)) invalid(`${name} must be an object`);\n return {\n runId: nonEmptyString(value.runId, `${name}.runId`),\n hookId: nonEmptyString(value.hookId, `${name}.hookId`),\n };\n}\n\nfunction reservation(value: unknown): HookReservation {\n if (!isRecord(value)) invalid('reservation must be an object');\n const parsed: HookReservation = {\n claimId: nonEmptyString(value.claimId, 'reservation.claimId'),\n };\n if (value.tokenClaimId !== undefined) {\n parsed.tokenClaimId = nonEmptyString(value.tokenClaimId, 'reservation.tokenClaimId');\n }\n if (value.hookIdClaimId !== undefined) {\n parsed.hookIdClaimId = nonEmptyString(value.hookIdClaimId, 'reservation.hookIdClaimId');\n }\n return parsed;\n}\n\nfunction hooks(value: unknown): Array<{ hookId: string; token: string }> {\n if (!Array.isArray(value)) invalid('hooks must be an array');\n return value.map((entry, index) => {\n if (!isRecord(entry)) invalid(`hooks[${index}] must be an object`);\n return {\n hookId: nonEmptyString(entry.hookId, `hooks[${index}].hookId`),\n token: nonEmptyString(entry.token, `hooks[${index}].token`),\n };\n });\n}\n\nfunction exactProperties(value: Record<string, unknown>, allowed: string[], name: string): void {\n const unexpected = Object.keys(value).find((key) => !allowed.includes(key));\n if (unexpected !== undefined) invalid(`${name}.${unexpected} is not allowed`);\n}\n\nfunction releaseRequest(value: unknown): ReleaseHookIndexesRequest {\n if (!isRecord(value)) invalid('release request must be an object');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n };\n}\n\nfunction expireRequest(value: unknown): ExpireRunIndexesRequest {\n if (!isRecord(value)) invalid('expiry request must be an object');\n exactProperties(value, ['runId', 'hooks', 'expiredAt'], 'request');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n expiredAt: nonNegativeSafeInteger(value.expiredAt, 'request.expiredAt'),\n };\n}\n\nfunction listOptions(value: unknown): IndexListOptions | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isRecord(value)) invalid('list options must be an object');\n const parsed: IndexListOptions = {};\n for (const name of ['prefix', 'cursor', 'end'] as const) {\n if (value[name] !== undefined) parsed[name] = stringValue(value[name], `options.${name}`);\n }\n if (value.limit !== undefined) {\n const limit = value.limit;\n if (!Number.isSafeInteger(limit) || (limit as number) < 1 || (limit as number) > 1000) {\n invalid('options.limit must be an integer between 1 and 1000');\n }\n parsed.limit = limit as number;\n }\n if (value.reverse !== undefined) {\n if (typeof value.reverse !== 'boolean') invalid('options.reverse must be a boolean');\n parsed.reverse = value.reverse;\n }\n return parsed;\n}\n\nfunction runCommit(args: unknown[]): ValidatedIndexRequest {\n exactArgs(args, 3);\n const parsedRun = WorkflowRunSchema.safeParse(args[0]);\n if (!parsedRun.success) invalid('run does not match WorkflowRunSchema');\n const run = parsedRun.data;\n nonEmptyString(run.runId, 'run.runId');\n nonEmptyString(run.workflowName, 'run.workflowName');\n nonEmptyString(run.deploymentId, 'run.deploymentId');\n const serializedMetadata = nonEmptyString(args[1], 'serializedMetadata');\n let metadata: unknown;\n try {\n metadata = JSON.parse(serializedMetadata);\n } catch {\n invalid('serializedMetadata must be valid JSON');\n }\n if (\n !isRecord(metadata) ||\n metadata.runId !== run.runId ||\n metadata.status !== run.status ||\n metadata.createdAt !== run.createdAt.toISOString()\n ) {\n invalid('serializedMetadata must match the committed run');\n }\n const publicationExpiresAt = positiveSafeInteger(args[2], 'publicationExpiresAt');\n return { operation: 'runs.commit', args: [run, serializedMetadata, publicationExpiresAt] };\n}\n\nfunction hookFinalize(args: unknown[]): ValidatedIndexRequest {\n if (args.length !== 4 && args.length !== 5) invalid('expected 4 or 5 arguments');\n const token = nonEmptyString(args[0], 'token');\n const hookId = nonEmptyString(args[1], 'hookId');\n const serializedHook = nonEmptyString(args[2], 'serializedHook');\n const hookOwner = owner(args[3]);\n if (hookOwner.hookId !== hookId) invalid('owner.hookId must match hookId');\n let decodedHook: unknown;\n try {\n decodedHook = parse<unknown>(serializedHook);\n } catch {\n invalid('serializedHook must be valid tagged JSON');\n }\n const parsedHook = HookSchema.safeParse(decodedHook);\n if (!parsedHook.success) invalid('serializedHook does not match HookSchema');\n if (\n parsedHook.data.runId !== hookOwner.runId ||\n parsedHook.data.hookId !== hookId ||\n parsedHook.data.token !== token ||\n !parsedHook.data.runId ||\n !parsedHook.data.hookId ||\n !parsedHook.data.token\n ) {\n invalid('serializedHook must match token, hookId, and owner');\n }\n const hookReservation =\n args[4] === undefined || args[4] === null ? undefined : reservation(args[4]);\n return {\n operation: 'hooks.finalize',\n args: [token, hookId, serializedHook, hookOwner, hookReservation],\n };\n}\n\nexport function validateIndexRequest(\n operation: IndexOperation,\n args: unknown[],\n): ValidatedIndexRequest {\n switch (operation) {\n case 'runs.list':\n if (args.length > 1) invalid('expected at most 1 argument');\n return { operation, args: [listOptions(args[0])] };\n case 'runs.commit':\n return runCommit(args);\n case 'runs.expire':\n exactArgs(args, 1);\n return { operation, args: [expireRequest(args[0])] };\n case 'hooks.reserve':\n exactArgs(args, 2);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1])],\n };\n case 'hooks.finalize':\n return hookFinalize(args);\n case 'hooks.release-reservation':\n exactArgs(args, 3);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1]), reservation(args[2])],\n };\n case 'hooks.release':\n exactArgs(args, 1);\n return { operation, args: [releaseRequest(args[0])] };\n default:\n return invalid('unknown operation');\n }\n}\n\nexport const INDEX_OPERATIONS = new Set<IndexOperation>([\n 'runs.list',\n 'runs.commit',\n 'runs.expire',\n 'hooks.reserve',\n 'hooks.finalize',\n 'hooks.release-reservation',\n 'hooks.release',\n]);\n","/**\n * Worker-level HTTP router: the fleet-facing RPC surface of the celld world.\n *\n * Routes:\n * GET /v1/health — liveness + spec version (unauthenticated)\n * POST /v1/rpc/{binding}/{name}/{method} — DO RPC (bearer auth)\n * POST /v1/index/{domain}/{method} — cohesive index operation\n * GET /v1/streams/{name}/chunks — bounded binary long-poll read\n * POST /v1/streams/{name}/chunks — bounded binary batch append\n *\n * Generic RPC bodies use the tagged JSON codec. Stream chunk bodies use the\n * compact binary stream protocol. Only whitelisted routes/methods dispatch.\n */\nimport { SPEC_VERSION_CURRENT } from '@workflow/world';\nimport { parseApplyEventRequest } from '../apply-event.js';\nimport { rpcParse, rpcStringify } from '../codec.js';\nimport {\n createWorkflowIndex,\n type CellNamespaceLike,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n 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';\nimport { INDEX_OPERATIONS, type IndexOperation, validateIndexRequest } from './index-validation.js';\n\nexport const WORLD_NAME = 'world-celld';\nexport const WORLD_VERSION = '0.1.0';\n\n/** Minimal structural DO namespace type (celld provides the real thing). */\nexport interface DONamespaceLike {\n idFromName(name: string): { toString(): string };\n get(id: { toString(): string }): unknown;\n}\n\nexport interface WorkerEnv {\n WORKFLOW_DB: DONamespaceLike;\n WORKFLOW_STREAMS: DONamespaceLike;\n WORKFLOW_RUN_CATALOG: DONamespaceLike;\n WORKFLOW_HOOK_TOKENS: DONamespaceLike;\n WORKFLOW_HOOK_IDS: DONamespaceLike;\n WORKFLOW_QUEUE: DONamespaceLike;\n WORLD_SECRET?: string;\n WORKFLOW_RETENTION_MS?: string | number;\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n WORKFLOW_RETENTION_QUEUE_SHARDS?: string | number;\n}\n\nfunction workflowIndex(env: WorkerEnv) {\n return createWorkflowIndex({\n runCatalog: env.WORKFLOW_RUN_CATALOG as CellNamespaceLike<RunCatalogShardStub>,\n hookTokens: env.WORKFLOW_HOOK_TOKENS as CellNamespaceLike<HookTokenShardStub>,\n hookIds: env.WORKFLOW_HOOK_IDS as CellNamespaceLike<HookIdShardStub>,\n });\n}\n\nconst BINDINGS: Record<string, { env: keyof WorkerEnv; methods: ReadonlySet<string> }> = {\n runs: {\n env: 'WORKFLOW_DB',\n methods: new Set([\n 'applyEvent',\n 'getLifecycleStatus',\n 'getRun',\n 'getStep',\n 'getEvent',\n 'listEvents',\n 'listSteps',\n 'listHooks',\n 'getCleanupStatus',\n 'scheduleCleanup',\n 'cleanupNow',\n 'rearmCleanup',\n 'resolveHookTokenClaim',\n ]),\n },\n streams: {\n env: 'WORKFLOW_STREAMS',\n methods: new Set([\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'listStreams',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ]),\n },\n 'hook-tokens': {\n env: 'WORKFLOW_HOOK_TOKENS',\n methods: new Set(['get']),\n },\n 'hook-ids': {\n env: 'WORKFLOW_HOOK_IDS',\n methods: new Set(['get']),\n },\n queue: {\n env: 'WORKFLOW_QUEUE',\n methods: new Set([\n 'enqueue',\n 'stats',\n 'listDeadLetters',\n 'redriveDeadLetter',\n 'purgeDeadLetters',\n 'rearmAlarm',\n 'expireRun',\n 'acknowledgeExpireRun',\n ]),\n },\n};\n\n/** Request body cap: oversize payloads get a clear 413 instead of an OOM. */\nconst MAX_BODY_BYTES = 32 * 1024 * 1024;\nconst MAX_STREAM_WRITE_BODY_BYTES = MAX_STREAM_BATCH_BYTES + 1024;\n\nfunction errorResponse(status: number, name: string, message: string): Response {\n return Response.json({ error: { name, message } }, { status });\n}\n\nfunction hasContentType(request: Request, expected: string): boolean {\n return (\n request.headers.get('content-type')?.split(';', 1)[0].trim().toLowerCase() ===\n expected.toLowerCase()\n );\n}\n\nfunction declaredContentLength(request: Request): number | null {\n const raw = request.headers.get('content-length');\n if (raw === null) return null;\n if (!/^\\d+$/.test(raw)) {\n const error = new Error('content-length must be a non-negative integer');\n error.name = 'RequestValidationError';\n throw error;\n }\n const value = Number(raw);\n if (!Number.isSafeInteger(value)) {\n const error = new Error('content-length is out of range');\n error.name = 'RequestValidationError';\n throw error;\n }\n return value;\n}\n\nfunction decodePathComponent(value: string, name: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n const error = new Error(`${name} has malformed percent encoding`);\n error.name = 'RequestValidationError';\n throw error;\n }\n}\n\nasync function readBoundedBody(request: Request): Promise<string | null> {\n if (!request.body) return '';\n const reader = request.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_BODY_BYTES) {\n await reader.cancel('RPC body exceeds configured limit').catch(() => undefined);\n return null;\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function readBoundedBytes(request: Request, maxBytes: number): Promise<Uint8Array | null> {\n if (!request.body) return new Uint8Array();\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel('stream body exceeds configured limit').catch(() => undefined);\n return null;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nfunction parseBoundedInteger(url: URL, name: string, minimum: number, maximum: number): number {\n const raw = url.searchParams.get(name);\n const value = raw !== null && /^\\d+$/.test(raw) ? Number(raw) : Number.NaN;\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n const error = new Error(`${name} must be an integer between ${minimum} and ${maximum}`);\n error.name = 'StreamProtocolError';\n throw error;\n }\n return value;\n}\n\nfunction streamResponse(body: Uint8Array): Response {\n return new Response(body, {\n status: 200,\n headers: { '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 if (request.method !== 'GET') {\n return errorResponse(405, 'MethodNotAllowed', 'expected GET');\n }\n return Response.json({\n ok: true,\n name: WORLD_NAME,\n version: WORLD_VERSION,\n specVersion: SPEC_VERSION_CURRENT,\n });\n }\n\n const auth = await authenticate(request, env.WORLD_SECRET);\n if (!auth.ok) {\n return auth.response;\n }\n\n if (parts[1] === 'index' && parts.length === 4) {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n for (const required of [\n 'WORKFLOW_RUN_CATALOG',\n 'WORKFLOW_HOOK_TOKENS',\n 'WORKFLOW_HOOK_IDS',\n ] as const) {\n if (!env[required]) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${required}`);\n }\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n const operation = `${parts[2]}.${parts[3]}`;\n if (!INDEX_OPERATIONS.has(operation as IndexOperation)) {\n return errorResponse(404, 'NotFound', `unknown index operation: ${operation}`);\n }\n let validated;\n try {\n validated = validateIndexRequest(operation as IndexOperation, args);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n try {\n const index = workflowIndex(env);\n let result: unknown;\n switch (validated.operation) {\n case 'runs.list':\n result = await index.listRuns(...validated.args);\n break;\n case 'runs.commit':\n result = await index.commitRun(...validated.args);\n break;\n case 'runs.expire':\n result = await index.expireRun(...validated.args);\n break;\n case 'hooks.reserve':\n result = await index.reserveHook(...validated.args);\n break;\n case 'hooks.finalize':\n result = await index.finalizeHookIndexes(...validated.args);\n break;\n case 'hooks.release-reservation':\n result = await index.releaseHookReservation(...validated.args);\n break;\n case 'hooks.release':\n result = await index.releaseHookIndexes(...validated.args);\n break;\n }\n return new Response(rpcStringify(result ?? null), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n { status: 500 },\n );\n }\n }\n\n if (parts[1] === 'streams' && parts.length === 4 && parts[3] === 'chunks') {\n const runId = url.searchParams.get('runId');\n if (!runId) return errorResponse(400, 'BadRequest', 'runId is required');\n let name: string;\n try {\n name = decodePathComponent(parts[2], 'stream name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n try {\n if (request.method === 'POST') {\n if (!hasContentType(request, STREAM_BATCH_CONTENT_TYPE)) {\n return errorResponse(415, 'UnsupportedMediaType', STREAM_BATCH_CONTENT_TYPE);\n }\n const contentLength = declaredContentLength(request);\n if (contentLength !== null && contentLength > MAX_STREAM_WRITE_BODY_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const body = await readBoundedBytes(request, MAX_STREAM_WRITE_BODY_BYTES);\n if (body === null) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const chunks = decodeStreamWriteBatch(body);\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n };\n const result = await stub.writeChunks(runId, chunks);\n return streamResponse(encodeStreamWriteResult(result));\n }\n\n if (request.method === 'GET') {\n const readRequest = {\n runId,\n startIndex: parseBoundedInteger(url, 'startIndex', 0, 0x7fffffff),\n maxChunks: parseBoundedInteger(url, 'maxChunks', 0, 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 } satisfies StreamReadRequest;\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n };\n const result = await stub.readChunks(readRequest, request.signal);\n return streamResponse(encodeStreamReadResult(result));\n }\n\n return errorResponse(405, 'MethodNotAllowed', 'expected GET or POST');\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n {\n status:\n err?.name === 'StreamProtocolError' || err?.name === 'RequestValidationError'\n ? 400\n : 500,\n },\n );\n }\n }\n\n if (parts[1] !== 'rpc') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (parts.length !== 5) {\n return errorResponse(404, 'NotFound', 'expected POST /v1/rpc/{binding}/{name}/{method}');\n }\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n\n const [, , bindingKey, encodedName, method] = parts;\n const binding = BINDINGS[bindingKey];\n if (!binding) {\n return errorResponse(404, 'NotFound', `unknown binding: ${bindingKey}`);\n }\n if (!binding.methods.has(method)) {\n return errorResponse(404, 'NotFound', `unknown method: ${bindingKey}.${method}`);\n }\n\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let name: string;\n try {\n name = decodePathComponent(encodedName, 'Durable Object name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n const namespace = env[binding.env] as DONamespaceLike | undefined;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${binding.env}`);\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n\n if (bindingKey === 'runs' && method === 'applyEvent') {\n if (args.length !== 1) {\n return errorResponse(400, 'BadRequest', 'applyEvent expects exactly one request argument');\n }\n try {\n const applyRequest = parseApplyEventRequest(args[0]);\n if (applyRequest.runId !== name) {\n return errorResponse(\n 400,\n 'BadRequest',\n `applyEvent runId \"${applyRequest.runId}\" does not match routed run \"${name}\"`,\n );\n }\n args = [applyRequest];\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n }\n\n try {\n const stub = namespace.get(namespace.idFromName(name)) as Record<\n string,\n (...a: unknown[]) => Promise<unknown>\n >;\n const result = await stub[method](...args);\n 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 { WorkflowWorldError } from '@workflow/errors';\nimport { QueuePayloadSchema } from '@workflow/world';\nimport { 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 { parse } from '../../vendor/shared/index.js';\nimport {\n boundedIntegerOption,\n checkedQueueTimestampAdd,\n isNonNegativeSafeInteger,\n isPositiveSafeInteger,\n isRecord,\n isValidQueueDelaySeconds,\n MAX_QUEUE_TIMESTAMP_MS,\n queueDelayDeadline,\n strictIntegerSetting,\n} from '../../validation.js';\nimport {\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n MAX_QUEUE_DELIVERY_TIMEOUT_MS,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_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;\nconst MAX_DEAD_LETTER_LIST_SIZE = 1000;\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 if (!isNonNegativeSafeInteger(ms) || ms > MAX_QUEUE_TIMESTAMP_MS) {\n throw new Error('queue timestamp must be a non-negative 13-digit integer');\n }\n return String(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 inclusiveTimestampEnd(prefix: string, now: number): string {\n return now >= MAX_QUEUE_TIMESTAMP_MS ? `${prefix.slice(0, -1)};` : `${prefix}${pad(now + 1)}`;\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 validateEnqueueRequest(request: unknown): asserts request is EnqueueRequest {\n if (!isRecord(request)) throw new Error('world-celld queue enqueue request must be an object');\n for (const field of ['messageId', 'queueName', 'body'] as const) {\n if (typeof request[field] !== 'string' || request[field].length === 0) {\n throw new Error(`world-celld queue enqueue ${field} must be a non-empty string`);\n }\n }\n if (request.pathname !== 'flow') {\n throw new Error('world-celld queue enqueue pathname must be flow');\n }\n if (\n !isRecord(request.config) ||\n typeof request.config.targetBaseUrl !== 'string' ||\n request.config.targetBaseUrl.length === 0\n ) {\n throw new Error('world-celld queue enqueue config is invalid');\n }\n if (!isPositiveSafeInteger(request.config.queueShards)) {\n throw new Error('world-celld queue enqueue queueShards must be a positive safe integer');\n }\n if (request.delaySeconds !== undefined && !isValidQueueDelaySeconds(request.delaySeconds)) {\n throw new Error('world-celld queue enqueue delaySeconds is out of range');\n }\n if (\n request.runId !== undefined &&\n (typeof request.runId !== 'string' || request.runId.length === 0)\n ) {\n throw new Error('world-celld queue enqueue runId must be a non-empty string');\n }\n if (\n request.idempotencyKey !== undefined &&\n (typeof request.idempotencyKey !== 'string' || request.idempotencyKey.length === 0)\n ) {\n throw new Error('world-celld queue enqueue idempotencyKey must be a non-empty string');\n }\n let body: unknown;\n try {\n body = parse(request.body as string);\n } catch {\n throw new WorkflowWorldError('world-celld queue enqueue body must be valid tagged JSON', {\n status: 422,\n });\n }\n const payload = QueuePayloadSchema.safeParse(body);\n if (!payload.success) {\n throw new WorkflowWorldError('world-celld queue enqueue body is an invalid queue payload', {\n status: 422,\n });\n }\n const payloadRunId =\n 'runId' in payload.data && typeof payload.data.runId === 'string'\n ? payload.data.runId\n : undefined;\n if (request.runId !== payloadRunId) {\n throw new WorkflowWorldError('world-celld queue enqueue runId does not match body', {\n status: 422,\n });\n }\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 return strictIntegerSetting(name, raw, fallback, 1);\n }\n\n #maxAttempts(): number {\n return this.#intVar('QUEUE_MAX_ATTEMPTS', DEFAULT_MAX_ATTEMPTS);\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 #validateRuntimeConfig(): void {\n this.#maxAttempts();\n this.#maxInflight();\n this.#deliveryTimeoutMs();\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.#validateRuntimeConfig();\n validateEnqueueRequest(request);\n const storage = this.ctx.storage;\n const now = this.#now();\n const dueAt = queueDelayDeadline(\n now,\n request.delaySeconds ?? 0,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n );\n if (dueAt === null) {\n throw new Error('world-celld queue enqueue delaySeconds lacks required delivery headroom');\n }\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 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 this.#validateRuntimeConfig();\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 const retryAt = checkedQueueTimestampAdd(this.#now(), LIFECYCLE_COMPACTION_RETRY_MS);\n if (retryAt === null) await this.ctx.storage.deleteAlarm();\n else await this.ctx.storage.setAlarm(retryAt);\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 const nextAt = checkedQueueTimestampAdd(now, MIN_ALARM_DELAY_MS);\n if (nextAt === null) await txn.deleteAlarm();\n else await txn.setAlarm(nextAt);\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: inclusiveTimestampEnd(INFLIGHT_DEADLINE_PREFIX, now),\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 recoveryAt = checkedQueueTimestampAdd(\n now,\n 0,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n );\n if (recoveryAt === null) {\n await this.#deadLetter(\n txn,\n row,\n row.attempt,\n 'inflight recovery exceeded the queue timestamp horizon',\n now,\n );\n continue;\n }\n const scheduleKey = dueKey(recoveryAt, 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 const nextAt = checkedQueueTimestampAdd(now, MIN_ALARM_DELAY_MS);\n if (nextAt === null) await txn.deleteAlarm();\n else await txn.setAlarm(nextAt);\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: inclusiveTimestampEnd('due:', now),\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 claimDeadline = checkedQueueTimestampAdd(now, timeoutMs + QUEUE_INFLIGHT_GRACE_MS);\n if (claimDeadline === null) {\n await this.#deadLetter(\n txn,\n row,\n row.attempt,\n 'delivery lease exceeded the queue timestamp horizon',\n now,\n );\n continue;\n }\n const claimKey = inflightKey(claimDeadline, 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 const redeliveryAt = queueDelayDeadline(\n now,\n timeoutSeconds,\n 1,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n );\n if (redeliveryAt !== null) {\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(redeliveryAt, 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.#maxAttempts();\n const attempt = row.attempt + 1;\n const retryAt = checkedQueueTimestampAdd(\n now,\n backoffSeconds(attempt) * 1000,\n MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS,\n );\n\n const persistRetry = async (txn: DurableObjectTransaction) => {\n if (!(await txn.delete(claimKey))) return;\n\n if (attempt >= maxAttempts || retryAt === null) {\n await this.#deadLetter(\n txn,\n row,\n attempt,\n retryAt === null ? `${reason}; retry exceeded the queue timestamp horizon` : reason,\n now,\n );\n await this.#scheduleNextAlarm(txn, now);\n return;\n }\n\n const updated: MessageRow = { ...row, attempt, lastError: reason };\n const scheduleKey = dueKey(retryAt, 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 async #deadLetter(\n txn: DurableObjectTransaction,\n row: MessageRow,\n attempt: number,\n reason: string,\n now: number,\n ): Promise<void> {\n const failedAt = checkedQueueTimestampAdd(now, 0);\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) await txn.delete(`key:${row.idempotencyKey}`);\n }\n if (failedAt === null) {\n if (row.runId) await txn.delete(runReferenceKey(row.runId, row.messageId));\n return;\n }\n const dead: DeadLetterRow = { ...row, attempt, lastError: reason, failedAt };\n const deadKey = `dlq:${pad(failedAt)}:${row.messageId}`;\n await txn.put(deadKey, dead);\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 }\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: inclusiveTimestampEnd(EXPIRED_RUN_GC_PREFIX, now),\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 const immediate = checkedQueueTimestampAdd(now, MIN_ALARM_DELAY_MS);\n if (current !== null && current <= now) {\n if (immediate === null) await storage.deleteAlarm();\n else await storage.setAlarm(immediate);\n return;\n }\n\n const target = atMs <= now ? immediate : atMs;\n if (target === null) {\n await storage.deleteAlarm();\n return;\n }\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 const target = next <= now ? checkedQueueTimestampAdd(now, MIN_ALARM_DELAY_MS) : next;\n if (target === null) await storage.deleteAlarm();\n else await storage.setAlarm(target);\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 if (params !== undefined && !isRecord(params)) {\n throw new Error('world-celld queue dead-letter list options must be an object');\n }\n const limit = boundedIntegerOption(\n 'world-celld queue dead-letter limit',\n params?.limit,\n 100,\n 1,\n MAX_DEAD_LETTER_LIST_SIZE,\n );\n if (params?.cursor !== undefined && typeof params.cursor !== 'string') {\n throw new Error('world-celld queue dead-letter cursor must be a string');\n }\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 if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new Error('world-celld queue redrive messageId must be a non-empty string');\n }\n const storage = this.ctx.storage;\n const now = this.#now();\n if (checkedQueueTimestampAdd(now, 0, MAX_QUEUE_DERIVED_DEADLINE_HEADROOM_MS) === null) {\n return { ok: false };\n }\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 if (typeof runId !== 'string' || runId.length === 0) {\n throw new Error('world-celld queue expiry runId must be a non-empty string');\n }\n if (!isNonNegativeSafeInteger(expiredAt)) {\n throw new Error('world-celld queue expiry expiredAt must be a non-negative safe integer');\n }\n if (options !== undefined && !isRecord(options)) {\n throw new Error('world-celld queue expiry options must be an object');\n }\n const storage = this.ctx.storage;\n const limit = boundedIntegerOption(\n 'world-celld queue expiry limit',\n options?.limit,\n EXPIRE_RUN_REFERENCE_BATCH,\n 1,\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 if (typeof runId !== 'string' || runId.length === 0) {\n throw new Error('world-celld queue expiry runId must be a non-empty string');\n }\n if (\n !isRecord(receipt) ||\n !isNonNegativeSafeInteger(receipt.expiredAt) ||\n !isNonNegativeSafeInteger(receipt.deleted)\n ) {\n throw new Error('world-celld queue expiry receipt is invalid');\n }\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 = checkedQueueTimestampAdd(this.#now(), QUEUE_FENCE_GRACE_MS);\n if (compactAt !== null) {\n await txn.put<ExpiredRunFence>(key, { ...marker, compactAt });\n await txn.put<ExpiredRunGc>(expiredRunGcKey(runId, compactAt), { runId, compactAt });\n }\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:';\nconst CATALOG_KEYS_PREFIX = 'catalog-keys:';\n\ninterface RunCatalogEnv {\n clock?: () => number;\n}\n\ninterface CatalogExpiryFence {\n expiredAt: number;\n compactAt: number;\n}\n\ninterface CatalogExpiryGc {\n runId: string;\n compactAt: number;\n}\n\ninterface CatalogKeys {\n keys: [string, string];\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction expiredKey(runId: string): string {\n return `expired:${runId}`;\n}\n\nfunction catalogKeysKey(runId: string): string {\n return `${CATALOG_KEYS_PREFIX}${encodeURIComponent(runId)}`;\n}\n\nfunction canonicalCatalogKeys(runId: string, keys: unknown): [string, string] {\n if (!Array.isArray(keys) || keys.length !== 2 || keys.some((key) => typeof key !== 'string')) {\n throw new Error('Run catalog commit requires exactly two string keys');\n }\n const suffix = `:${runId}`;\n const workflowMatch = /^run:(.+):(\\d{13}):/.exec(keys[0]);\n if (\n workflowMatch === null ||\n !keys[0].endsWith(suffix) ||\n keys[0] !== `run:${workflowMatch[1]}:${workflowMatch[2]}${suffix}` ||\n keys[1] !== `runall:${workflowMatch[2]}${suffix}`\n ) {\n throw new Error('Run catalog commit requires the canonical run key pair');\n }\n return [keys[0], keys[1]];\n}\n\nfunction expiryGcKey(runId: string, compactAt: number): string {\n return `${EXPIRY_GC_PREFIX}${pad(compactAt)}:${encodeURIComponent(runId)}`;\n}\n\n/** One of a fixed set of run-catalog shards, routed by the stable run ID hash. */\nexport class RunCatalogDO extends DurableObject {\n private now(): number {\n const clock = (this.env as RunCatalogEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n async upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }> {\n const canonicalKeys = canonicalCatalogKeys(runId, keys);\n return await this.ctx.storage.transaction(async (txn) => {\n 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({\n [canonicalKeys[0]]: serializedMetadata,\n [canonicalKeys[1]]: serializedMetadata,\n [catalogKeysKey(runId)]: { keys: canonicalKeys } satisfies CatalogKeys,\n });\n return { stored: true };\n });\n }\n\n async list(options: IndexListOptions = {}): Promise<IndexListPage> {\n const suppliedLimit = options.limit;\n const requestedLimit =\n typeof suppliedLimit === 'number' && Number.isFinite(suppliedLimit)\n ? Math.floor(suppliedLimit)\n : MAX_INDEX_LIST_SIZE;\n const limit = Math.min(MAX_INDEX_LIST_SIZE, Math.max(1, requestedLimit));\n const entries = await this.ctx.storage.list<string>({\n // The shard also owns internal expiry metadata. An unprefixed catalog\n // read means all public run/runall entries, never internal records.\n prefix: options.prefix || 'run',\n ...(options.reverse\n ? { reverse: true, end: options.cursor ?? options.end }\n : { startAfter: options.cursor, end: options.end }),\n limit: limit + 1,\n });\n const page = Array.from(entries).slice(0, limit);\n const listComplete = entries.size <= limit;\n return {\n keys: page.map(([name, value]) => ({ name, value })),\n list_complete: listComplete,\n cursor: listComplete ? undefined : page.at(-1)?.[0],\n };\n }\n\n /** Compare-and-delete one rejected retention discovery candidate. */\n async deleteStaleGlobalRun(\n runId: string,\n key: string,\n expectedValue: string,\n ): Promise<{ deleted: boolean }> {\n if (!key.startsWith('runall:') || !key.endsWith(`:${runId}`)) {\n throw new Error('Stale run catalog deletion requires the exact global run key');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get<string>(key)) !== expectedValue) return { deleted: false };\n return { deleted: await txn.delete(key) };\n });\n }\n\n async expireRun(runId: string, expiredAt: number): Promise<ExpireRunIndexesResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const storedKeysKey = catalogKeysKey(runId);\n const storedKeys = await txn.get<CatalogKeys>(storedKeysKey);\n if (storedKeys === undefined) return { deleted: 0 };\n const canonicalKeys = canonicalCatalogKeys(runId, storedKeys.keys);\n const marker = expiredKey(runId);\n const existing = await txn.get<CatalogExpiryFence>(marker);\n const compactAt = existing?.compactAt ?? this.now() + CATALOG_FENCE_GRACE_MS;\n await txn.put<CatalogExpiryFence>(marker, { expiredAt, compactAt });\n await txn.put<CatalogExpiryGc>(expiryGcKey(runId, compactAt), { runId, compactAt });\n await this.armAtMost(txn, compactAt);\n const deleted = await txn.delete(canonicalKeys);\n await txn.delete(storedKeysKey);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactExpiryFences();\n } catch {\n // Cloudflare retries only six times. Persist a fresh alarm edge so a\n // transient storage failure cannot abandon compaction permanently.\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectStorage | DurableObjectTransaction, at: number) {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async compactExpiryFences(): Promise<void> {\n const now = this.now();\n await this.ctx.storage.transaction(async (txn) => {\n const due = await txn.list<CatalogExpiryGc>({\n prefix: EXPIRY_GC_PREFIX,\n end: `${EXPIRY_GC_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const markerKeys = page.map(([, item]) => expiredKey(item.runId));\n const markers = await txn.get<CatalogExpiryFence>(markerKeys);\n const deletes = page.flatMap(([key, item], index) => {\n const marker = markers.get(markerKeys[index]);\n return marker?.compactAt === item.compactAt ? [key, markerKeys[index]] : [key];\n });\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<CatalogExpiryGc>({ prefix: EXPIRY_GC_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.compactAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type {\n ExpireRunStreamsResult,\n ExpireStreamResult,\n FinalizeRunStreamsResult,\n} from '../../retention.js';\nimport {\n MAX_STREAM_CHUNK_BYTES,\n normalizeStreamError,\n validateStreamReadRequest,\n validateStreamWriteChunks,\n type StreamErrorData,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamTerminalState,\n type StreamWriteResult,\n} from '../../stream-protocol.js';\nimport { DurableObject } from '../do-base.js';\n\ninterface StreamMeta {\n /** Number of durable chunks (also the next chunk index). */\n count: number;\n state: StreamTerminalState;\n ownerRunId?: string;\n error?: StreamErrorData;\n expiredAt?: number;\n expiredChunkCount?: number;\n payloadDeleted?: boolean;\n}\n\ninterface StreamWaiter {\n resolve(reason: 'change' | 'timeout'): void;\n timer: ReturnType<typeof setTimeout>;\n signal?: AbortSignal;\n onAbort?: () => void;\n}\n\ninterface RegistryExpiry {\n expiredAt: number;\n deleted: number;\n}\n\nconst META_KEY = 'meta';\nconst CHUNK_KEY_PREFIX = 'chunk:';\nconst CHUNK_SIZE_KEY_PREFIX = 'chunk-size:';\n/** Registry keys used when this DO instance acts as a per-run stream index. */\nconst STREAM_REGISTRY_PREFIX = 'stream:';\nconst REGISTRY_OWNER_KEY = 'registry:owner';\nconst REGISTRY_EXPIRED_KEY = 'registry:expired';\n/** Each chunk occupies a payload key and a size key; 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;\nconst MAX_STREAM_INDEX = 0x7fffffff;\n\nfunction boundedLimit(value: number | undefined, fallback: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(1, Math.min(maximum, Math.floor(value)));\n}\n\nfunction emptyMeta(): StreamMeta {\n return { count: 0, state: 'open' };\n}\n\nfunction validateMeta(meta: unknown): StreamMeta {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n throw new Error('Invalid persisted stream metadata');\n }\n const candidate = meta as Partial<StreamMeta>;\n if (\n !Number.isSafeInteger(candidate.count) ||\n candidate.count! < 0 ||\n candidate.count! > MAX_STREAM_INDEX ||\n !['open', 'closed', 'errored', 'expired'].includes(candidate.state as StreamTerminalState) ||\n (candidate.ownerRunId !== undefined && typeof candidate.ownerRunId !== 'string') ||\n (candidate.payloadDeleted !== undefined && typeof candidate.payloadDeleted !== 'boolean')\n ) {\n throw new Error('Invalid persisted stream metadata');\n }\n const error = candidate.error;\n if (\n (error !== undefined &&\n (!error ||\n typeof error !== 'object' ||\n typeof error.name !== 'string' ||\n typeof error.message !== 'string')) ||\n (candidate.state === 'errored') !== (error !== undefined)\n ) {\n throw new Error('Invalid persisted stream error metadata');\n }\n return candidate as StreamMeta;\n}\n\n/** Zero-padding keeps storage.list() results in stream offset order. */\nfunction chunkKey(index: number): string {\n return `${CHUNK_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction chunkSizeKey(index: number): string {\n return `${CHUNK_SIZE_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction indexFromChunkSizeKey(key: string): number {\n const suffix = key.slice(CHUNK_SIZE_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk size key \"${key}\"`);\n }\n return index;\n}\n\nfunction indexFromChunkKey(key: string): number {\n const suffix = key.slice(CHUNK_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk key \"${key}\"`);\n }\n return index;\n}\n\nfunction validateChunkSize(size: unknown, index: number): number {\n if (\n typeof size !== 'number' ||\n !Number.isSafeInteger(size) ||\n size < 0 ||\n size > MAX_STREAM_CHUNK_BYTES\n ) {\n throw new Error(`Invalid persisted stream chunk size at index ${index}`);\n }\n return size;\n}\n\nfunction compactChunk(chunk: Uint8Array): Uint8Array {\n return chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength\n ? chunk\n : new Uint8Array(chunk);\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');\n}\n\n/**\n * Durable Object backing workflow streams.\n *\n * Stream cells persist binary chunks under monotonic offset keys. Public\n * reads are bounded long polls, and writes append a bounded ordered batch in\n * one storage transaction. Per-run registry cells retain their existing role.\n */\nexport class StreamDO extends DurableObject {\n private meta: StreamMeta | undefined;\n private metaLoad: Promise<StreamMeta> | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private changeVersion = 0;\n private readonly waiters = new Set<StreamWaiter>();\n\n private async getMeta(): Promise<StreamMeta> {\n if (this.meta) return this.meta;\n this.metaLoad ??= this.ctx.storage.get<StreamMeta>(META_KEY).then((meta) => {\n const loaded = meta === undefined ? emptyMeta() : validateMeta(meta);\n this.meta = loaded;\n return loaded;\n });\n try {\n return await this.metaLoad;\n } catch (error) {\n this.metaLoad = undefined;\n throw error;\n }\n }\n\n private assertOwner(meta: StreamMeta, runId: string): void {\n if (!runId) throw new Error('Stream runId is required');\n if (meta.ownerRunId !== undefined && meta.ownerRunId !== runId) {\n throw new Error(`Stream is owned by workflow run \"${meta.ownerRunId}\"`);\n }\n }\n\n private assertWritable(meta: StreamMeta, runId: string): void {\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state === 'closed') throw new Error('Cannot write to a closed stream');\n if (meta.state === 'errored') throw new Error('Cannot write to an errored stream');\n }\n\n private runMutation<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.mutationTail.then(operation, operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private wakeReaders(): void {\n this.changeVersion += 1;\n for (const waiter of Array.from(this.waiters)) waiter.resolve('change');\n }\n\n private waitForChange(\n observedVersion: number,\n waitMs: number,\n signal?: AbortSignal,\n ): Promise<'change' | 'timeout'> {\n if (signal?.aborted) return Promise.reject(abortReason(signal));\n\n return new Promise<'change' | 'timeout'>((resolve, reject) => {\n let settled = false;\n const waiter: StreamWaiter = {\n timer: setTimeout(() => finish('timeout'), waitMs),\n signal,\n resolve: (reason) => finish(reason),\n };\n\n const cleanup = () => {\n clearTimeout(waiter.timer);\n this.waiters.delete(waiter);\n if (waiter.signal && waiter.onAbort) {\n waiter.signal.removeEventListener('abort', waiter.onAbort);\n }\n };\n const finish = (reason: 'change' | 'timeout') => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(reason);\n };\n waiter.onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(abortReason(signal!));\n };\n\n this.waiters.add(waiter);\n signal?.addEventListener('abort', waiter.onAbort, { once: true });\n\n // A writer may have committed after the caller inspected metadata but\n // before this waiter was installed. The generation check closes that\n // lost-wakeup window without another storage read.\n if (this.changeVersion !== observedVersion) finish('change');\n });\n }\n\n private async readSnapshot(\n request: StreamReadRequest,\n timedOut: boolean,\n ): Promise<StreamReadResult> {\n const meta = await this.getMeta();\n this.assertOwner(meta, request.runId);\n\n const available =\n meta.state === 'expired'\n ? 0\n : Math.max(0, Math.min(request.maxChunks, meta.count - request.startIndex));\n const chunks: Uint8Array[] = [];\n if (available > 0) {\n const indexes = Array.from({ length: available }, (_, offset) => request.startIndex + offset);\n const sizeKeys = indexes.map(chunkSizeKey);\n const storedSizes = await this.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 === undefined ? emptyMeta() : validateMeta(stored);\n this.assertWritable(meta, runId);\n const startIndex = meta.count;\n if (startIndex + chunks.length > MAX_STREAM_INDEX) {\n throw new Error('Stream offset limit exceeded');\n }\n const nextMeta: StreamMeta = {\n count: startIndex + chunks.length,\n state: 'open',\n ownerRunId: runId,\n };\n const entries: 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 === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const closed: StreamMeta = { ...meta, ownerRunId: runId, state: 'closed' };\n await txn.put(META_KEY, closed);\n return closed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Persist a terminal stream failure and wake every pending reader. */\n async failStream(runId: string, error: StreamErrorData | string): Promise<void> {\n const normalized = normalizeStreamError(error);\n await this.runMutation(async () => {\n const nextMeta = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const failed: StreamMeta = {\n ...meta,\n ownerRunId: runId,\n state: 'errored',\n error: normalized,\n };\n await txn.put(META_KEY, failed);\n return failed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Register a stream name against this per-run registry instance. */\n async registerStream(runId: string, name: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error(`Workflow run \"${runId}\" has expired`);\n }\n const owner = await txn.get<string>(REGISTRY_OWNER_KEY);\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n await txn.put(REGISTRY_OWNER_KEY, runId);\n await txn.put(`${STREAM_REGISTRY_PREFIX}${name}`, true);\n });\n }\n\n async listStreams(): Promise<string[]> {\n if ((await this.ctx.storage.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error('Workflow run streams have expired');\n }\n const entries = await this.ctx.storage.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX });\n return Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length));\n }\n\n /** Fence a run's registry before any stream cells are removed. */\n async expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult> {\n const limit = boundedLimit(options?.limit, 16, 128);\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n await txn.put({\n [REGISTRY_OWNER_KEY]: runId,\n [REGISTRY_EXPIRED_KEY]: expiry ?? { expiredAt, deleted: 0 },\n });\n const entries = await txn.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX, limit });\n return {\n streams: Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length)),\n };\n });\n }\n\n /** Remove completed registry entries in a bounded, retry-safe batch. */\n async finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n if (owner !== runId || expiry === undefined) {\n throw new Error(`Stream registry for workflow run \"${runId}\" is not expired`);\n }\n const keys = Array.from(new Set(streams.map((name) => `${STREAM_REGISTRY_PREFIX}${name}`)));\n const removed = keys.length === 0 ? 0 : await txn.delete(keys);\n const deleted = expiry.deleted + removed;\n await txn.put<RegistryExpiry>(REGISTRY_EXPIRED_KEY, { ...expiry, deleted });\n const remaining = await txn.list({ prefix: STREAM_REGISTRY_PREFIX, limit: 1 });\n return { deleted, done: remaining.size === 0 };\n });\n }\n\n /**\n * Fence the stream and delete one bounded page. Listing size keys avoids\n * loading payloads, and the transaction makes a crash retry resume safely.\n */\n async expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult> {\n const limit = boundedLimit(options?.limit, DEFAULT_EXPIRE_CHUNK_LIMIT, MAX_EXPIRE_CHUNK_LIMIT);\n const byteLimit = boundedLimit(\n options?.byteLimit,\n DEFAULT_EXPIRE_BYTE_LIMIT,\n MAX_EXPIRE_BYTE_LIMIT,\n );\n return await this.runMutation(async () => {\n const result = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n const firstFence = meta.state !== 'expired';\n\n const candidates = await txn.list<number>({\n prefix: CHUNK_SIZE_KEY_PREFIX,\n limit: limit + 1,\n });\n const page: Array<{ index: number; size: number }> = [];\n let bytes = 0;\n for (const [key, storedSize] of Array.from(candidates).slice(0, limit)) {\n const index = indexFromChunkSizeKey(key);\n const size = validateChunkSize(storedSize, index);\n if (page.length > 0 && bytes + size > byteLimit) break;\n page.push({ index, size });\n bytes += size;\n }\n\n let payloadFallback = false;\n if (candidates.size === 0) {\n const payloads = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n const first = payloads.entries().next().value;\n if (first) {\n const [key, payload] = first;\n page.push({\n index: indexFromChunkKey(key),\n size: payload instanceof Uint8Array ? payload.byteLength : 0,\n });\n bytes = page[0].size;\n payloadFallback = true;\n }\n }\n\n const keys = page.flatMap(({ index }) => [chunkKey(index), chunkSizeKey(index)]);\n if (keys.length > 0) await txn.delete(keys);\n let done = candidates.size === page.length;\n if (payloadFallback) {\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n } else if (done && candidates.size > 0) {\n // A corrupt/missing size index can otherwise make cleanup report\n // completion while leaving an orphan payload. Verify once after the\n // final staged size-index page; healthy pages return an empty list.\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n }\n if (done && page.length === 0 && meta.state === 'expired' && meta.payloadDeleted) {\n return {\n meta,\n result: { deleted: false, chunks: 0, bytes: 0, done: true },\n };\n }\n const nextMeta: StreamMeta = {\n ...meta,\n count: done ? 0 : meta.count,\n ownerRunId: runId,\n state: 'expired',\n error: undefined,\n expiredAt: meta.expiredAt ?? expiredAt,\n expiredChunkCount: meta.expiredChunkCount ?? meta.count,\n payloadDeleted: done,\n };\n await txn.put(META_KEY, nextMeta);\n return {\n meta: nextMeta,\n result: {\n deleted: firstFence,\n chunks: page.length,\n bytes,\n done,\n } satisfies ExpireStreamResult,\n };\n });\n\n this.meta = result.meta;\n this.metaLoad = Promise.resolve(result.meta);\n this.wakeReaders();\n return result.result;\n });\n }\n}\n","import type { TerminalWorkflowRunStatus, WorkflowRun, WorkflowRunStatus } from '@workflow/world';\n\nexport const CLEANUP_RECORD_KEY = 'retention:cleanup';\nexport const TOMBSTONE_KEY = 'retention:tombstone';\nexport const HOOK_MARKER_PREFIX = 'retention:hook:';\nexport const TERMINAL_CLEANUP_KEY = 'terminal:cleanup';\n\nexport type CleanupPhase = 'retained' | 'index' | 'streams' | 'queues' | 'payload' | 'tombstoned';\n\nexport interface CleanupRecord {\n version: 1;\n runId: string;\n workflowName: string;\n createdAt: Date;\n /** Last status observed when cleanup was scheduled. */\n status?: WorkflowRunStatus;\n /** Present when cleanup was scheduled for a terminal run. */\n completedAt?: Date;\n /** Retained for persisted terminal-retention records created before max-age cleanup. */\n terminalStatus?: TerminalWorkflowRunStatus;\n reason?: 'terminal-retention' | 'maximum-age' | 'manual';\n dueAt: Date;\n queueShards: number;\n phase: CleanupPhase;\n /** Optimistic-concurrency token for alarm/RPC work that awaits another cell. */\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n tombstonedAt?: Date;\n deletedPayloadKeys: number;\n deletedStreams: number;\n deletedQueueMessages: number;\n}\n\nexport interface RunTombstone {\n version: 1;\n runId: string;\n /** Last status observed before the run expired. */\n status?: WorkflowRunStatus;\n completedAt?: Date;\n terminalStatus?: TerminalWorkflowRunStatus;\n expiredAt: Date;\n tombstonedAt: Date;\n /** Final cleanup accounting retained inside the single authoritative record. */\n cleanup: CleanupRecord;\n}\n\nexport type RunLifecycleStatus = 'active' | 'terminal' | 'expired' | 'missing';\n\nexport type RunReadOutcome<T> =\n | { ok: true; value: T }\n | { ok: false; code: 'RUN_EXPIRED'; message: string; tombstone: RunTombstone };\n\nexport interface HookIndexReference {\n hookId: string;\n token: string;\n}\n\nexport interface TerminalCleanupRecord {\n version: 1;\n runId: string;\n phase: 'hooks' | 'markers' | 'waits';\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n}\n\nexport interface ReleaseHookIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n}\n\nexport interface ReleaseHookIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n expiredAt: number;\n}\n\nexport interface ExpireRunIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunStreamsResult {\n streams: string[];\n}\n\nexport interface FinalizeRunStreamsResult {\n /** Cumulative registry entries removed for this run. */\n deleted: number;\n done: boolean;\n}\n\nexport interface ExpireStreamResult {\n /** True only when this call installed the stream's expiration fence. */\n deleted: boolean;\n /** Chunk rows removed by this bounded call. */\n chunks: number;\n /** Payload bytes represented by the removed chunk rows. */\n bytes: number;\n done: boolean;\n}\n\nexport interface QueueExpiryReceipt {\n expiredAt: number;\n deleted: number;\n}\n\nexport type ExpireQueueRunResult = {\n /** Cumulative messages removed for this run in this queue shard. */\n deleted: number;\n} & (\n | { done: false }\n | {\n done: true;\n /** Durable receipt which the cleanup coordinator must acknowledge. */\n receipt: QueueExpiryReceipt;\n }\n);\n\nexport interface AcknowledgeQueueExpiryResult {\n acknowledged: boolean;\n}\n\nexport interface ScheduleCleanupRequest {\n retentionMs: number;\n queueShards: number;\n}\n\nexport interface EnforceRetentionRequest extends ScheduleCleanupRequest {\n /** Cron occurrence being enforced. A run is eligible only at/before this time. */\n scheduledTime: number;\n}\n\nexport type EnforceRetentionResult =\n | { state: 'missing' | 'not-due'; cleanup: null }\n | { state: 'scheduled' | 'expired'; cleanup: CleanupRecord };\n\nexport function sortableTimestamp(date: Date): string {\n return date.getTime().toString().padStart(13, '0');\n}\n\nexport function workflowRunIndexKey(\n run: Pick<WorkflowRun, 'workflowName' | 'createdAt' | 'runId'>,\n) {\n return `run:${run.workflowName}:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function globalRunIndexKey(run: Pick<WorkflowRun, 'createdAt' | 'runId'>) {\n return `runall:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function hookMarkerKey(reference: HookIndexReference): string {\n return `${HOOK_MARKER_PREFIX}${encodeURIComponent(reference.hookId)}:${encodeURIComponent(reference.token)}`;\n}\n\nexport function cleanupTombstone(record: CleanupRecord, now: Date): RunTombstone {\n const cleanup: CleanupRecord = {\n ...record,\n phase: 'tombstoned',\n tombstonedAt: now,\n };\n return {\n version: 1,\n runId: record.runId,\n status: record.status ?? record.terminalStatus,\n terminalStatus: record.terminalStatus,\n completedAt: record.completedAt,\n expiredAt: record.dueAt,\n tombstonedAt: now,\n cleanup,\n };\n}\n\nexport function cleanupFromTombstone(tombstone: RunTombstone): CleanupRecord {\n return tombstone.cleanup;\n}\n\nexport function expiredRead<T>(tombstone: RunTombstone): RunReadOutcome<T> {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n tombstone,\n };\n}\n","import { DurableObject } from '../do-base.js';\nimport {\n createWorkflowIndex,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n type WorkflowIndex,\n} from '../../indexes.js';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { isTerminalWorkflowRunStatus, slotToEventId, WorkflowRunSchema } from '@workflow/world';\nimport {\n applyEvent,\n finalizeEventPage,\n hookClaimCancellationKey,\n type ApplyEventOutcome,\n type ApplyEventRequest,\n EVENT_KEY_PREFIX,\n type EventStore,\n HOOK_CREATED_KEY_PREFIX,\n HOOK_KEY_PREFIX,\n listByCreationTime,\n listByPrefix,\n parseApplyEventRequest,\n STEP_CREATED_KEY_PREFIX,\n STEP_KEY_PREFIX,\n WAIT_KEY_PREFIX,\n} from '../../apply-event.js';\nimport {\n type AcknowledgeQueueExpiryResult,\n CLEANUP_RECORD_KEY,\n type CleanupRecord,\n cleanupFromTombstone,\n cleanupTombstone,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n type ExpireQueueRunResult,\n type ExpireRunStreamsResult,\n type ExpireStreamResult,\n type FinalizeRunStreamsResult,\n expiredRead,\n 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} from '../../retention.js';\nimport { MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS } from '../../lifecycle.js';\nimport { isNonNegativeSafeInteger, isPositiveSafeInteger, isRecord } from '../../validation.js';\n\ninterface CellId {\n toString(): string;\n}\n\ninterface CellNamespace<T> {\n idFromName(name: string): CellId;\n get(id: CellId): T;\n}\n\ninterface StreamCleanupStub {\n expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult>;\n finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult>;\n expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult>;\n}\n\ninterface QueueCleanupStub {\n expireRun(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireQueueRunResult>;\n acknowledgeExpireRun(\n runId: string,\n receipt: QueueExpiryReceipt,\n ): Promise<AcknowledgeQueueExpiryResult>;\n}\n\ninterface WorkflowRunDOEnv {\n WORKFLOW_RUN_CATALOG?: CellNamespace<RunCatalogShardStub>;\n WORKFLOW_HOOK_TOKENS?: CellNamespace<HookTokenShardStub>;\n WORKFLOW_HOOK_IDS?: CellNamespace<HookIdShardStub>;\n WORKFLOW_STREAMS?: CellNamespace<StreamCleanupStub>;\n WORKFLOW_QUEUE?: CellNamespace<QueueCleanupStub>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\nconst STORAGE_BATCH_SIZE = 128;\nconst PAYLOAD_DELETE_BATCH = STORAGE_BATCH_SIZE;\nconst HOOK_MARKER_PAGE_SIZE = 64;\nconst TERMINAL_HOOK_PAGE_SIZE = 64;\nconst TERMINAL_WAIT_PAGE_SIZE = STORAGE_BATCH_SIZE;\nconst STREAMS_PER_CLEANUP_PAGE = 16;\nconst STREAM_CHUNKS_PER_CLEANUP_PAGE = STORAGE_BATCH_SIZE;\nconst STREAM_BYTES_PER_CLEANUP_PAGE = 16 * 1024 * 1024;\nconst QUEUE_REFERENCES_PER_CLEANUP_PAGE = 64;\nconst CLEANUP_RETRY_MAX_MS = 60 * 60 * 1000;\nconst CLEANUP_PROGRESS_KEY = 'retention:progress';\nconst RUN_QUEUE_SHARDS_KEY = 'retention:queue-shards';\nconst MAX_DATE_MS = 8_640_000_000_000_000;\ntype TerminalRun = Extract<WorkflowRun, { status: 'completed' | 'failed' | 'cancelled' }>;\n\nfunction validateCleanupRequest(request: unknown, allowDisabled: boolean): ScheduleCleanupRequest {\n if (!isRecord(request)) {\n throw new Error('world-celld retention request must be an object');\n }\n const validRetention = allowDisabled\n ? isNonNegativeSafeInteger(request.retentionMs)\n : isPositiveSafeInteger(request.retentionMs);\n if (!validRetention) {\n throw new Error(\n `world-celld retentionMs must be a ${allowDisabled ? 'non-negative' : 'positive'} safe integer`,\n );\n }\n if (!isPositiveSafeInteger(request.queueShards)) {\n throw new Error('world-celld retention queueShards must be a positive safe integer');\n }\n return request as unknown as ScheduleCleanupRequest;\n}\n\nfunction retentionDeadline(baseMs: number, retentionMs: number, runId: string): number {\n const dueAtMs = baseMs + retentionMs;\n if (!Number.isSafeInteger(dueAtMs) || dueAtMs > MAX_DATE_MS) {\n throw new Error(`world-celld retention deadline is out of range for ${runId}`);\n }\n return dueAtMs;\n}\n\nfunction cleanupRecord(\n run: WorkflowRun,\n dueAt: Date,\n queueShards: number,\n reason: NonNullable<CleanupRecord['reason']>,\n): CleanupRecord {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n return {\n version: 1,\n runId: run.runId,\n workflowName: run.workflowName,\n createdAt: run.createdAt,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason,\n dueAt,\n queueShards,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueueMessages: 0,\n };\n}\n\ninterface CleanupProgress {\n queueShard: number;\n queueShardDeleted: number;\n pendingAck?: {\n queueShard: number;\n receipt: QueueExpiryReceipt;\n };\n}\n\n/**\n * Adapt DO storage (or a transaction) to the {@link EventStore} interface\n * shared with the test mocks. No casts: the methods line up structurally,\n * this just pins the subset we rely on.\n */\nfunction storeFrom(storage: DurableObjectStorage | DurableObjectTransaction): EventStore {\n return {\n get: (key) => storage.get(key),\n getMany: (keys) => storage.get(keys),\n put: (key, value) => storage.put(key, value),\n delete: (key) => storage.delete(key),\n deleteMany: (keys) => storage.delete(keys),\n list: (options) => storage.list(options),\n deferTerminalCleanup: true,\n };\n}\n\nfunction hookCreationIndexKey(hook: Hook): string {\n return `${HOOK_CREATED_KEY_PREFIX}${hook.createdAt.toISOString()}:${hook.hookId}`;\n}\n\nasync function putStorageEntries(\n storage: DurableObjectTransaction,\n entries: Iterable<readonly [string, unknown]>,\n): Promise<void> {\n const all = Array.from(entries);\n for (let offset = 0; offset < all.length; offset += STORAGE_BATCH_SIZE) {\n await storage.put(Object.fromEntries(all.slice(offset, offset + STORAGE_BATCH_SIZE)));\n }\n}\n\ninterface InflightClaim {\n messageId: string;\n claimedAt: number;\n}\n\n/**\n * Durable Object for managing a single workflow run's state.\n *\n * All event-sourced writes go through {@link applyEvent} inside a single\n * storage transaction: guard checks, the event append, and the entity\n * mutation are atomic even if the DO is evicted mid-operation.\n *\n * Instances named `claim:<queueName>:<idempotencyKey>` are used purely as\n * queue-message dedup claims (see claimInflight/releaseInflight).\n */\nexport class WorkflowRunDO extends DurableObject {\n private now(): number {\n const clock = (this.env as WorkflowRunDOEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n private tombstoneFrom(\n values: Map<string, RunTombstone | CleanupRecord>,\n now = this.now(),\n ): RunTombstone | null {\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) return tombstone;\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (!cleanup || (cleanup.phase === 'retained' && cleanup.dueAt.getTime() > now)) return null;\n return cleanupTombstone(cleanup, cleanup.tombstonedAt ?? cleanup.dueAt);\n }\n\n private async retentionState(\n storage: DurableObjectStorage | DurableObjectTransaction,\n now = this.now(),\n ): Promise<{ cleanup?: CleanupRecord; tombstone: RunTombstone | null }> {\n const values = await storage.get<RunTombstone | CleanupRecord>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n ]);\n return {\n cleanup: values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined,\n tombstone: this.tombstoneFrom(values, now),\n };\n }\n\n private async read<T>(\n reader: (storage: DurableObjectTransaction) => Promise<T>,\n ): Promise<RunReadOutcome<T>> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) return expiredRead(tombstone);\n return { ok: true, value: await reader(txn) };\n });\n }\n\n private async readKey<T>(key: string): Promise<RunReadOutcome<T | null>> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | T>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n key,\n ]);\n const tombstone = this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>);\n if (tombstone) return expiredRead<T | null>(tombstone);\n return { ok: true, value: (values.get(key) as T | undefined) ?? null };\n });\n }\n\n /** Apply an event and capture all retention metadata in the same transaction. */\n async applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome> {\n request = parseApplyEventRequest(request);\n if (this.ctx.id.name !== undefined && request.runId !== this.ctx.id.name) {\n throw new TypeError(\n `applyEvent runId \"${request.runId}\" does not match durable object \"${this.ctx.id.name}\"`,\n );\n }\n if (request.cleanup !== undefined) validateCleanupRequest(request.cleanup, true);\n return await this.ctx.storage.transaction(async (txn) => {\n const now = new Date(this.now());\n const retention = await this.retentionState(txn, now.getTime());\n const { tombstone } = retention;\n if (tombstone) {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${request.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n\n let eventSequence = (await txn.get<number>('event_sequence')) ?? 0;\n const outcome = await applyEvent(storeFrom(txn), {\n ...request,\n nextEventId: () => slotToEventId(++eventSequence),\n now,\n });\n if (!outcome.ok) return outcome;\n\n if (outcome.runCreated && request.cleanup) {\n await txn.put(RUN_QUEUE_SHARDS_KEY, request.cleanup.queueShards);\n }\n\n await txn.put('event_sequence', eventSequence);\n const hookReferences: HookIndexReference[] = outcome.hookToIndex\n ? [\n {\n hookId: outcome.hookToIndex.hookId,\n token: outcome.hookToIndex.token,\n },\n ...outcome.releasedHooks,\n ]\n : outcome.releasedHooks;\n await putStorageEntries(\n txn,\n hookReferences.map((reference) => [hookMarkerKey(reference), reference] as const),\n );\n\n const retentionMs = request.cleanup?.retentionMs ?? 0;\n if (\n retentionMs > 0 &&\n outcome.run &&\n isTerminalWorkflowRunStatus(outcome.run.status) &&\n !retention.cleanup\n ) {\n const terminalRun = outcome.run as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(terminalRun.completedAt.getTime(), retentionMs, terminalRun.runId),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(\n run,\n dueAt,\n request.cleanup?.queueShards ?? 1,\n 'terminal-retention',\n );\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(dueAt);\n outcome.run = run;\n }\n if (outcome.run && isTerminalWorkflowRunStatus(outcome.run.status)) {\n const terminalCleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (!terminalCleanup) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n version: 1,\n runId: outcome.run.runId,\n phase: 'hooks',\n generation: 0,\n attempts: 0,\n });\n }\n await txn.setAlarm(this.now() + 1);\n }\n if (outcome.run) {\n outcome.indexPublicationExpiresAt = now.getTime() + MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS;\n }\n return finalizeEventPage(storeFrom(txn), outcome, request.params);\n });\n }\n\n /**\n * Resolve an ambiguous hook-creation RPC in the same serialization domain as\n * applyEvent. If the hook is absent, the exact reservation is durably fenced\n * before the caller releases its token and hook-ID claims.\n */\n async resolveHookTokenClaim(request: {\n hookId: string;\n token: string;\n claimId: string;\n }): Promise<{ committed: boolean }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n // Once the authoritative expiry record exists (including the logical\n // tombstone at dueAt), a lost-response resolver must not recreate\n // unbounded per-claim state next to the tombstone.\n if (tombstone) return { committed: false };\n const hook = await txn.get<Hook>(`${HOOK_KEY_PREFIX}${request.hookId}`);\n if (hook?.token === request.token) return { committed: true };\n await txn.put(hookClaimCancellationKey(request.claimId), {\n hookId: request.hookId,\n token: request.token,\n canceledAt: this.now(),\n });\n return { committed: false };\n });\n }\n\n async getRun(): Promise<RunReadOutcome<WorkflowRun | null>> {\n return this.readKey<WorkflowRun>('run');\n }\n\n /** Single authoritative lifecycle answer used after derivative compaction. */\n async getLifecycleStatus(): Promise<RunLifecycleStatus> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | WorkflowRun>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n 'run',\n ]);\n if (this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>)) {\n return 'expired';\n }\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return 'missing';\n return isTerminalWorkflowRunStatus(run.status) ? 'terminal' : 'active';\n });\n }\n\n async getStep(stepId: string): Promise<RunReadOutcome<Step | null>> {\n return this.readKey<Step>(`${STEP_KEY_PREFIX}${stepId}`);\n }\n\n async listSteps(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Step[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Step>(storeFrom(txn), STEP_CREATED_KEY_PREFIX, STEP_KEY_PREFIX, {\n limit: params?.limit ?? 20,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getEvent(eventId: string): Promise<RunReadOutcome<Event | null>> {\n return this.readKey<Event>(`${EVENT_KEY_PREFIX}${eventId}`);\n }\n\n async listEvents(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Event[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByPrefix<Event>(\n storeFrom(txn),\n EVENT_KEY_PREFIX,\n {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n },\n (event) => event.eventId,\n ),\n );\n }\n\n async listHooks(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Hook[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Hook>(storeFrom(txn), HOOK_CREATED_KEY_PREFIX, HOOK_KEY_PREFIX, {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getCleanupStatus(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | RunTombstone>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (cleanup) return cleanup;\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n return tombstone ? cleanupFromTombstone(tombstone) : null;\n }\n\n /** Explicitly schedule an existing terminal run, used for opt-in backfills. */\n async scheduleCleanup(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<\n CleanupRecord | RunTombstone | TerminalCleanupRecord | WorkflowRun\n >([CLEANUP_RECORD_KEY, TOMBSTONE_KEY, TERMINAL_CLEANUP_KEY, 'run']);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (existing) return existing;\n if (values.get(TOMBSTONE_KEY)) return null;\n const current = values.get('run') as WorkflowRun | undefined;\n if (!current || !isTerminalWorkflowRunStatus(current.status)) return null;\n const terminalRun = current as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(\n terminalRun.completedAt.getTime(),\n request.retentionMs,\n terminalRun.runId,\n ),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, request.queueShards, 'manual');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(\n values.get(TERMINAL_CLEANUP_KEY) || dueAt.getTime() <= this.now() ? this.now() + 1 : dueAt,\n );\n return cleanup;\n });\n }\n\n /**\n * Apply the fleet-wide maximum-age policy to one authoritative run.\n *\n * The catalog is only a discovery index: eligibility is rechecked from the\n * RunDO's own createdAt. Once eligible, the cleanup deadline immediately\n * becomes an authoritative write/read fence, including for active runs.\n */\n async enforceRetention(request: EnforceRetentionRequest): Promise<EnforceRetentionResult> {\n validateCleanupRequest(request, false);\n if (!Number.isSafeInteger(request.scheduledTime) || request.scheduledTime < 0) {\n throw new Error('world-celld retention scheduledTime must be a non-negative safe integer');\n }\n\n const result = await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<CleanupRecord | RunTombstone | WorkflowRun | number>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n RUN_QUEUE_SHARDS_KEY,\n 'run',\n ]);\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) {\n return {\n state: 'expired',\n cleanup: cleanupFromTombstone(tombstone),\n } satisfies EnforceRetentionResult;\n }\n\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return { state: 'missing', cleanup: null } satisfies EnforceRetentionResult;\n const dueAtMs = retentionDeadline(run.createdAt.getTime(), request.retentionMs, run.runId);\n if (dueAtMs > request.scheduledTime) {\n return { state: 'not-due', cleanup: null } satisfies EnforceRetentionResult;\n }\n\n const dueAt = new Date(dueAtMs);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const storedQueueShards = values.get(RUN_QUEUE_SHARDS_KEY) as number | undefined;\n const queueShards =\n Number.isSafeInteger(storedQueueShards) && (storedQueueShards as number) > 0\n ? (storedQueueShards as number)\n : request.queueShards;\n let cleanup = existing;\n if (!cleanup) {\n cleanup = cleanupRecord(run, dueAt, queueShards, 'maximum-age');\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n } else if (cleanup.phase === 'retained' && dueAtMs < cleanup.dueAt.getTime()) {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n cleanup = {\n ...cleanup,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason: 'maximum-age',\n dueAt,\n generation: cleanup.generation + 1,\n };\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n }\n await txn.setAlarm(this.now() + 1);\n return {\n state: cleanup.dueAt.getTime() <= this.now() ? 'expired' : 'scheduled',\n cleanup,\n } satisfies EnforceRetentionResult;\n });\n\n // Remove the discovery index before returning when possible. The\n // remaining stream/queue/payload pages continue through the run's alarm.\n if (result.state === 'scheduled' || result.state === 'expired') {\n for (let page = 0; page < 2; page++) {\n const cleanup = await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (cleanup?.phase !== 'retained' && cleanup?.phase !== 'index') break;\n await this.executeScheduledCleanupPage();\n }\n return {\n ...result,\n cleanup: (await this.getCleanupStatus()) ?? result.cleanup,\n };\n }\n return result;\n }\n\n async cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n if (!(await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY))) {\n await this.scheduleCleanup(request);\n }\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase === 'tombstoned') return;\n const dueAt = new Date(this.now());\n const run = await txn.get<WorkflowRun>('run');\n if (run) await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n dueAt,\n generation: cleanup.generation + 1,\n });\n await txn.setAlarm(this.now() + 1);\n });\n await this.executeScheduledCleanupPage();\n return this.getCleanupStatus();\n }\n\n async rearmCleanup(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | TerminalCleanupRecord>([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n if (terminalCleanup) {\n await this.ctx.storage.setAlarm(this.now() + 1);\n } else if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n } else {\n await this.ctx.storage.setAlarm(Math.max(this.now() + 1, cleanup.dueAt.getTime()));\n }\n return cleanup ?? null;\n }\n\n async alarm(): Promise<void> {\n await this.executeScheduledCleanupPage();\n }\n\n private namespace<T>(name: keyof WorkflowRunDOEnv): CellNamespace<T> {\n const namespace = (this.env as WorkflowRunDOEnv)?.[name];\n if (!namespace || typeof namespace === 'function') {\n throw new Error(`world-celld retention missing binding ${name}`);\n }\n return namespace as CellNamespace<T>;\n }\n\n private workflowIndex(): WorkflowIndex {\n return createWorkflowIndex({\n runCatalog: this.namespace<RunCatalogShardStub>('WORKFLOW_RUN_CATALOG'),\n hookTokens: this.namespace<HookTokenShardStub>('WORKFLOW_HOOK_TOKENS'),\n hookIds: this.namespace<HookIdShardStub>('WORKFLOW_HOOK_IDS'),\n });\n }\n\n private async setCleanupPhase(\n expected: CleanupRecord,\n next: CleanupRecord['phase'],\n updates: Partial<CleanupRecord> = {},\n continueAt?: number,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n ...updates,\n phase: next,\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n if (continueAt !== undefined) await txn.setAlarm(continueAt);\n });\n }\n\n private async executeScheduledCleanupPage(): Promise<void> {\n const values = await this.ctx.storage.get<CleanupRecord | TerminalCleanupRecord>([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n\n // Once retention is due it is the lifecycle authority. Do not make an\n // expired run wait behind terminal hook/wait disposal; payload cleanup\n // removes that derivative state later in the same bounded state machine.\n if (cleanup && cleanup.phase !== 'tombstoned' && cleanup.dueAt.getTime() <= this.now()) {\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n return;\n }\n\n if (terminalCleanup) {\n try {\n await this.executeTerminalCleanup(terminalCleanup);\n } catch (error) {\n await this.recordTerminalCleanupFailure(error, terminalCleanup);\n }\n return;\n }\n\n if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n return;\n }\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n }\n\n private async executeCleanup(cleanup: CleanupRecord): Promise<void> {\n if (cleanup.phase === 'retained') {\n if (cleanup.dueAt.getTime() > this.now()) {\n await this.ctx.storage.setAlarm(cleanup.dueAt);\n return;\n }\n await this.setCleanupPhase(cleanup, 'index', {}, this.now() + 1);\n return;\n }\n\n if (cleanup.phase === 'index') {\n await this.deleteIndexPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'streams') {\n await this.deleteStreamPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'queues') {\n await this.deleteQueuePage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'payload') {\n await this.deletePayloadBatch();\n }\n }\n\n private async executeTerminalCleanup(cleanup: TerminalCleanupRecord): Promise<void> {\n if (cleanup.phase === 'hooks') {\n await this.deleteTerminalHookPage(cleanup);\n } else if (cleanup.phase === 'markers') {\n await this.deleteTerminalHookMarkerPage(cleanup);\n } else {\n await this.deleteTerminalWaitPage(cleanup);\n }\n }\n\n private async deleteTerminalHookPage(cleanup: TerminalCleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<Hook>({\n prefix: HOOK_KEY_PREFIX,\n limit: TERMINAL_HOOK_PAGE_SIZE + 1,\n });\n const page = Array.from(entries.values()).slice(0, TERMINAL_HOOK_PAGE_SIZE);\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: page.map((hook) => ({ hookId: hook.hookId, token: hook.token })),\n });\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const keys = page.flatMap((hook) => [\n `${HOOK_KEY_PREFIX}${hook.hookId}`,\n hookCreationIndexKey(hook),\n ]);\n if (keys.length > 0) await txn.delete(keys);\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n phase: entries.size <= TERMINAL_HOOK_PAGE_SIZE ? 'markers' : 'hooks',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteTerminalHookMarkerPage(cleanup: TerminalCleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n });\n const page = Array.from(entries).slice(0, HOOK_MARKER_PAGE_SIZE);\n await this.workflowIndex().releaseHookIndexes({\n runId: cleanup.runId,\n hooks: page.map(([, reference]) => reference),\n });\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const keys = page.map(([key]) => key);\n if (keys.length > 0) await txn.delete(keys);\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n phase: entries.size <= HOOK_MARKER_PAGE_SIZE ? 'waits' : 'markers',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteTerminalWaitPage(cleanup: TerminalCleanupRecord): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !current ||\n current.phase !== cleanup.phase ||\n current.generation !== cleanup.generation\n ) {\n return;\n }\n const entries = await txn.list({\n prefix: WAIT_KEY_PREFIX,\n limit: TERMINAL_WAIT_PAGE_SIZE + 1,\n });\n const keys = Array.from(entries.keys()).slice(0, TERMINAL_WAIT_PAGE_SIZE);\n if (keys.length > 0) await txn.delete(keys);\n\n if (entries.size > TERMINAL_WAIT_PAGE_SIZE) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n return;\n }\n\n await txn.delete(TERMINAL_CLEANUP_KEY);\n const retention = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (retention && retention.phase !== 'tombstoned') {\n await txn.setAlarm(Math.max(this.now() + 1, retention.dueAt.getTime()));\n } else {\n await txn.deleteAlarm();\n }\n });\n }\n\n private async deleteIndexPage(cleanup: CleanupRecord): Promise<void> {\n const hookEntries = await this.ctx.storage.list<HookIndexReference>({\n prefix: HOOK_MARKER_PREFIX,\n limit: HOOK_MARKER_PAGE_SIZE + 1,\n });\n const hookMarkers = Array.from(hookEntries).slice(0, HOOK_MARKER_PAGE_SIZE);\n await this.workflowIndex().expireRun({\n runId: cleanup.runId,\n 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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"}
|
|
1
|
+
{"version":3,"file":"testing.js","names":["STORAGE_BATCH_SIZE","isRecord","MAX_RELEASE_BATCH","CLAIM_DEADLINE_PREFIX","pad","recordKey","claimKey","claimDeadlineKey","pad","isRecord"],"sources":["../src/testing/fake-cell.ts","../src/apply-event.ts","../src/worker/auth.ts","../src/worker/index-validation.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/RunCatalogDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/retention.ts","../src/worker/queue-payload-store.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 FakeStorageRead {\n operation: 'get' | 'list';\n keys?: string[];\n options?: FakeListOptions;\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 private readFailure?: {\n predicate: (read: FakeStorageRead) => 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 this.maybeFailRead({ operation: 'get', keys: keyOrKeys });\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 this.maybeFailRead({ operation: 'get', keys: [keyOrKeys] });\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 this.maybeFailRead({ operation: 'list', options });\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 /** Inject one matching storage read failure, including reads inside transactions. */\n failNextRead(\n predicate: (read: FakeStorageRead) => boolean,\n error = new Error('injected fake storage read failure'),\n ): void {\n this.readFailure = { 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 so read failures model transactional reads too. */\n maybeFailRead(read: FakeStorageRead): void {\n if (!this.readFailure?.predicate(read)) return;\n const { error } = this.readFailure;\n this.readFailure = 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 this.storage.maybeFailRead({ operation: 'get', keys: keyOrKeys });\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 this.storage.maybeFailRead({ operation: 'get', keys: [key] });\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 this.storage.maybeFailRead({ operation: 'list', options });\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 * Transactional event-application core shared by the real WorkflowRunDO and\n * the in-memory test mocks.\n *\n * All guard checks, the event append, and the entity mutation happen against a\n * single {@link EventStore}. The Durable Object wraps a call to\n * {@link applyEvent} in `ctx.storage.transaction()`, so the whole operation is\n * atomic; the mocks run it against an in-memory store.\n *\n * Guard semantics are ported from the upstream `@workflow/world-local` /\n * `@workflow/world-postgres` reference implementations (Workflow 5 contract):\n * - run_started on a terminal run -> RunExpiredError\n * - terminal transitions on a terminal run -> EntityConflictError\n * - run_cancelled is idempotent on an already-cancelled run\n * - duplicate step_created / hook_created -> EntityConflictError\n * - step events on a terminal step -> EntityConflictError\n * - step_started before step.retryAfter -> TooEarlyError\n * - error/output/completedAt are cleared whenever a run re-enters a\n * non-final status (WorkflowRunSchema is a discriminated union)\n *\n * Errors are returned as structured outcomes (never thrown) because custom\n * error classes do not survive the Durable Object RPC boundary with their\n * `name` intact — and `@workflow/errors` matches errors by name via `.is()`.\n * The storage layer converts outcomes back into the typed errors.\n */\n\nimport type {\n CreateEventParams,\n CreateEventRequest,\n Event,\n Hook,\n RunCreatedEventRequest,\n Step,\n Wait,\n WorkflowRun,\n} from '@workflow/world';\nimport {\n applyAttributeChanges,\n CreateEventSchema,\n eventIdToSlot,\n EventSchema,\n getMaxEventsPerRun,\n HookSchema,\n isChildEntityCreationEvent,\n isTerminalStepStatus,\n isTerminalWorkflowRunStatus,\n SPEC_VERSION_CURRENT,\n slotToEventId,\n StepSchema,\n validateAttributeChanges,\n WaitSchema,\n WorkflowRunSchema,\n} from '@workflow/world';\nimport { compact } from './util.js';\nimport type { ScheduleCleanupRequest } from './retention.js';\n\n/** Storage key for the run entity. */\nconst RUN_KEY = 'run';\n/** Key prefixes for per-entity storage. */\nexport const EVENT_KEY_PREFIX = 'event:';\nexport const STEP_KEY_PREFIX = 'step:';\nexport const HOOK_KEY_PREFIX = 'hook:';\nexport const WAIT_KEY_PREFIX = 'wait:';\nexport const STEP_CREATED_KEY_PREFIX = 'stepcreated:';\nexport const HOOK_CREATED_KEY_PREFIX = 'hookcreated:';\n/**\n * Marker recording that a hook_created event was committed for a hookId.\n * Mirrors postgres' `workflow_events_entity_creation_unique` partial index:\n * it outlives hook disposal so a replayed hook_created after dispose is\n * rejected as a duplicate instead of resurrecting the hook.\n */\nconst HOOK_EVENT_MARKER_PREFIX = 'hookevent:';\n/** Durable repair record for idempotent post-commit hook-index release. */\nconst HOOK_RELEASE_MARKER_PREFIX = 'hookreleased:';\n/** Exact ambiguous reservations canceled by a serialized RunDO resolution. */\nexport const HOOK_CLAIM_CANCELLATION_PREFIX = 'hookclaimcancelled:';\n/** Workflow-authored attr_set correlation claims. */\nconst ATTRIBUTE_EVENT_MARKER_PREFIX = 'attrevent:';\n/** Durable lazy-hook resume claims, scoped by the containing run DO. */\nconst HOOK_RESUME_CLAIM_PREFIX = 'hookresume:';\n\ninterface HookResumeClaim {\n hookId: string;\n eventId: string;\n payloadDigest?: string;\n}\n\nexport interface EventStoreListOptions {\n prefix: string;\n /** Exclusive lower bound (full key). */\n startAfter?: string;\n /** Exclusive upper bound (full key). */\n end?: string;\n limit?: number;\n reverse?: boolean;\n}\n\n/**\n * Minimal transactional key-value surface, satisfied by\n * `DurableObjectTransaction` / `DurableObjectStorage` and by the in-memory\n * test-mock store. Keys list in lexicographic order (reversed when\n * `reverse: true`).\n */\nexport interface EventStore {\n get<T>(key: string): Promise<T | undefined>;\n /** Optional native multi-key read (128 keys per Durable Object call). */\n getMany?<T>(keys: string[]): Promise<Map<string, T>>;\n put<T>(key: string, value: T): Promise<void>;\n delete(key: string): Promise<boolean>;\n /** Optional native multi-key delete. */\n deleteMany?(keys: string[]): Promise<number>;\n list<T>(options: EventStoreListOptions): Promise<Map<string, T>>;\n /**\n * Celld-only capability: terminal entity cleanup is persisted and paged by\n * WorkflowRunDO alarms instead of running inside the event transaction.\n */\n deferTerminalCleanup?: boolean;\n}\n\nconst STORAGE_BATCH_SIZE = 128;\nconst MAX_ENTITY_PAGE_SIZE = 1000;\n\nasync function getMany<T>(store: EventStore, keys: string[]): Promise<Map<string, T>> {\n if (store.getMany) {\n const result = new Map<string, T>();\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n const page = await store.getMany<T>(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n for (const entry of page) result.set(...entry);\n }\n return result;\n }\n const values = await Promise.all(keys.map((key) => store.get<T>(key)));\n return new Map(\n keys.flatMap((key, index) =>\n values[index] === undefined ? [] : ([[key, values[index] as T]] as Array<[string, T]>),\n ),\n );\n}\n\nasync function deleteMany(store: EventStore, keys: string[]): Promise<number> {\n if (store.deleteMany) {\n let deleted = 0;\n for (let offset = 0; offset < keys.length; offset += STORAGE_BATCH_SIZE) {\n deleted += await store.deleteMany(keys.slice(offset, offset + STORAGE_BATCH_SIZE));\n }\n return deleted;\n }\n const results = await Promise.all(keys.map((key) => store.delete(key)));\n return results.filter(Boolean).length;\n}\n\nexport interface ApplyEventRequest {\n /** The effective run id (already resolved / generated by the caller). */\n runId: string;\n data: CreateEventRequest | RunCreatedEventRequest;\n /** Workflow 5 event-log position and preload options. */\n params?: CreateEventParams;\n /**\n * Current holder of the hook token per the sharded token-ownership index\n * (hook_created only). `null` means the token is unclaimed.\n */\n tokenHolder?: { runId: string; hookId: string } | null;\n /** Exact token/ID reservation fenced on ambiguous-delivery resolution. */\n hookClaimId?: string;\n /** Internal world-celld retention policy captured with the event. */\n cleanup?: ScheduleCleanupRequest;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Validate and canonicalize the untyped fleet-facing applyEvent envelope.\n * This runs before a RunDO transaction starts; in particular, malformed hook\n * events cannot allocate a sequence or touch hook/entity storage.\n */\nexport function parseApplyEventRequest(value: unknown): ApplyEventRequest {\n if (!isRecord(value)) throw new TypeError('applyEvent request must be an object');\n if (typeof value.runId !== 'string' || value.runId.length === 0) {\n throw new TypeError('applyEvent runId must be a non-empty string');\n }\n\n const data = CreateEventSchema.parse(isRecord(value.data) ? compact(value.data) : value.data);\n const params = value.params;\n if (params !== undefined) {\n if (!isRecord(params)) throw new TypeError('applyEvent params must be an object');\n if (\n params.occurredAt !== undefined &&\n (!(params.occurredAt instanceof Date) || Number.isNaN(params.occurredAt.getTime()))\n ) {\n throw new TypeError('applyEvent params.occurredAt must be a valid Date');\n }\n for (const key of ['resumeId', 'resumePayloadDigest', 'sinceCursor'] as const) {\n if (params[key] !== undefined && typeof params[key] !== 'string') {\n throw new TypeError(`applyEvent params.${key} must be a string`);\n }\n }\n if (\n params.eventCount !== undefined &&\n (typeof params.eventCount !== 'number' ||\n !Number.isSafeInteger(params.eventCount) ||\n params.eventCount < 0)\n ) {\n throw new TypeError('applyEvent params.eventCount must be a non-negative safe integer');\n }\n for (const key of ['skipPreload', 'preloadEvents'] as const) {\n if (params[key] !== undefined && params[key] !== true) {\n throw new TypeError(`applyEvent params.${key} must be true when present`);\n }\n }\n }\n\n let tokenHolder: ApplyEventRequest['tokenHolder'];\n if (value.tokenHolder === null) {\n tokenHolder = null;\n } else if (value.tokenHolder !== undefined) {\n if (\n !isRecord(value.tokenHolder) ||\n typeof value.tokenHolder.runId !== 'string' ||\n value.tokenHolder.runId.length === 0 ||\n typeof value.tokenHolder.hookId !== 'string' ||\n value.tokenHolder.hookId.length === 0\n ) {\n throw new TypeError('applyEvent tokenHolder must contain non-empty runId and hookId strings');\n }\n tokenHolder = { runId: value.tokenHolder.runId, hookId: value.tokenHolder.hookId };\n }\n\n if (\n value.hookClaimId !== undefined &&\n (typeof value.hookClaimId !== 'string' || value.hookClaimId.length === 0)\n ) {\n throw new TypeError('applyEvent hookClaimId must be a non-empty string');\n }\n\n return {\n runId: value.runId,\n data,\n ...(params === undefined ? {} : { params }),\n ...(value.tokenHolder === undefined ? {} : { tokenHolder }),\n ...(value.hookClaimId === undefined ? {} : { hookClaimId: value.hookClaimId }),\n ...(value.cleanup === undefined ? {} : { cleanup: value.cleanup as ScheduleCleanupRequest }),\n };\n}\n\nexport type ApplyEventErrorCode =\n | 'RUN_NOT_FOUND'\n | 'STEP_NOT_FOUND'\n | 'HOOK_NOT_FOUND'\n | 'WAIT_NOT_FOUND'\n | 'ENTITY_CONFLICT'\n | 'HOOK_CLAIM_CANCELLED'\n | 'RUN_EXPIRED'\n | 'TOO_EARLY'\n | 'RUN_NOT_SUPPORTED';\n\nexport interface ApplyEventFailure {\n ok: false;\n code: ApplyEventErrorCode;\n message: string;\n /** Seconds until retry is allowed (TOO_EARLY only). */\n retryAfterSeconds?: number;\n /** The run's spec version (RUN_NOT_SUPPORTED only). */\n runSpecVersion?: number;\n}\n\nexport interface ApplyEventSuccess {\n ok: true;\n /** Absent for idempotent replays that record no new event. */\n event?: Event;\n run?: WorkflowRun;\n step?: Step;\n hook?: Hook;\n wait?: Wait;\n /** True when a lazy step_started atomically created its step. */\n stepCreated?: true;\n /** Hooks whose token and ID indexes must be released. */\n releasedHooks: Array<{ hookId: string; token: string }>;\n /** Set when a run entity was created (run_created or resilient bootstrap). */\n runCreated?: { workflowName: string; createdAt: Date };\n /** Set when the sharded hook indexes must be (re)written. */\n hookToIndex?: Hook;\n /** All events (ascending), preloaded for run_started responses. */\n events?: Event[];\n /** Pagination metadata required whenever events are returned. */\n cursor?: string | null;\n hasMore?: boolean;\n /** Server-owned event ceiling advertised on run lifecycle writes. */\n maxEvents?: number;\n /** Deadline for publishing this authoritative mutation to derivative indexes. */\n indexPublicationExpiresAt?: number;\n}\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","/**\n * Bearer-token auth for the worker router.\n *\n * Fails closed: when the WORLD_SECRET var is not configured, every protected\n * route returns 503 instead of forwarding unauthenticated traffic (the\n * eve-ambient celld-worker pattern).\n */\n\n/**\n * Constant-time string comparison via SHA-256 digests (digest-then-compare\n * is length-independent). crypto.subtle is global in both workerd and Node.\n */\nexport async function timingSafeEqual(a: string, b: string): Promise<boolean> {\n const enc = new TextEncoder();\n const [da, db] = await Promise.all([\n crypto.subtle.digest('SHA-256', enc.encode(a)),\n crypto.subtle.digest('SHA-256', enc.encode(b)),\n ]);\n const va = new Uint8Array(da);\n const vb = new Uint8Array(db);\n let diff = 0;\n for (let i = 0; i < va.length; i++) {\n diff |= va[i] ^ vb[i];\n }\n return diff === 0;\n}\n\nexport type AuthResult = { ok: true } | { ok: false; response: Response };\n\nexport async function authenticate(\n request: Request,\n secret: string | undefined,\n): Promise<AuthResult> {\n if (!secret) {\n return {\n ok: false,\n response: Response.json(\n { error: { name: 'WorldNotConfigured', message: 'WORLD_SECRET is not configured' } },\n { status: 503 },\n ),\n };\n }\n\n const header = request.headers.get('authorization') ?? '';\n const token = header.startsWith('Bearer ') ? header.slice('Bearer '.length) : '';\n if (!token || !(await timingSafeEqual(token, secret))) {\n return {\n ok: false,\n response: Response.json(\n { error: { name: 'Unauthorized', message: 'invalid or missing bearer token' } },\n { status: 401 },\n ),\n };\n }\n\n return { ok: true };\n}\n","import { HookSchema, WorkflowRunSchema, type WorkflowRun } from '@workflow/world';\nimport type { HookTokenOwner } from '../config.js';\nimport type { HookReservation, IndexListOptions } from '../indexes.js';\nimport type { ExpireRunIndexesRequest, ReleaseHookIndexesRequest } from '../retention.js';\nimport { isRecord } from '../validation.js';\nimport { parse } from '../vendor/shared/index.js';\n\nexport type IndexOperation =\n | 'runs.list'\n | 'runs.commit'\n | 'runs.expire'\n | 'hooks.reserve'\n | 'hooks.finalize'\n | 'hooks.release-reservation'\n | 'hooks.release';\n\nexport type ValidatedIndexRequest =\n | { operation: 'runs.list'; args: [IndexListOptions | undefined] }\n | { operation: 'runs.commit'; args: [WorkflowRun, string, number] }\n | { operation: 'runs.expire'; args: [ExpireRunIndexesRequest] }\n | { operation: 'hooks.reserve'; args: [string, HookTokenOwner] }\n | {\n operation: 'hooks.finalize';\n args: [string, string, string, HookTokenOwner, HookReservation | undefined];\n }\n | {\n operation: 'hooks.release-reservation';\n args: [string, HookTokenOwner, HookReservation];\n }\n | { operation: 'hooks.release'; args: [ReleaseHookIndexesRequest] };\n\nfunction invalid(message: string): never {\n const error = new Error(`invalid index RPC arguments: ${message}`);\n error.name = 'RequestValidationError';\n throw error;\n}\n\nfunction exactArgs(args: unknown[], count: number): void {\n if (args.length !== count) invalid(`expected ${count} argument(s)`);\n}\n\nfunction nonEmptyString(value: unknown, name: string): string {\n if (typeof value !== 'string' || value.length === 0)\n invalid(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction stringValue(value: unknown, name: string): string {\n if (typeof value !== 'string') invalid(`${name} must be a string`);\n return value;\n}\n\nfunction nonNegativeSafeInteger(value: unknown, name: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n invalid(`${name} must be a non-negative safe integer`);\n }\n return value as number;\n}\n\nfunction positiveSafeInteger(value: unknown, name: string): number {\n const parsed = nonNegativeSafeInteger(value, name);\n if (parsed === 0) invalid(`${name} must be a positive safe integer`);\n return parsed;\n}\n\nfunction owner(value: unknown, name = 'owner'): HookTokenOwner {\n if (!isRecord(value)) invalid(`${name} must be an object`);\n return {\n runId: nonEmptyString(value.runId, `${name}.runId`),\n hookId: nonEmptyString(value.hookId, `${name}.hookId`),\n };\n}\n\nfunction reservation(value: unknown): HookReservation {\n if (!isRecord(value)) invalid('reservation must be an object');\n const parsed: HookReservation = {\n claimId: nonEmptyString(value.claimId, 'reservation.claimId'),\n };\n if (value.tokenClaimId !== undefined) {\n parsed.tokenClaimId = nonEmptyString(value.tokenClaimId, 'reservation.tokenClaimId');\n }\n if (value.hookIdClaimId !== undefined) {\n parsed.hookIdClaimId = nonEmptyString(value.hookIdClaimId, 'reservation.hookIdClaimId');\n }\n return parsed;\n}\n\nfunction hooks(value: unknown): Array<{ hookId: string; token: string }> {\n if (!Array.isArray(value)) invalid('hooks must be an array');\n return value.map((entry, index) => {\n if (!isRecord(entry)) invalid(`hooks[${index}] must be an object`);\n return {\n hookId: nonEmptyString(entry.hookId, `hooks[${index}].hookId`),\n token: nonEmptyString(entry.token, `hooks[${index}].token`),\n };\n });\n}\n\nfunction exactProperties(value: Record<string, unknown>, allowed: string[], name: string): void {\n const unexpected = Object.keys(value).find((key) => !allowed.includes(key));\n if (unexpected !== undefined) invalid(`${name}.${unexpected} is not allowed`);\n}\n\nfunction releaseRequest(value: unknown): ReleaseHookIndexesRequest {\n if (!isRecord(value)) invalid('release request must be an object');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n };\n}\n\nfunction expireRequest(value: unknown): ExpireRunIndexesRequest {\n if (!isRecord(value)) invalid('expiry request must be an object');\n exactProperties(value, ['runId', 'hooks', 'expiredAt'], 'request');\n return {\n runId: nonEmptyString(value.runId, 'request.runId'),\n hooks: hooks(value.hooks),\n expiredAt: nonNegativeSafeInteger(value.expiredAt, 'request.expiredAt'),\n };\n}\n\nfunction listOptions(value: unknown): IndexListOptions | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isRecord(value)) invalid('list options must be an object');\n const parsed: IndexListOptions = {};\n for (const name of ['prefix', 'cursor', 'end'] as const) {\n if (value[name] !== undefined) parsed[name] = stringValue(value[name], `options.${name}`);\n }\n if (value.limit !== undefined) {\n const limit = value.limit;\n if (!Number.isSafeInteger(limit) || (limit as number) < 1 || (limit as number) > 1000) {\n invalid('options.limit must be an integer between 1 and 1000');\n }\n parsed.limit = limit as number;\n }\n if (value.reverse !== undefined) {\n if (typeof value.reverse !== 'boolean') invalid('options.reverse must be a boolean');\n parsed.reverse = value.reverse;\n }\n return parsed;\n}\n\nfunction runCommit(args: unknown[]): ValidatedIndexRequest {\n exactArgs(args, 3);\n const parsedRun = WorkflowRunSchema.safeParse(args[0]);\n if (!parsedRun.success) invalid('run does not match WorkflowRunSchema');\n const run = parsedRun.data;\n nonEmptyString(run.runId, 'run.runId');\n nonEmptyString(run.workflowName, 'run.workflowName');\n nonEmptyString(run.deploymentId, 'run.deploymentId');\n const serializedMetadata = nonEmptyString(args[1], 'serializedMetadata');\n let metadata: unknown;\n try {\n metadata = JSON.parse(serializedMetadata);\n } catch {\n invalid('serializedMetadata must be valid JSON');\n }\n if (\n !isRecord(metadata) ||\n metadata.runId !== run.runId ||\n metadata.status !== run.status ||\n metadata.createdAt !== run.createdAt.toISOString()\n ) {\n invalid('serializedMetadata must match the committed run');\n }\n const publicationExpiresAt = positiveSafeInteger(args[2], 'publicationExpiresAt');\n return { operation: 'runs.commit', args: [run, serializedMetadata, publicationExpiresAt] };\n}\n\nfunction hookFinalize(args: unknown[]): ValidatedIndexRequest {\n if (args.length !== 4 && args.length !== 5) invalid('expected 4 or 5 arguments');\n const token = nonEmptyString(args[0], 'token');\n const hookId = nonEmptyString(args[1], 'hookId');\n const serializedHook = nonEmptyString(args[2], 'serializedHook');\n const hookOwner = owner(args[3]);\n if (hookOwner.hookId !== hookId) invalid('owner.hookId must match hookId');\n let decodedHook: unknown;\n try {\n decodedHook = parse<unknown>(serializedHook);\n } catch {\n invalid('serializedHook must be valid tagged JSON');\n }\n const parsedHook = HookSchema.safeParse(decodedHook);\n if (!parsedHook.success) invalid('serializedHook does not match HookSchema');\n if (\n parsedHook.data.runId !== hookOwner.runId ||\n parsedHook.data.hookId !== hookId ||\n parsedHook.data.token !== token ||\n !parsedHook.data.runId ||\n !parsedHook.data.hookId ||\n !parsedHook.data.token\n ) {\n invalid('serializedHook must match token, hookId, and owner');\n }\n const hookReservation =\n args[4] === undefined || args[4] === null ? undefined : reservation(args[4]);\n return {\n operation: 'hooks.finalize',\n args: [token, hookId, serializedHook, hookOwner, hookReservation],\n };\n}\n\nexport function validateIndexRequest(\n operation: IndexOperation,\n args: unknown[],\n): ValidatedIndexRequest {\n switch (operation) {\n case 'runs.list':\n if (args.length > 1) invalid('expected at most 1 argument');\n return { operation, args: [listOptions(args[0])] };\n case 'runs.commit':\n return runCommit(args);\n case 'runs.expire':\n exactArgs(args, 1);\n return { operation, args: [expireRequest(args[0])] };\n case 'hooks.reserve':\n exactArgs(args, 2);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1])],\n };\n case 'hooks.finalize':\n return hookFinalize(args);\n case 'hooks.release-reservation':\n exactArgs(args, 3);\n return {\n operation,\n args: [nonEmptyString(args[0], 'token'), owner(args[1]), reservation(args[2])],\n };\n case 'hooks.release':\n exactArgs(args, 1);\n return { operation, args: [releaseRequest(args[0])] };\n default:\n return invalid('unknown operation');\n }\n}\n\nexport const INDEX_OPERATIONS = new Set<IndexOperation>([\n 'runs.list',\n 'runs.commit',\n 'runs.expire',\n 'hooks.reserve',\n 'hooks.finalize',\n 'hooks.release-reservation',\n 'hooks.release',\n]);\n","/**\n * Worker-level HTTP router: the fleet-facing RPC surface of the celld world.\n *\n * Routes:\n * GET /v1/health — liveness + spec version (unauthenticated)\n * POST /v1/rpc/{binding}/{name}/{method} — DO RPC (bearer auth)\n * POST /v1/index/{domain}/{method} — cohesive index operation\n * GET /v1/streams/{name}/chunks — bounded binary long-poll read\n * POST /v1/streams/{name}/chunks — bounded binary batch append\n *\n * Generic RPC bodies use the tagged JSON codec. Stream chunk bodies use the\n * compact binary stream protocol. Only whitelisted routes/methods dispatch.\n */\nimport { SPEC_VERSION_CURRENT } from '@workflow/world';\nimport { parseApplyEventRequest } from '../apply-event.js';\nimport { rpcParse, rpcStringify } from '../codec.js';\nimport {\n createWorkflowIndex,\n type CellNamespaceLike,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n} from '../indexes.js';\nimport {\n MAX_STREAM_BATCH_BYTES,\n MAX_STREAM_CHUNK_BYTES,\n MAX_STREAM_LONG_POLL_MS,\n MAX_STREAM_READ_BYTES,\n 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';\nimport { INDEX_OPERATIONS, type IndexOperation, validateIndexRequest } from './index-validation.js';\nimport {\n NATIVE_QUEUE_MAX_MESSAGE_BYTES,\n queueClaimName,\n queueOrphanName,\n queuePayloadObjectKey,\n validateNativeQueueEnvelope,\n validateNativeQueueSendOptions,\n type NativeQueueEnvelope,\n type QueuePayloadOrphan,\n type QueuePayloadRegistration,\n} from '../queue-protocol.js';\nimport type { QueuePayloadStore } from './queue-payload-store.js';\n\nexport const WORLD_NAME = 'world-celld';\nexport const WORLD_VERSION = '0.1.0';\n\n/** Minimal structural DO namespace type (celld provides the real thing). */\nexport interface DONamespaceLike {\n idFromName(name: string): { toString(): string };\n get(id: { toString(): string }): unknown;\n}\n\ninterface NativeQueueBindingLike {\n send(body: string, options?: { contentType?: 'text'; delaySeconds?: number }): Promise<unknown>;\n}\n\nexport interface QueueRunStub {\n registerQueuePayload(\n registration: QueuePayloadRegistration,\n ): Promise<{ ok: true } | { ok: false; message: string }>;\n finalizeQueuePayload(messageId: string): Promise<{ ok: true } | { ok: false; message: string }>;\n unregisterQueuePayload(messageId: string): Promise<void>;\n scheduleQueuePayloadOrphan(orphan: QueuePayloadOrphan): Promise<void>;\n cancelQueuePayloadOrphan(messageId: string): Promise<void>;\n reserveQueueMessage(params: {\n messageId: string;\n expiresAt: number;\n }): Promise<{ admitted: boolean; messageId: string }>;\n completeQueueMessage(messageId: string): Promise<void>;\n claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean; retryAt?: number }>;\n holdInflight(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }>;\n releaseInflight(messageId?: string): Promise<void>;\n}\n\nexport interface WorkerEnv {\n WORKFLOW_DB: DONamespaceLike;\n WORKFLOW_STREAMS: DONamespaceLike;\n WORKFLOW_RUN_CATALOG: DONamespaceLike;\n WORKFLOW_HOOK_TOKENS: DONamespaceLike;\n WORKFLOW_HOOK_IDS: DONamespaceLike;\n WORKFLOW_QUEUE: NativeQueueBindingLike;\n WORKFLOW_QUEUE_PAYLOADS?: QueuePayloadStore;\n WORLD_SECRET?: string;\n WORKFLOW_CALLBACK_SECRET?: string;\n WORKFLOW_RETENTION_MS?: string | number;\n WORKFLOW_RETENTION_BATCH_SIZE?: string | number;\n}\n\nfunction workflowIndex(env: WorkerEnv) {\n return createWorkflowIndex({\n runCatalog: env.WORKFLOW_RUN_CATALOG as CellNamespaceLike<RunCatalogShardStub>,\n hookTokens: env.WORKFLOW_HOOK_TOKENS as CellNamespaceLike<HookTokenShardStub>,\n hookIds: env.WORKFLOW_HOOK_IDS as CellNamespaceLike<HookIdShardStub>,\n });\n}\n\nconst BINDINGS: Record<string, { env: keyof WorkerEnv; methods: ReadonlySet<string> }> = {\n runs: {\n env: 'WORKFLOW_DB',\n methods: new Set([\n 'applyEvent',\n 'getLifecycleStatus',\n 'getRun',\n 'getStep',\n 'getEvent',\n 'listEvents',\n 'listSteps',\n 'listHooks',\n 'getCleanupStatus',\n 'scheduleCleanup',\n 'cleanupNow',\n 'rearmCleanup',\n 'resolveHookTokenClaim',\n ]),\n },\n streams: {\n env: 'WORKFLOW_STREAMS',\n methods: new Set([\n 'closeStream',\n 'failStream',\n 'registerStream',\n 'listStreams',\n 'expireRegistry',\n 'finalizeRegistry',\n 'expireStream',\n ]),\n },\n 'hook-tokens': {\n env: 'WORKFLOW_HOOK_TOKENS',\n methods: new Set(['get']),\n },\n 'hook-ids': {\n env: 'WORKFLOW_HOOK_IDS',\n methods: new Set(['get']),\n },\n};\n\n/** Request body cap: oversize payloads get a clear 413 instead of an OOM. */\nconst MAX_BODY_BYTES = 32 * 1024 * 1024;\nconst MAX_STREAM_WRITE_BODY_BYTES = MAX_STREAM_BATCH_BYTES + 1024;\nconst QUEUE_ORPHAN_GRACE_MS = 5 * 24 * 60 * 60 * 1000;\n\nfunction errorResponse(status: number, name: string, message: string): Response {\n return Response.json({ error: { name, message } }, { status });\n}\n\nfunction hasContentType(request: Request, expected: string): boolean {\n return (\n request.headers.get('content-type')?.split(';', 1)[0].trim().toLowerCase() ===\n expected.toLowerCase()\n );\n}\n\nfunction declaredContentLength(request: Request): number | null {\n const raw = request.headers.get('content-length');\n if (raw === null) return null;\n if (!/^\\d+$/.test(raw)) {\n const error = new Error('content-length must be a non-negative integer');\n error.name = 'RequestValidationError';\n throw error;\n }\n const value = Number(raw);\n if (!Number.isSafeInteger(value)) {\n const error = new Error('content-length is out of range');\n error.name = 'RequestValidationError';\n throw error;\n }\n return value;\n}\n\nfunction decodePathComponent(value: string, name: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n const error = new Error(`${name} has malformed percent encoding`);\n error.name = 'RequestValidationError';\n throw error;\n }\n}\n\nasync function readBoundedBody(request: Request): Promise<string | null> {\n if (!request.body) return '';\n const reader = request.body.getReader();\n const decoder = new TextDecoder();\n let total = 0;\n let text = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > MAX_BODY_BYTES) {\n await reader.cancel('RPC body exceeds configured limit').catch(() => undefined);\n return null;\n }\n text += decoder.decode(value, { stream: true });\n }\n return text + decoder.decode();\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function readBoundedBytes(request: Request, maxBytes: number): Promise<Uint8Array | null> {\n if (!request.body) return new Uint8Array();\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel('stream body exceeds configured limit').catch(() => undefined);\n return null;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nasync function parseRpcArguments(request: Request): Promise<unknown[] | Response> {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n return Array.isArray(parsed)\n ? parsed\n : errorResponse(400, 'BadRequest', 'body must be an argument array');\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n}\n\nfunction parseBoundedInteger(url: URL, name: string, minimum: number, maximum: number): number {\n const raw = url.searchParams.get(name);\n const value = raw !== null && /^\\d+$/.test(raw) ? Number(raw) : Number.NaN;\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n const error = new Error(`${name} must be an integer between ${minimum} and ${maximum}`);\n error.name = 'StreamProtocolError';\n throw error;\n }\n return value;\n}\n\nfunction streamResponse(body: Uint8Array): Response {\n return new Response(body, {\n status: 200,\n headers: { '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 if (request.method !== 'GET') {\n return errorResponse(405, 'MethodNotAllowed', 'expected GET');\n }\n return Response.json({\n ok: true,\n name: WORLD_NAME,\n version: WORLD_VERSION,\n specVersion: SPEC_VERSION_CURRENT,\n });\n }\n\n const auth = await authenticate(request, env.WORLD_SECRET);\n if (!auth.ok) {\n return auth.response;\n }\n\n if (parts[1] === 'queue' && parts.length === 3) {\n const parsed = await parseRpcArguments(request);\n if (parsed instanceof Response) return parsed;\n\n if (parts[2] === 'send') {\n if (parsed.length < 1 || parsed.length > 2) {\n return errorResponse(400, 'BadRequest', 'queue send expects an envelope and options');\n }\n if (!env.WORKFLOW_QUEUE) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_QUEUE');\n }\n let envelope: NativeQueueEnvelope;\n let options;\n try {\n envelope = validateNativeQueueEnvelope(parsed[0]);\n options = validateNativeQueueSendOptions(parsed[1]);\n if (envelope.body === undefined || envelope.payloadKey !== undefined) {\n throw new TypeError('queue send requires an inline body');\n }\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n try {\n const namespace = env.WORKFLOW_DB;\n const payloadStore = env.WORKFLOW_QUEUE_PAYLOADS;\n const payloadKey = envelope.runId\n ? queuePayloadObjectKey(envelope.runId, envelope.messageId)\n : undefined;\n const brokerEnvelope: NativeQueueEnvelope = payloadKey\n ? { ...envelope, payloadKey, body: undefined }\n : envelope;\n const encoded = JSON.stringify(brokerEnvelope);\n if (new TextEncoder().encode(encoded).byteLength > NATIVE_QUEUE_MAX_MESSAGE_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `native queue envelope exceeds ${NATIVE_QUEUE_MAX_MESSAGE_BYTES} bytes`,\n );\n }\n\n const now = Date.now();\n const reservationExpiresAt =\n Math.max(now, envelope.notBefore ?? now) + QUEUE_ORPHAN_GRACE_MS;\n let claim: QueueRunStub | undefined;\n if (envelope.idempotencyKey) {\n claim = namespace.get(\n namespace.idFromName(queueClaimName(envelope.queueName, envelope.idempotencyKey)),\n ) as QueueRunStub;\n const reservation = await claim.reserveQueueMessage({\n messageId: envelope.messageId,\n expiresAt: reservationExpiresAt,\n });\n if (!reservation.admitted) {\n return new Response(rpcStringify({ messageId: reservation.messageId }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n }\n }\n\n if (envelope.runId && payloadKey) {\n if (!payloadStore) {\n return errorResponse(\n 500,\n 'WorldMisconfigured',\n 'missing binding: WORKFLOW_QUEUE_PAYLOADS',\n );\n }\n const run = namespace.get(namespace.idFromName(envelope.runId)) as QueueRunStub;\n const orphanExpiresAt = reservationExpiresAt;\n const registered = await run.registerQueuePayload({\n messageId: envelope.messageId,\n key: payloadKey,\n orphanExpiresAt,\n });\n if (!registered.ok) {\n await claim?.completeQueueMessage(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', registered.message);\n }\n const orphan = namespace.get(\n namespace.idFromName(queueOrphanName(envelope.messageId)),\n ) as QueueRunStub;\n try {\n await orphan.scheduleQueuePayloadOrphan({\n messageId: envelope.messageId,\n runId: envelope.runId,\n key: payloadKey,\n expiresAt: orphanExpiresAt,\n });\n } catch (error) {\n await run.unregisterQueuePayload(envelope.messageId);\n await claim?.completeQueueMessage(envelope.messageId);\n throw error;\n }\n try {\n await payloadStore.write(payloadKey, envelope.body, {\n runId: envelope.runId,\n messageId: envelope.messageId,\n });\n } catch (error) {\n await claim?.completeQueueMessage(envelope.messageId);\n throw error;\n }\n let finalized: Awaited<ReturnType<QueueRunStub['finalizeQueuePayload']>>;\n try {\n finalized = await run.finalizeQueuePayload(envelope.messageId);\n } catch (error) {\n await claim?.completeQueueMessage(envelope.messageId);\n throw error;\n }\n if (!finalized.ok) {\n await payloadStore.delete(payloadKey);\n await run.unregisterQueuePayload(envelope.messageId);\n await orphan.cancelQueuePayloadOrphan(envelope.messageId);\n await claim?.completeQueueMessage(envelope.messageId);\n return errorResponse(410, 'RunExpiredError', finalized.message);\n }\n }\n await env.WORKFLOW_QUEUE.send(encoded, {\n contentType: 'text',\n ...options,\n });\n return new Response(rpcStringify({ messageId: envelope.messageId }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n const err = error as { name?: string; message?: string };\n return errorResponse(500, err.name ?? 'Error', err.message ?? String(error));\n }\n }\n\n return errorResponse(404, 'NotFound', `unknown queue operation: ${parts[2]}`);\n }\n\n if (parts[1] === 'index' && parts.length === 4) {\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n for (const required of [\n 'WORKFLOW_RUN_CATALOG',\n 'WORKFLOW_HOOK_TOKENS',\n 'WORKFLOW_HOOK_IDS',\n ] as const) {\n if (!env[required]) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${required}`);\n }\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n const operation = `${parts[2]}.${parts[3]}`;\n if (!INDEX_OPERATIONS.has(operation as IndexOperation)) {\n return errorResponse(404, 'NotFound', `unknown index operation: ${operation}`);\n }\n let validated;\n try {\n validated = validateIndexRequest(operation as IndexOperation, args);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n try {\n const index = workflowIndex(env);\n let result: unknown;\n switch (validated.operation) {\n case 'runs.list':\n result = await index.listRuns(...validated.args);\n break;\n case 'runs.commit':\n result = await index.commitRun(...validated.args);\n break;\n case 'runs.expire':\n result = await index.expireRun(...validated.args);\n break;\n case 'hooks.reserve':\n result = await index.reserveHook(...validated.args);\n break;\n case 'hooks.finalize':\n result = await index.finalizeHookIndexes(...validated.args);\n break;\n case 'hooks.release-reservation':\n result = await index.releaseHookReservation(...validated.args);\n break;\n case 'hooks.release':\n result = await index.releaseHookIndexes(...validated.args);\n break;\n }\n return new Response(rpcStringify(result ?? null), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n { status: 500 },\n );\n }\n }\n\n if (parts[1] === 'streams' && parts.length === 4 && parts[3] === 'chunks') {\n const runId = url.searchParams.get('runId');\n if (!runId) return errorResponse(400, 'BadRequest', 'runId is required');\n let name: string;\n try {\n name = decodePathComponent(parts[2], 'stream name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n\n try {\n if (request.method === 'POST') {\n if (!hasContentType(request, STREAM_BATCH_CONTENT_TYPE)) {\n return errorResponse(415, 'UnsupportedMediaType', STREAM_BATCH_CONTENT_TYPE);\n }\n const contentLength = declaredContentLength(request);\n if (contentLength !== null && contentLength > MAX_STREAM_WRITE_BODY_BYTES) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const body = await readBoundedBytes(request, MAX_STREAM_WRITE_BODY_BYTES);\n if (body === null) {\n return errorResponse(\n 413,\n 'PayloadTooLarge',\n `body exceeds ${MAX_STREAM_WRITE_BODY_BYTES} bytes`,\n );\n }\n const chunks = decodeStreamWriteBatch(body);\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n writeChunks(runId: string, chunks: Uint8Array[]): Promise<StreamWriteResult>;\n };\n const result = await stub.writeChunks(runId, chunks);\n return streamResponse(encodeStreamWriteResult(result));\n }\n\n if (request.method === 'GET') {\n const readRequest = {\n runId,\n startIndex: parseBoundedInteger(url, 'startIndex', 0, 0x7fffffff),\n maxChunks: parseBoundedInteger(url, 'maxChunks', 0, 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 } satisfies StreamReadRequest;\n const namespace = env.WORKFLOW_STREAMS;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', 'missing binding: WORKFLOW_STREAMS');\n }\n const stub = namespace.get(namespace.idFromName(name)) as {\n readChunks(request: StreamReadRequest, signal?: AbortSignal): Promise<StreamReadResult>;\n };\n const result = await stub.readChunks(readRequest, request.signal);\n return streamResponse(encodeStreamReadResult(result));\n }\n\n return errorResponse(405, 'MethodNotAllowed', 'expected GET or POST');\n } catch (error) {\n const err = error as { name?: string; message?: string; status?: number };\n return Response.json(\n {\n error: {\n name: err?.name ?? 'Error',\n message: err?.message ?? String(error),\n status: typeof err?.status === 'number' ? err.status : undefined,\n },\n },\n {\n status:\n err?.name === 'StreamProtocolError' || err?.name === 'RequestValidationError'\n ? 400\n : 500,\n },\n );\n }\n }\n\n if (parts[1] !== 'rpc') {\n return errorResponse(404, 'NotFound', `unknown path: ${url.pathname}`);\n }\n\n if (parts.length !== 5) {\n return errorResponse(404, 'NotFound', 'expected POST /v1/rpc/{binding}/{name}/{method}');\n }\n if (request.method !== 'POST') {\n return errorResponse(405, 'MethodNotAllowed', 'expected POST');\n }\n\n const [, , bindingKey, encodedName, method] = parts;\n const binding = BINDINGS[bindingKey];\n if (!binding) {\n return errorResponse(404, 'NotFound', `unknown binding: ${bindingKey}`);\n }\n if (!binding.methods.has(method)) {\n return errorResponse(404, 'NotFound', `unknown method: ${bindingKey}.${method}`);\n }\n\n if (!hasContentType(request, 'application/json')) {\n return errorResponse(415, 'UnsupportedMediaType', 'expected application/json');\n }\n let name: string;\n try {\n name = decodePathComponent(encodedName, 'Durable Object name');\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n const namespace = env[binding.env] as DONamespaceLike | undefined;\n if (!namespace) {\n return errorResponse(500, 'WorldMisconfigured', `missing binding: ${binding.env}`);\n }\n let contentLength: number | null;\n try {\n contentLength = declaredContentLength(request);\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n if (contentLength !== null && contentLength > MAX_BODY_BYTES) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n\n let args: unknown[];\n try {\n const text = await readBoundedBody(request);\n if (text === null) {\n return errorResponse(413, 'PayloadTooLarge', `body exceeds ${MAX_BODY_BYTES} bytes`);\n }\n const parsed = rpcParse<unknown>(text);\n if (!Array.isArray(parsed)) {\n return errorResponse(400, 'BadRequest', 'body must be an argument array');\n }\n args = parsed;\n } catch {\n return errorResponse(400, 'BadRequest', 'malformed rpc body');\n }\n\n if (bindingKey === 'runs' && method === 'applyEvent') {\n if (args.length !== 1) {\n return errorResponse(400, 'BadRequest', 'applyEvent expects exactly one request argument');\n }\n try {\n const applyRequest = parseApplyEventRequest(args[0]);\n if (applyRequest.runId !== name) {\n return errorResponse(\n 400,\n 'BadRequest',\n `applyEvent runId \"${applyRequest.runId}\" does not match routed run \"${name}\"`,\n );\n }\n args = [applyRequest];\n } catch (error) {\n return errorResponse(400, 'BadRequest', (error as Error).message);\n }\n }\n\n try {\n const stub = namespace.get(namespace.idFromName(name)) as Record<\n string,\n (...a: unknown[]) => Promise<unknown>\n >;\n const result = await stub[method](...args);\n 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\n/** Node-only base for testing named Worker entrypoints. */\nexport class WorkerEntrypoint<TEnv = unknown> {\n constructor(\n readonly ctx: ExecutionContext,\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 type { ExpireRunIndexesResult } from '../../retention.js';\nimport type { IndexListOptions, IndexListPage } from '../../indexes.js';\nimport { DurableObject } from '../do-base.js';\nimport {\n CATALOG_FENCE_GRACE_MS,\n LIFECYCLE_COMPACTION_BATCH,\n LIFECYCLE_COMPACTION_RETRY_MS,\n MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS,\n} from '../../lifecycle.js';\n\nconst MAX_INDEX_LIST_SIZE = 1001;\nconst EXPIRY_GC_PREFIX = 'expiry-gc:';\nconst CATALOG_KEYS_PREFIX = 'catalog-keys:';\n\ninterface RunCatalogEnv {\n clock?: () => number;\n}\n\ninterface CatalogExpiryFence {\n expiredAt: number;\n compactAt: number;\n}\n\ninterface CatalogExpiryGc {\n runId: string;\n compactAt: number;\n}\n\ninterface CatalogKeys {\n keys: [string, string];\n}\n\nfunction pad(ms: number): string {\n return String(Math.max(0, Math.floor(ms))).padStart(13, '0');\n}\n\nfunction expiredKey(runId: string): string {\n return `expired:${runId}`;\n}\n\nfunction catalogKeysKey(runId: string): string {\n return `${CATALOG_KEYS_PREFIX}${encodeURIComponent(runId)}`;\n}\n\nfunction canonicalCatalogKeys(runId: string, keys: unknown): [string, string] {\n if (!Array.isArray(keys) || keys.length !== 2 || keys.some((key) => typeof key !== 'string')) {\n throw new Error('Run catalog commit requires exactly two string keys');\n }\n const suffix = `:${runId}`;\n const workflowMatch = /^run:(.+):(\\d{13}):/.exec(keys[0]);\n if (\n workflowMatch === null ||\n !keys[0].endsWith(suffix) ||\n keys[0] !== `run:${workflowMatch[1]}:${workflowMatch[2]}${suffix}` ||\n keys[1] !== `runall:${workflowMatch[2]}${suffix}`\n ) {\n throw new Error('Run catalog commit requires the canonical run key pair');\n }\n return [keys[0], keys[1]];\n}\n\nfunction expiryGcKey(runId: string, compactAt: number): string {\n return `${EXPIRY_GC_PREFIX}${pad(compactAt)}:${encodeURIComponent(runId)}`;\n}\n\n/** One of a fixed set of run-catalog shards, routed by the stable run ID hash. */\nexport class RunCatalogDO extends DurableObject {\n private now(): number {\n const clock = (this.env as RunCatalogEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n async upsertRun(\n runId: string,\n keys: string[],\n serializedMetadata: string,\n publicationExpiresAt: number,\n ): Promise<{ stored: boolean }> {\n const canonicalKeys = canonicalCatalogKeys(runId, keys);\n return await this.ctx.storage.transaction(async (txn) => {\n 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({\n [canonicalKeys[0]]: serializedMetadata,\n [canonicalKeys[1]]: serializedMetadata,\n [catalogKeysKey(runId)]: { keys: canonicalKeys } satisfies CatalogKeys,\n });\n return { stored: true };\n });\n }\n\n async list(options: IndexListOptions = {}): Promise<IndexListPage> {\n const suppliedLimit = options.limit;\n const requestedLimit =\n typeof suppliedLimit === 'number' && Number.isFinite(suppliedLimit)\n ? Math.floor(suppliedLimit)\n : MAX_INDEX_LIST_SIZE;\n const limit = Math.min(MAX_INDEX_LIST_SIZE, Math.max(1, requestedLimit));\n const entries = await this.ctx.storage.list<string>({\n // The shard also owns internal expiry metadata. An unprefixed catalog\n // read means all public run/runall entries, never internal records.\n prefix: options.prefix || 'run',\n ...(options.reverse\n ? { reverse: true, end: options.cursor ?? options.end }\n : { startAfter: options.cursor, end: options.end }),\n limit: limit + 1,\n });\n const page = Array.from(entries).slice(0, limit);\n const listComplete = entries.size <= limit;\n return {\n keys: page.map(([name, value]) => ({ name, value })),\n list_complete: listComplete,\n cursor: listComplete ? undefined : page.at(-1)?.[0],\n };\n }\n\n /** Compare-and-delete one rejected retention discovery candidate. */\n async deleteStaleGlobalRun(\n runId: string,\n key: string,\n expectedValue: string,\n ): Promise<{ deleted: boolean }> {\n if (!key.startsWith('runall:') || !key.endsWith(`:${runId}`)) {\n throw new Error('Stale run catalog deletion requires the exact global run key');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get<string>(key)) !== expectedValue) return { deleted: false };\n return { deleted: await txn.delete(key) };\n });\n }\n\n async expireRun(runId: string, expiredAt: number): Promise<ExpireRunIndexesResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const storedKeysKey = catalogKeysKey(runId);\n const storedKeys = await txn.get<CatalogKeys>(storedKeysKey);\n if (storedKeys === undefined) return { deleted: 0 };\n const canonicalKeys = canonicalCatalogKeys(runId, storedKeys.keys);\n const marker = expiredKey(runId);\n const existing = await txn.get<CatalogExpiryFence>(marker);\n const compactAt = existing?.compactAt ?? this.now() + CATALOG_FENCE_GRACE_MS;\n await txn.put<CatalogExpiryFence>(marker, { expiredAt, compactAt });\n await txn.put<CatalogExpiryGc>(expiryGcKey(runId, compactAt), { runId, compactAt });\n await this.armAtMost(txn, compactAt);\n const deleted = await txn.delete(canonicalKeys);\n await txn.delete(storedKeysKey);\n return { deleted };\n });\n }\n\n async alarm(): Promise<void> {\n try {\n await this.compactExpiryFences();\n } catch {\n // Cloudflare retries only six times. Persist a fresh alarm edge so a\n // transient storage failure cannot abandon compaction permanently.\n await this.ctx.storage.setAlarm(this.now() + LIFECYCLE_COMPACTION_RETRY_MS);\n }\n }\n\n private async armAtMost(storage: DurableObjectStorage | DurableObjectTransaction, at: number) {\n const current = await storage.getAlarm();\n if (current === null || at < current) await storage.setAlarm(at);\n }\n\n private async compactExpiryFences(): Promise<void> {\n const now = this.now();\n await this.ctx.storage.transaction(async (txn) => {\n const due = await txn.list<CatalogExpiryGc>({\n prefix: EXPIRY_GC_PREFIX,\n end: `${EXPIRY_GC_PREFIX}${pad(now + 1)}`,\n limit: LIFECYCLE_COMPACTION_BATCH + 1,\n });\n const page = Array.from(due).slice(0, LIFECYCLE_COMPACTION_BATCH);\n const markerKeys = page.map(([, item]) => expiredKey(item.runId));\n const markers = await txn.get<CatalogExpiryFence>(markerKeys);\n const deletes = page.flatMap(([key, item], index) => {\n const marker = markers.get(markerKeys[index]);\n return marker?.compactAt === item.compactAt ? [key, markerKeys[index]] : [key];\n });\n for (let offset = 0; offset < deletes.length; offset += LIFECYCLE_COMPACTION_BATCH) {\n await txn.delete(deletes.slice(offset, offset + LIFECYCLE_COMPACTION_BATCH));\n }\n\n if (due.size > LIFECYCLE_COMPACTION_BATCH) {\n await txn.setAlarm(now + 1);\n return;\n }\n const next = await txn.list<CatalogExpiryGc>({ prefix: EXPIRY_GC_PREFIX, limit: 1 });\n const nextAt = next.values().next().value?.compactAt;\n if (nextAt === undefined) await txn.deleteAlarm();\n else await txn.setAlarm(Math.max(now + 1, nextAt));\n });\n }\n}\n","import type {\n ExpireRunStreamsResult,\n ExpireStreamResult,\n FinalizeRunStreamsResult,\n} from '../../retention.js';\nimport {\n MAX_STREAM_CHUNK_BYTES,\n normalizeStreamError,\n validateStreamReadRequest,\n validateStreamWriteChunks,\n type StreamErrorData,\n type StreamReadRequest,\n type StreamReadResult,\n type StreamTerminalState,\n type StreamWriteResult,\n} from '../../stream-protocol.js';\nimport { DurableObject } from '../do-base.js';\n\ninterface StreamMeta {\n /** Number of durable chunks (also the next chunk index). */\n count: number;\n state: StreamTerminalState;\n ownerRunId?: string;\n error?: StreamErrorData;\n expiredAt?: number;\n expiredChunkCount?: number;\n payloadDeleted?: boolean;\n}\n\ninterface StreamWaiter {\n resolve(reason: 'change' | 'timeout'): void;\n timer: ReturnType<typeof setTimeout>;\n signal?: AbortSignal;\n onAbort?: () => void;\n}\n\ninterface RegistryExpiry {\n expiredAt: number;\n deleted: number;\n}\n\nconst META_KEY = 'meta';\nconst CHUNK_KEY_PREFIX = 'chunk:';\nconst CHUNK_SIZE_KEY_PREFIX = 'chunk-size:';\n/** Registry keys used when this DO instance acts as a per-run stream index. */\nconst STREAM_REGISTRY_PREFIX = 'stream:';\nconst REGISTRY_OWNER_KEY = 'registry:owner';\nconst REGISTRY_EXPIRED_KEY = 'registry:expired';\n/** Each chunk occupies a payload key and a size key; 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;\nconst MAX_STREAM_INDEX = 0x7fffffff;\n\nfunction boundedLimit(value: number | undefined, fallback: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(1, Math.min(maximum, Math.floor(value)));\n}\n\nfunction emptyMeta(): StreamMeta {\n return { count: 0, state: 'open' };\n}\n\nfunction validateMeta(meta: unknown): StreamMeta {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {\n throw new Error('Invalid persisted stream metadata');\n }\n const candidate = meta as Partial<StreamMeta>;\n if (\n !Number.isSafeInteger(candidate.count) ||\n candidate.count! < 0 ||\n candidate.count! > MAX_STREAM_INDEX ||\n !['open', 'closed', 'errored', 'expired'].includes(candidate.state as StreamTerminalState) ||\n (candidate.ownerRunId !== undefined && typeof candidate.ownerRunId !== 'string') ||\n (candidate.payloadDeleted !== undefined && typeof candidate.payloadDeleted !== 'boolean')\n ) {\n throw new Error('Invalid persisted stream metadata');\n }\n const error = candidate.error;\n if (\n (error !== undefined &&\n (!error ||\n typeof error !== 'object' ||\n typeof error.name !== 'string' ||\n typeof error.message !== 'string')) ||\n (candidate.state === 'errored') !== (error !== undefined)\n ) {\n throw new Error('Invalid persisted stream error metadata');\n }\n return candidate as StreamMeta;\n}\n\n/** Zero-padding keeps storage.list() results in stream offset order. */\nfunction chunkKey(index: number): string {\n return `${CHUNK_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction chunkSizeKey(index: number): string {\n return `${CHUNK_SIZE_KEY_PREFIX}${index.toString().padStart(12, '0')}`;\n}\n\nfunction indexFromChunkSizeKey(key: string): number {\n const suffix = key.slice(CHUNK_SIZE_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk size key \"${key}\"`);\n }\n return index;\n}\n\nfunction indexFromChunkKey(key: string): number {\n const suffix = key.slice(CHUNK_KEY_PREFIX.length);\n const index = Number(suffix);\n if (\n !/^\\d{12}$/.test(suffix) ||\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index > MAX_STREAM_INDEX\n ) {\n throw new Error(`Invalid persisted stream chunk key \"${key}\"`);\n }\n return index;\n}\n\nfunction validateChunkSize(size: unknown, index: number): number {\n if (\n typeof size !== 'number' ||\n !Number.isSafeInteger(size) ||\n size < 0 ||\n size > MAX_STREAM_CHUNK_BYTES\n ) {\n throw new Error(`Invalid persisted stream chunk size at index ${index}`);\n }\n return size;\n}\n\nfunction compactChunk(chunk: Uint8Array): Uint8Array {\n return chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength\n ? chunk\n : new Uint8Array(chunk);\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');\n}\n\n/**\n * Durable Object backing workflow streams.\n *\n * Stream cells persist binary chunks under monotonic offset keys. Public\n * reads are bounded long polls, and writes append a bounded ordered batch in\n * one storage transaction. Per-run registry cells retain their existing role.\n */\nexport class StreamDO extends DurableObject {\n private meta: StreamMeta | undefined;\n private metaLoad: Promise<StreamMeta> | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private changeVersion = 0;\n private readonly waiters = new Set<StreamWaiter>();\n\n private async getMeta(): Promise<StreamMeta> {\n if (this.meta) return this.meta;\n this.metaLoad ??= this.ctx.storage.get<StreamMeta>(META_KEY).then((meta) => {\n const loaded = meta === undefined ? emptyMeta() : validateMeta(meta);\n this.meta = loaded;\n return loaded;\n });\n try {\n return await this.metaLoad;\n } catch (error) {\n this.metaLoad = undefined;\n throw error;\n }\n }\n\n private assertOwner(meta: StreamMeta, runId: string): void {\n if (!runId) throw new Error('Stream runId is required');\n if (meta.ownerRunId !== undefined && meta.ownerRunId !== runId) {\n throw new Error(`Stream is owned by workflow run \"${meta.ownerRunId}\"`);\n }\n }\n\n private assertWritable(meta: StreamMeta, runId: string): void {\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state === 'closed') throw new Error('Cannot write to a closed stream');\n if (meta.state === 'errored') throw new Error('Cannot write to an errored stream');\n }\n\n private runMutation<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.mutationTail.then(operation, operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private wakeReaders(): void {\n this.changeVersion += 1;\n for (const waiter of Array.from(this.waiters)) waiter.resolve('change');\n }\n\n private waitForChange(\n observedVersion: number,\n waitMs: number,\n signal?: AbortSignal,\n ): Promise<'change' | 'timeout'> {\n if (signal?.aborted) return Promise.reject(abortReason(signal));\n\n return new Promise<'change' | 'timeout'>((resolve, reject) => {\n let settled = false;\n const waiter: StreamWaiter = {\n timer: setTimeout(() => finish('timeout'), waitMs),\n signal,\n resolve: (reason) => finish(reason),\n };\n\n const cleanup = () => {\n clearTimeout(waiter.timer);\n this.waiters.delete(waiter);\n if (waiter.signal && waiter.onAbort) {\n waiter.signal.removeEventListener('abort', waiter.onAbort);\n }\n };\n const finish = (reason: 'change' | 'timeout') => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(reason);\n };\n waiter.onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(abortReason(signal!));\n };\n\n this.waiters.add(waiter);\n signal?.addEventListener('abort', waiter.onAbort, { once: true });\n\n // A writer may have committed after the caller inspected metadata but\n // before this waiter was installed. The generation check closes that\n // lost-wakeup window without another storage read.\n if (this.changeVersion !== observedVersion) finish('change');\n });\n }\n\n private async readSnapshot(\n request: StreamReadRequest,\n timedOut: boolean,\n ): Promise<StreamReadResult> {\n const meta = await this.getMeta();\n this.assertOwner(meta, request.runId);\n\n const available =\n meta.state === 'expired'\n ? 0\n : Math.max(0, Math.min(request.maxChunks, meta.count - request.startIndex));\n const chunks: Uint8Array[] = [];\n if (available > 0) {\n const indexes = Array.from({ length: available }, (_, offset) => request.startIndex + offset);\n const sizeKeys = indexes.map(chunkSizeKey);\n const storedSizes = await this.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 === undefined ? emptyMeta() : validateMeta(stored);\n this.assertWritable(meta, runId);\n const startIndex = meta.count;\n if (startIndex + chunks.length > MAX_STREAM_INDEX) {\n throw new Error('Stream offset limit exceeded');\n }\n const nextMeta: StreamMeta = {\n count: startIndex + chunks.length,\n state: 'open',\n ownerRunId: runId,\n };\n const entries: 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 === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const closed: StreamMeta = { ...meta, ownerRunId: runId, state: 'closed' };\n await txn.put(META_KEY, closed);\n return closed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Persist a terminal stream failure and wake every pending reader. */\n async failStream(runId: string, error: StreamErrorData | string): Promise<void> {\n const normalized = normalizeStreamError(error);\n await this.runMutation(async () => {\n const nextMeta = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n if (meta.state === 'expired') throw new Error(`Workflow run \"${runId}\" has expired`);\n if (meta.state !== 'open') return meta;\n const failed: StreamMeta = {\n ...meta,\n ownerRunId: runId,\n state: 'errored',\n error: normalized,\n };\n await txn.put(META_KEY, failed);\n return failed;\n });\n this.meta = nextMeta;\n this.metaLoad = Promise.resolve(nextMeta);\n this.wakeReaders();\n });\n }\n\n /** Register a stream name against this per-run registry instance. */\n async registerStream(runId: string, name: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n if ((await txn.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error(`Workflow run \"${runId}\" has expired`);\n }\n const owner = await txn.get<string>(REGISTRY_OWNER_KEY);\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n await txn.put(REGISTRY_OWNER_KEY, runId);\n await txn.put(`${STREAM_REGISTRY_PREFIX}${name}`, true);\n });\n }\n\n async listStreams(): Promise<string[]> {\n if ((await this.ctx.storage.get(REGISTRY_EXPIRED_KEY)) !== undefined) {\n throw new Error('Workflow run streams have expired');\n }\n const entries = await this.ctx.storage.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX });\n return Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length));\n }\n\n /** Fence a run's registry before any stream cells are removed. */\n async expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult> {\n const limit = boundedLimit(options?.limit, 16, 128);\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n if (owner !== undefined && owner !== runId) {\n throw new Error(`Stream registry is owned by workflow run \"${owner}\"`);\n }\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n await txn.put({\n [REGISTRY_OWNER_KEY]: runId,\n [REGISTRY_EXPIRED_KEY]: expiry ?? { expiredAt, deleted: 0 },\n });\n const entries = await txn.list<boolean>({ prefix: STREAM_REGISTRY_PREFIX, limit });\n return {\n streams: Array.from(entries.keys()).map((key) => key.slice(STREAM_REGISTRY_PREFIX.length)),\n };\n });\n }\n\n /** Remove completed registry entries in a bounded, retry-safe batch. */\n async finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult> {\n return await this.ctx.storage.transaction(async (txn) => {\n const state = await txn.get<string | RegistryExpiry>([\n REGISTRY_OWNER_KEY,\n REGISTRY_EXPIRED_KEY,\n ]);\n const owner = state.get(REGISTRY_OWNER_KEY) as string | undefined;\n const expiry = state.get(REGISTRY_EXPIRED_KEY) as RegistryExpiry | undefined;\n if (owner !== runId || expiry === undefined) {\n throw new Error(`Stream registry for workflow run \"${runId}\" is not expired`);\n }\n const keys = Array.from(new Set(streams.map((name) => `${STREAM_REGISTRY_PREFIX}${name}`)));\n const removed = keys.length === 0 ? 0 : await txn.delete(keys);\n const deleted = expiry.deleted + removed;\n await txn.put<RegistryExpiry>(REGISTRY_EXPIRED_KEY, { ...expiry, deleted });\n const remaining = await txn.list({ prefix: STREAM_REGISTRY_PREFIX, limit: 1 });\n return { deleted, done: remaining.size === 0 };\n });\n }\n\n /**\n * Fence the stream and delete one bounded page. Listing size keys avoids\n * loading payloads, and the transaction makes a crash retry resume safely.\n */\n async expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult> {\n const limit = boundedLimit(options?.limit, DEFAULT_EXPIRE_CHUNK_LIMIT, MAX_EXPIRE_CHUNK_LIMIT);\n const byteLimit = boundedLimit(\n options?.byteLimit,\n DEFAULT_EXPIRE_BYTE_LIMIT,\n MAX_EXPIRE_BYTE_LIMIT,\n );\n return await this.runMutation(async () => {\n const result = await this.ctx.storage.transaction(async (txn) => {\n const stored = await txn.get<StreamMeta>(META_KEY);\n const meta = stored === undefined ? emptyMeta() : validateMeta(stored);\n this.assertOwner(meta, runId);\n const firstFence = meta.state !== 'expired';\n\n const candidates = await txn.list<number>({\n prefix: CHUNK_SIZE_KEY_PREFIX,\n limit: limit + 1,\n });\n const page: Array<{ index: number; size: number }> = [];\n let bytes = 0;\n for (const [key, storedSize] of Array.from(candidates).slice(0, limit)) {\n const index = indexFromChunkSizeKey(key);\n const size = validateChunkSize(storedSize, index);\n if (page.length > 0 && bytes + size > byteLimit) break;\n page.push({ index, size });\n bytes += size;\n }\n\n let payloadFallback = false;\n if (candidates.size === 0) {\n const payloads = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n const first = payloads.entries().next().value;\n if (first) {\n const [key, payload] = first;\n page.push({\n index: indexFromChunkKey(key),\n size: payload instanceof Uint8Array ? payload.byteLength : 0,\n });\n bytes = page[0].size;\n payloadFallback = true;\n }\n }\n\n const keys = page.flatMap(({ index }) => [chunkKey(index), chunkSizeKey(index)]);\n if (keys.length > 0) await txn.delete(keys);\n let done = candidates.size === page.length;\n if (payloadFallback) {\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n } else if (done && candidates.size > 0) {\n // A corrupt/missing size index can otherwise make cleanup report\n // completion while leaving an orphan payload. Verify once after the\n // final staged size-index page; healthy pages return an empty list.\n const remaining = await txn.list({ prefix: CHUNK_KEY_PREFIX, limit: 1 });\n done = remaining.size === 0;\n }\n if (done && page.length === 0 && meta.state === 'expired' && meta.payloadDeleted) {\n return {\n meta,\n result: { deleted: false, chunks: 0, bytes: 0, done: true },\n };\n }\n const nextMeta: StreamMeta = {\n ...meta,\n count: done ? 0 : meta.count,\n ownerRunId: runId,\n state: 'expired',\n error: undefined,\n expiredAt: meta.expiredAt ?? expiredAt,\n expiredChunkCount: meta.expiredChunkCount ?? meta.count,\n payloadDeleted: done,\n };\n await txn.put(META_KEY, nextMeta);\n return {\n meta: nextMeta,\n result: {\n deleted: firstFence,\n chunks: page.length,\n bytes,\n done,\n } satisfies ExpireStreamResult,\n };\n });\n\n this.meta = result.meta;\n this.metaLoad = Promise.resolve(result.meta);\n this.wakeReaders();\n return result.result;\n });\n }\n}\n","import type { TerminalWorkflowRunStatus, WorkflowRun, WorkflowRunStatus } from '@workflow/world';\n\nexport const CLEANUP_RECORD_KEY = 'retention:cleanup';\nexport const TOMBSTONE_KEY = 'retention:tombstone';\nexport const HOOK_MARKER_PREFIX = 'retention:hook:';\nexport const TERMINAL_CLEANUP_KEY = 'terminal:cleanup';\n\nexport type CleanupPhase = 'retained' | 'index' | 'streams' | 'queues' | 'payload' | 'tombstoned';\n\nexport interface CleanupRecord {\n version: 1;\n runId: string;\n workflowName: string;\n createdAt: Date;\n /** Last status observed when cleanup was scheduled. */\n status?: WorkflowRunStatus;\n /** Present when cleanup was scheduled for a terminal run. */\n completedAt?: Date;\n /** Retained for persisted terminal-retention records created before max-age cleanup. */\n terminalStatus?: TerminalWorkflowRunStatus;\n reason?: 'terminal-retention' | 'maximum-age' | 'manual';\n dueAt: Date;\n phase: CleanupPhase;\n /** Optimistic-concurrency token for alarm/RPC work that awaits another cell. */\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n tombstonedAt?: Date;\n deletedPayloadKeys: number;\n deletedStreams: number;\n /** Queue payload objects removed from object storage during run cleanup. */\n deletedQueuePayloads: number;\n}\n\nexport interface RunTombstone {\n version: 1;\n runId: string;\n /** Last status observed before the run expired. */\n status?: WorkflowRunStatus;\n completedAt?: Date;\n terminalStatus?: TerminalWorkflowRunStatus;\n expiredAt: Date;\n tombstonedAt: Date;\n /** Final cleanup accounting retained inside the single authoritative record. */\n cleanup: CleanupRecord;\n}\n\nexport type RunLifecycleStatus = 'active' | 'terminal' | 'expired' | 'missing';\n\nexport type RunReadOutcome<T> =\n | { ok: true; value: T }\n | { ok: false; code: 'RUN_EXPIRED'; message: string; tombstone: RunTombstone };\n\nexport interface HookIndexReference {\n hookId: string;\n token: string;\n}\n\nexport interface TerminalCleanupRecord {\n version: 1;\n runId: string;\n phase: 'hooks' | 'markers' | 'waits';\n generation: number;\n attempts: number;\n lastError?: string;\n lastAttemptAt?: Date;\n}\n\nexport interface ReleaseHookIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n}\n\nexport interface ReleaseHookIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunIndexesRequest {\n runId: string;\n hooks: HookIndexReference[];\n expiredAt: number;\n}\n\nexport interface ExpireRunIndexesResult {\n deleted: number;\n}\n\nexport interface ExpireRunStreamsResult {\n streams: string[];\n}\n\nexport interface FinalizeRunStreamsResult {\n /** Cumulative registry entries removed for this run. */\n deleted: number;\n done: boolean;\n}\n\nexport interface ExpireStreamResult {\n /** True only when this call installed the stream's expiration fence. */\n deleted: boolean;\n /** Chunk rows removed by this bounded call. */\n chunks: number;\n /** Payload bytes represented by the removed chunk rows. */\n bytes: number;\n done: boolean;\n}\n\nexport interface ScheduleCleanupRequest {\n retentionMs: number;\n}\n\nexport interface EnforceRetentionRequest extends ScheduleCleanupRequest {\n /** Cron occurrence being enforced. A run is eligible only at/before this time. */\n scheduledTime: number;\n}\n\nexport type EnforceRetentionResult =\n | { state: 'missing' | 'not-due'; cleanup: null }\n | { state: 'scheduled' | 'expired'; cleanup: CleanupRecord };\n\nexport function sortableTimestamp(date: Date): string {\n return date.getTime().toString().padStart(13, '0');\n}\n\nexport function workflowRunIndexKey(\n run: Pick<WorkflowRun, 'workflowName' | 'createdAt' | 'runId'>,\n) {\n return `run:${run.workflowName}:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function globalRunIndexKey(run: Pick<WorkflowRun, 'createdAt' | 'runId'>) {\n return `runall:${sortableTimestamp(run.createdAt)}:${run.runId}`;\n}\n\nexport function hookMarkerKey(reference: HookIndexReference): string {\n return `${HOOK_MARKER_PREFIX}${encodeURIComponent(reference.hookId)}:${encodeURIComponent(reference.token)}`;\n}\n\nexport function cleanupTombstone(record: CleanupRecord, now: Date): RunTombstone {\n const cleanup: CleanupRecord = {\n ...record,\n phase: 'tombstoned',\n tombstonedAt: now,\n };\n return {\n version: 1,\n runId: record.runId,\n status: record.status ?? record.terminalStatus,\n terminalStatus: record.terminalStatus,\n completedAt: record.completedAt,\n expiredAt: record.dueAt,\n tombstonedAt: now,\n cleanup,\n };\n}\n\nexport function cleanupFromTombstone(tombstone: RunTombstone): CleanupRecord {\n return tombstone.cleanup;\n}\n\nexport function expiredRead<T>(tombstone: RunTombstone): RunReadOutcome<T> {\n return {\n ok: false,\n code: 'RUN_EXPIRED',\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n tombstone,\n };\n}\n","/**\n * Provider-neutral storage used for run-bearing native Queue payloads.\n *\n * celld v0.4 exposes a namespace in the fleet's existing object store through\n * the Workers R2-compatible binding shape. Keep that platform shape here so\n * queue and retention code depend only on QueuePayloadStore.\n */\nexport interface QueuePayloadStore {\n write(key: string, value: string, metadata: { runId: string; messageId: string }): Promise<void>;\n read(key: string): Promise<string | null>;\n delete(keys: string | string[]): Promise<void>;\n}\n\nexport interface QueuePayloadObjectStorageBinding {\n put(\n key: string,\n value: string,\n options?: { customMetadata?: Record<string, string> },\n ): Promise<unknown>;\n get(key: string): Promise<{ text(): Promise<string> } | null>;\n delete(keys: string | string[]): Promise<void>;\n}\n\nexport function createQueuePayloadStore(\n binding: QueuePayloadObjectStorageBinding,\n): QueuePayloadStore {\n return {\n async write(key, value, metadata) {\n await binding.put(key, value, { customMetadata: metadata });\n },\n async read(key) {\n return (await binding.get(key))?.text() ?? null;\n },\n async delete(keys) {\n await binding.delete(keys);\n },\n };\n}\n\nexport async function deleteQueuePayloadObjects(\n binding: Pick<QueuePayloadObjectStorageBinding, 'delete'>,\n keys: string | string[],\n): Promise<void> {\n await binding.delete(keys);\n}\n","import { DurableObject } from '../do-base.js';\nimport {\n createWorkflowIndex,\n type HookIdShardStub,\n type HookTokenShardStub,\n type RunCatalogShardStub,\n type WorkflowIndex,\n} from '../../indexes.js';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { isTerminalWorkflowRunStatus, slotToEventId, WorkflowRunSchema } from '@workflow/world';\nimport {\n applyEvent,\n finalizeEventPage,\n hookClaimCancellationKey,\n type ApplyEventOutcome,\n type ApplyEventRequest,\n EVENT_KEY_PREFIX,\n type EventStore,\n HOOK_CREATED_KEY_PREFIX,\n HOOK_KEY_PREFIX,\n listByCreationTime,\n listByPrefix,\n parseApplyEventRequest,\n STEP_CREATED_KEY_PREFIX,\n STEP_KEY_PREFIX,\n WAIT_KEY_PREFIX,\n} from '../../apply-event.js';\nimport {\n CLEANUP_RECORD_KEY,\n type CleanupRecord,\n cleanupFromTombstone,\n cleanupTombstone,\n type EnforceRetentionRequest,\n type EnforceRetentionResult,\n type ExpireRunStreamsResult,\n type ExpireStreamResult,\n type FinalizeRunStreamsResult,\n expiredRead,\n HOOK_MARKER_PREFIX,\n type HookIndexReference,\n hookMarkerKey,\n type RunReadOutcome,\n type RunLifecycleStatus,\n type RunTombstone,\n type ScheduleCleanupRequest,\n TERMINAL_CLEANUP_KEY,\n type TerminalCleanupRecord,\n TOMBSTONE_KEY,\n} from '../../retention.js';\nimport { MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS } from '../../lifecycle.js';\nimport { isNonNegativeSafeInteger, isPositiveSafeInteger, isRecord } from '../../validation.js';\nimport {\n QUEUE_PAYLOAD_REGISTRY_PREFIX,\n queuePayloadRegistryKey,\n type QueuePayloadOrphan,\n type QueuePayloadRegistration,\n} from '../../queue-protocol.js';\nimport {\n deleteQueuePayloadObjects,\n type QueuePayloadObjectStorageBinding,\n} from '../queue-payload-store.js';\n\ninterface CellId {\n toString(): string;\n}\n\ninterface CellNamespace<T> {\n idFromName(name: string): CellId;\n get(id: CellId): T;\n}\n\ninterface StreamCleanupStub {\n expireRegistry(\n runId: string,\n expiredAt: number,\n options?: { limit?: number },\n ): Promise<ExpireRunStreamsResult>;\n finalizeRegistry(runId: string, streams: string[]): Promise<FinalizeRunStreamsResult>;\n expireStream(\n runId: string,\n expiredAt: number,\n options?: { limit?: number; byteLimit?: number },\n ): Promise<ExpireStreamResult>;\n}\n\ninterface WorkflowRunDOEnv {\n WORKFLOW_DB?: CellNamespace<{ unregisterQueuePayload(messageId: string): Promise<void> }>;\n WORKFLOW_RUN_CATALOG?: CellNamespace<RunCatalogShardStub>;\n WORKFLOW_HOOK_TOKENS?: CellNamespace<HookTokenShardStub>;\n WORKFLOW_HOOK_IDS?: CellNamespace<HookIdShardStub>;\n WORKFLOW_STREAMS?: CellNamespace<StreamCleanupStub>;\n WORKFLOW_QUEUE_PAYLOADS?: Pick<QueuePayloadObjectStorageBinding, 'delete'>;\n /** Test seam; celld deployments use Date.now(). */\n clock?: () => number;\n}\n\nconst 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_PAYLOADS_PER_CLEANUP_PAGE = STORAGE_BATCH_SIZE;\nconst CLEANUP_RETRY_MAX_MS = 60 * 60 * 1000;\nconst MAX_DATE_MS = 8_640_000_000_000_000;\nconst QUEUE_ORPHAN_KEY = 'queue-orphan';\nconst QUEUE_RESERVATION_KEY = 'queue-reservation';\ntype TerminalRun = Extract<WorkflowRun, { status: 'completed' | 'failed' | 'cancelled' }>;\n\nfunction validateCleanupRequest(request: unknown, allowDisabled: boolean): ScheduleCleanupRequest {\n if (!isRecord(request)) {\n throw new Error('world-celld retention request must be an object');\n }\n const validRetention = allowDisabled\n ? isNonNegativeSafeInteger(request.retentionMs)\n : isPositiveSafeInteger(request.retentionMs);\n if (!validRetention) {\n throw new Error(\n `world-celld retentionMs must be a ${allowDisabled ? 'non-negative' : 'positive'} safe integer`,\n );\n }\n return request as unknown as ScheduleCleanupRequest;\n}\n\nfunction retentionDeadline(baseMs: number, retentionMs: number, runId: string): number {\n const dueAtMs = baseMs + retentionMs;\n if (!Number.isSafeInteger(dueAtMs) || dueAtMs > MAX_DATE_MS) {\n throw new Error(`world-celld retention deadline is out of range for ${runId}`);\n }\n return dueAtMs;\n}\n\nfunction cleanupRecord(\n run: WorkflowRun,\n dueAt: Date,\n reason: NonNullable<CleanupRecord['reason']>,\n): CleanupRecord {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n return {\n version: 1,\n runId: run.runId,\n workflowName: run.workflowName,\n createdAt: run.createdAt,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason,\n dueAt,\n phase: 'retained',\n generation: 0,\n attempts: 0,\n deletedPayloadKeys: 0,\n deletedStreams: 0,\n deletedQueuePayloads: 0,\n };\n}\n\n/**\n * Adapt DO storage (or a transaction) to the {@link EventStore} interface\n * shared with the test mocks. No casts: the methods line up structurally,\n * this just pins the subset we rely on.\n */\nfunction storeFrom(storage: DurableObjectStorage | DurableObjectTransaction): EventStore {\n return {\n get: (key) => storage.get(key),\n getMany: (keys) => storage.get(keys),\n put: (key, value) => storage.put(key, value),\n delete: (key) => storage.delete(key),\n deleteMany: (keys) => storage.delete(keys),\n list: (options) => storage.list(options),\n deferTerminalCleanup: true,\n };\n}\n\nfunction hookCreationIndexKey(hook: Hook): string {\n return `${HOOK_CREATED_KEY_PREFIX}${hook.createdAt.toISOString()}:${hook.hookId}`;\n}\n\nasync function putStorageEntries(\n storage: DurableObjectTransaction,\n entries: Iterable<readonly [string, unknown]>,\n): Promise<void> {\n const all = Array.from(entries);\n for (let offset = 0; offset < all.length; offset += STORAGE_BATCH_SIZE) {\n await storage.put(Object.fromEntries(all.slice(offset, offset + STORAGE_BATCH_SIZE)));\n }\n}\n\ninterface InflightClaim {\n messageId: string;\n expiresAt: number;\n retryAt?: number;\n}\n\ntype QueueMessageReservation = InflightClaim;\n\ninterface QueuePayloadOrphanState extends QueuePayloadOrphan {\n generation: number;\n deleting: boolean;\n}\n\n/**\n * Durable Object for managing a single workflow run's state.\n *\n * All event-sourced writes go through {@link applyEvent} inside a single\n * storage transaction: guard checks, the event append, and the entity\n * mutation are atomic even if the DO is evicted mid-operation.\n *\n * Instances named `claim:<queueName>:<idempotencyKey>` reserve one message ID\n * at publication time and serialize its deliveries until completion.\n */\nexport class WorkflowRunDO extends DurableObject {\n private now(): number {\n const clock = (this.env as WorkflowRunDOEnv)?.clock;\n return typeof clock === 'function' ? clock() : Date.now();\n }\n\n private tombstoneFrom(\n values: Map<string, RunTombstone | CleanupRecord>,\n now = this.now(),\n ): RunTombstone | null {\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) return tombstone;\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (!cleanup || (cleanup.phase === 'retained' && cleanup.dueAt.getTime() > now)) return null;\n return cleanupTombstone(cleanup, cleanup.tombstonedAt ?? cleanup.dueAt);\n }\n\n private async retentionState(\n storage: DurableObjectStorage | DurableObjectTransaction,\n now = this.now(),\n ): 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 request = parseApplyEventRequest(request);\n if (this.ctx.id.name !== undefined && request.runId !== this.ctx.id.name) {\n throw new TypeError(\n `applyEvent runId \"${request.runId}\" does not match durable object \"${this.ctx.id.name}\"`,\n );\n }\n if (request.cleanup !== undefined) validateCleanupRequest(request.cleanup, true);\n return await this.ctx.storage.transaction(async (txn) => {\n const now = new Date(this.now());\n const retention = await this.retentionState(txn, now.getTime());\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(\n retentionDeadline(terminalRun.completedAt.getTime(), retentionMs, terminalRun.runId),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, 'terminal-retention');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(dueAt);\n outcome.run = run;\n }\n if (outcome.run && isTerminalWorkflowRunStatus(outcome.run.status)) {\n const terminalCleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (!terminalCleanup) {\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n version: 1,\n runId: outcome.run.runId,\n phase: 'hooks',\n generation: 0,\n attempts: 0,\n });\n }\n await txn.setAlarm(this.now() + 1);\n }\n if (outcome.run) {\n outcome.indexPublicationExpiresAt = now.getTime() + MAX_RUN_INDEX_PUBLICATION_LIFETIME_MS;\n }\n return finalizeEventPage(storeFrom(txn), outcome, request.params);\n });\n }\n\n /**\n * Resolve an ambiguous hook-creation RPC in the same serialization domain as\n * applyEvent. If the hook is absent, the exact reservation is durably fenced\n * before the caller releases its token and hook-ID claims.\n */\n async resolveHookTokenClaim(request: {\n hookId: string;\n token: string;\n claimId: string;\n }): Promise<{ committed: boolean }> {\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n // Once the authoritative expiry record exists (including the logical\n // tombstone at dueAt), a lost-response resolver must not recreate\n // unbounded per-claim state next to the tombstone.\n if (tombstone) return { committed: false };\n const hook = await txn.get<Hook>(`${HOOK_KEY_PREFIX}${request.hookId}`);\n if (hook?.token === request.token) return { committed: true };\n await txn.put(hookClaimCancellationKey(request.claimId), {\n hookId: request.hookId,\n token: request.token,\n canceledAt: this.now(),\n });\n return { committed: false };\n });\n }\n\n async getRun(): Promise<RunReadOutcome<WorkflowRun | null>> {\n return this.readKey<WorkflowRun>('run');\n }\n\n /** Single authoritative lifecycle answer used after derivative compaction. */\n async getLifecycleStatus(): Promise<RunLifecycleStatus> {\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<RunTombstone | CleanupRecord | WorkflowRun>([\n TOMBSTONE_KEY,\n CLEANUP_RECORD_KEY,\n 'run',\n ]);\n if (this.tombstoneFrom(values as Map<string, RunTombstone | CleanupRecord>)) {\n return 'expired';\n }\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return 'missing';\n return isTerminalWorkflowRunStatus(run.status) ? 'terminal' : 'active';\n });\n }\n\n async getStep(stepId: string): Promise<RunReadOutcome<Step | null>> {\n return this.readKey<Step>(`${STEP_KEY_PREFIX}${stepId}`);\n }\n\n async listSteps(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Step[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Step>(storeFrom(txn), STEP_CREATED_KEY_PREFIX, STEP_KEY_PREFIX, {\n limit: params?.limit ?? 20,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getEvent(eventId: string): Promise<RunReadOutcome<Event | null>> {\n return this.readKey<Event>(`${EVENT_KEY_PREFIX}${eventId}`);\n }\n\n async listEvents(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Event[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByPrefix<Event>(\n storeFrom(txn),\n EVENT_KEY_PREFIX,\n {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n },\n (event) => event.eventId,\n ),\n );\n }\n\n async listHooks(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: 'asc' | 'desc';\n }): Promise<RunReadOutcome<{ data: Hook[]; cursor: string | null; hasMore: boolean }>> {\n return this.read((txn) =>\n listByCreationTime<Hook>(storeFrom(txn), HOOK_CREATED_KEY_PREFIX, HOOK_KEY_PREFIX, {\n limit: params?.limit ?? 100,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder ?? 'asc',\n }),\n );\n }\n\n async getCleanupStatus(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | RunTombstone>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (cleanup) return cleanup;\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n return tombstone ? cleanupFromTombstone(tombstone) : null;\n }\n\n /** Explicitly schedule an existing terminal run, used for opt-in backfills. */\n async scheduleCleanup(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<\n CleanupRecord | RunTombstone | TerminalCleanupRecord | WorkflowRun\n >([CLEANUP_RECORD_KEY, TOMBSTONE_KEY, TERMINAL_CLEANUP_KEY, 'run']);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n if (existing) return existing;\n if (values.get(TOMBSTONE_KEY)) return null;\n const current = values.get('run') as WorkflowRun | undefined;\n if (!current || !isTerminalWorkflowRunStatus(current.status)) return null;\n const terminalRun = current as TerminalRun;\n const dueAt = new Date(\n retentionDeadline(\n terminalRun.completedAt.getTime(),\n request.retentionMs,\n terminalRun.runId,\n ),\n );\n const run = WorkflowRunSchema.parse({ ...terminalRun, expiredAt: dueAt }) as TerminalRun;\n const cleanup = cleanupRecord(run, dueAt, 'manual');\n await txn.put('run', run);\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n await txn.setAlarm(\n values.get(TERMINAL_CLEANUP_KEY) || dueAt.getTime() <= this.now() ? this.now() + 1 : dueAt,\n );\n return cleanup;\n });\n }\n\n /**\n * Apply the fleet-wide maximum-age policy to one authoritative run.\n *\n * The catalog is only a discovery index: eligibility is rechecked from the\n * RunDO's own createdAt. Once eligible, the cleanup deadline immediately\n * becomes an authoritative write/read fence, including for active runs.\n */\n async enforceRetention(request: EnforceRetentionRequest): Promise<EnforceRetentionResult> {\n validateCleanupRequest(request, false);\n if (!Number.isSafeInteger(request.scheduledTime) || request.scheduledTime < 0) {\n throw new Error('world-celld retention scheduledTime must be a non-negative safe integer');\n }\n\n const result = await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<CleanupRecord | RunTombstone | WorkflowRun>([\n CLEANUP_RECORD_KEY,\n TOMBSTONE_KEY,\n 'run',\n ]);\n const tombstone = values.get(TOMBSTONE_KEY) as RunTombstone | undefined;\n if (tombstone) {\n return {\n state: 'expired',\n cleanup: cleanupFromTombstone(tombstone),\n } satisfies EnforceRetentionResult;\n }\n\n const run = values.get('run') as WorkflowRun | undefined;\n if (!run) return { state: 'missing', cleanup: null } satisfies EnforceRetentionResult;\n const dueAtMs = retentionDeadline(run.createdAt.getTime(), request.retentionMs, run.runId);\n if (dueAtMs > request.scheduledTime) {\n return { state: 'not-due', cleanup: null } satisfies EnforceRetentionResult;\n }\n\n const dueAt = new Date(dueAtMs);\n const existing = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n let cleanup = existing;\n if (!cleanup) {\n cleanup = cleanupRecord(run, dueAt, 'maximum-age');\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n } else if (cleanup.phase === 'retained' && dueAtMs < cleanup.dueAt.getTime()) {\n const terminal = isTerminalWorkflowRunStatus(run.status) ? (run as TerminalRun) : undefined;\n cleanup = {\n ...cleanup,\n status: run.status,\n completedAt: terminal?.completedAt,\n terminalStatus: terminal?.status,\n reason: 'maximum-age',\n dueAt,\n generation: cleanup.generation + 1,\n };\n await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, cleanup);\n }\n await txn.setAlarm(this.now() + 1);\n return {\n state: cleanup.dueAt.getTime() <= this.now() ? 'expired' : 'scheduled',\n cleanup,\n } satisfies EnforceRetentionResult;\n });\n\n // Remove the discovery index before returning when possible. The\n // remaining stream/queue/payload pages continue through the run's alarm.\n if (result.state === 'scheduled' || result.state === 'expired') {\n for (let page = 0; page < 2; page++) {\n const cleanup = await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (cleanup?.phase !== 'retained' && cleanup?.phase !== 'index') break;\n await this.executeScheduledCleanupPage();\n }\n return {\n ...result,\n cleanup: (await this.getCleanupStatus()) ?? result.cleanup,\n };\n }\n return result;\n }\n\n async cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null> {\n request = validateCleanupRequest(request, false);\n if (!(await this.ctx.storage.get<CleanupRecord>(CLEANUP_RECORD_KEY))) {\n await this.scheduleCleanup(request);\n }\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase === 'tombstoned') return;\n const dueAt = new Date(this.now());\n const run = await txn.get<WorkflowRun>('run');\n if (run) await txn.put('run', WorkflowRunSchema.parse({ ...run, expiredAt: dueAt }));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n dueAt,\n generation: cleanup.generation + 1,\n });\n await txn.setAlarm(this.now() + 1);\n });\n await this.executeScheduledCleanupPage();\n return this.getCleanupStatus();\n }\n\n async rearmCleanup(): Promise<CleanupRecord | null> {\n const values = await this.ctx.storage.get<CleanupRecord | TerminalCleanupRecord>([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n if (terminalCleanup) {\n await this.ctx.storage.setAlarm(this.now() + 1);\n } else if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n } else {\n await this.ctx.storage.setAlarm(Math.max(this.now() + 1, cleanup.dueAt.getTime()));\n }\n return cleanup ?? null;\n }\n\n async alarm(): Promise<void> {\n await this.executeScheduledCleanupPage();\n }\n\n private namespace<T>(name: keyof WorkflowRunDOEnv): CellNamespace<T> {\n const namespace = (this.env as WorkflowRunDOEnv)?.[name];\n if (!namespace || typeof namespace === 'function') {\n throw new Error(`world-celld retention missing binding ${name}`);\n }\n return namespace as CellNamespace<T>;\n }\n\n private workflowIndex(): WorkflowIndex {\n return createWorkflowIndex({\n runCatalog: this.namespace<RunCatalogShardStub>('WORKFLOW_RUN_CATALOG'),\n hookTokens: this.namespace<HookTokenShardStub>('WORKFLOW_HOOK_TOKENS'),\n hookIds: this.namespace<HookIdShardStub>('WORKFLOW_HOOK_IDS'),\n });\n }\n\n private async setCleanupPhase(\n expected: CleanupRecord,\n next: CleanupRecord['phase'],\n updates: Partial<CleanupRecord> = {},\n continueAt?: number,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n ...updates,\n phase: next,\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n if (continueAt !== undefined) await txn.setAlarm(continueAt);\n });\n }\n\n private async executeScheduledCleanupPage(): Promise<void> {\n const values = await this.ctx.storage.get<\n CleanupRecord | TerminalCleanupRecord | InflightClaim | QueuePayloadOrphanState | WorkflowRun\n >([\n CLEANUP_RECORD_KEY,\n TERMINAL_CLEANUP_KEY,\n 'claim',\n QUEUE_RESERVATION_KEY,\n QUEUE_ORPHAN_KEY,\n 'run',\n ]);\n const cleanup = values.get(CLEANUP_RECORD_KEY) as CleanupRecord | undefined;\n const terminalCleanup = values.get(TERMINAL_CLEANUP_KEY) as TerminalCleanupRecord | undefined;\n const claim = values.get('claim') as InflightClaim | undefined;\n const reservation = values.get(QUEUE_RESERVATION_KEY) as QueueMessageReservation | undefined;\n const queueOrphan = values.get(QUEUE_ORPHAN_KEY) as QueuePayloadOrphanState | undefined;\n\n if (queueOrphan) {\n const leased = await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (!current) return null;\n if (current.expiresAt > this.now()) {\n await txn.setAlarm(current.expiresAt);\n return null;\n }\n if (current.deleting) return current;\n const next: QueuePayloadOrphanState = {\n ...current,\n generation: current.generation + 1,\n deleting: true,\n };\n await txn.put(QUEUE_ORPHAN_KEY, next);\n return next;\n });\n if (!leased) return;\n const bucket = (this.env as WorkflowRunDOEnv)?.WORKFLOW_QUEUE_PAYLOADS;\n const runs = (this.env as WorkflowRunDOEnv)?.WORKFLOW_DB;\n if (!bucket || !runs) {\n throw new Error('world-celld queue orphan cleanup is missing required bindings');\n }\n await deleteQueuePayloadObjects(bucket, leased.key);\n const run = runs.get(runs.idFromName(leased.runId));\n await run.unregisterQueuePayload(leased.messageId);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (\n current?.messageId !== leased.messageId ||\n current.generation !== leased.generation ||\n !current.deleting\n ) {\n return;\n }\n await txn.delete(QUEUE_ORPHAN_KEY);\n await txn.deleteAlarm();\n });\n return;\n }\n\n if (claim || reservation) {\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n let nextClaim = current.get('claim');\n let nextReservation = current.get(QUEUE_RESERVATION_KEY);\n const now = this.now();\n if (nextClaim && nextClaim.expiresAt <= now) {\n await txn.delete('claim');\n nextClaim = undefined;\n }\n if (nextReservation && nextReservation.expiresAt <= now) {\n await txn.delete(QUEUE_RESERVATION_KEY);\n nextReservation = undefined;\n }\n const nextAlarm = Math.min(\n nextClaim?.expiresAt ?? Number.POSITIVE_INFINITY,\n nextReservation?.expiresAt ?? Number.POSITIVE_INFINITY,\n );\n if (Number.isFinite(nextAlarm)) await txn.setAlarm(nextAlarm);\n else await txn.deleteAlarm();\n });\n return;\n }\n\n // Once retention is due it is the lifecycle authority. Do not make an\n // expired run wait behind terminal hook/wait disposal; payload cleanup\n // removes that derivative state later in the same bounded state machine.\n if (cleanup && cleanup.phase !== 'tombstoned' && cleanup.dueAt.getTime() <= this.now()) {\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n return;\n }\n\n if (terminalCleanup) {\n try {\n await this.executeTerminalCleanup(terminalCleanup);\n } catch (error) {\n await this.recordTerminalCleanupFailure(error, terminalCleanup);\n }\n return;\n }\n\n if (!cleanup || cleanup.phase === 'tombstoned') {\n await this.ctx.storage.deleteAlarm();\n return;\n }\n try {\n await this.executeCleanup(cleanup);\n } catch (error) {\n await this.recordCleanupFailure(error, cleanup);\n }\n }\n\n private async executeCleanup(cleanup: CleanupRecord): Promise<void> {\n if (cleanup.phase === 'retained') {\n if (cleanup.dueAt.getTime() > this.now()) {\n await this.ctx.storage.setAlarm(cleanup.dueAt);\n return;\n }\n await this.setCleanupPhase(cleanup, 'index', {}, this.now() + 1);\n return;\n }\n\n if (cleanup.phase === 'index') {\n await this.deleteIndexPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'streams') {\n await this.deleteStreamPage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'queues') {\n await this.deleteQueuePage(cleanup);\n return;\n }\n\n if (cleanup.phase === 'payload') {\n await this.deletePayloadBatch();\n }\n }\n\n private async executeTerminalCleanup(cleanup: TerminalCleanupRecord): Promise<void> {\n if (cleanup.phase === 'hooks') {\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 hooks: hookMarkers.map(([, value]) => value),\n expiredAt: cleanup.dueAt.getTime(),\n });\n const markerKeys = hookMarkers.map(([key]) => key);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'index' || current.generation !== cleanup.generation) return;\n if (markerKeys.length > 0) await txn.delete(markerKeys);\n if (hookEntries.size <= HOOK_MARKER_PAGE_SIZE) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n phase: 'streams',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n } else {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n }\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteStreamPage(cleanup: CleanupRecord): Promise<void> {\n const streamsNamespace = this.namespace<StreamCleanupStub>('WORKFLOW_STREAMS');\n const registry = streamsNamespace.get(\n streamsNamespace.idFromName(`run-streams:${cleanup.runId}`),\n );\n const { streams } = await registry.expireRegistry(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: STREAMS_PER_CLEANUP_PAGE,\n });\n const completed: string[] = [];\n let remainingChunks = STREAM_CHUNKS_PER_CLEANUP_PAGE;\n let remainingBytes = STREAM_BYTES_PER_CLEANUP_PAGE;\n for (const name of streams) {\n if (remainingChunks <= 0 || remainingBytes <= 0) break;\n const stream = streamsNamespace.get(streamsNamespace.idFromName(`stream:${name}`));\n const result = await stream.expireStream(cleanup.runId, cleanup.dueAt.getTime(), {\n limit: remainingChunks,\n byteLimit: remainingBytes,\n });\n remainingChunks -= result.chunks;\n remainingBytes -= result.bytes;\n if (result.done) completed.push(name);\n }\n const registryResult = await registry.finalizeRegistry(cleanup.runId, completed);\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'streams' || current.generation !== cleanup.generation) return;\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedStreams: registryResult.deleted,\n phase: registryResult.done ? 'queues' : 'streams',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deleteQueuePage(cleanup: CleanupRecord): Promise<void> {\n const entries = await this.ctx.storage.list<QueuePayloadRegistration>({\n prefix: QUEUE_PAYLOAD_REGISTRY_PREFIX,\n limit: QUEUE_PAYLOADS_PER_CLEANUP_PAGE + 1,\n });\n const page = Array.from(entries).slice(0, QUEUE_PAYLOADS_PER_CLEANUP_PAGE);\n const bucket = (this.env as WorkflowRunDOEnv)?.WORKFLOW_QUEUE_PAYLOADS;\n if (!bucket) {\n throw new Error('world-celld retention missing binding WORKFLOW_QUEUE_PAYLOADS');\n }\n if (page.length > 0) {\n await deleteQueuePayloadObjects(\n bucket,\n page.map(([, registration]) => registration.key),\n );\n }\n\n await this.ctx.storage.transaction(async (txn) => {\n const current = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (current?.phase !== 'queues' || current.generation !== cleanup.generation) return;\n if (page.length > 0) await txn.delete(page.map(([key]) => key));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...current,\n deletedQueuePayloads: current.deletedQueuePayloads + page.length,\n phase: entries.size <= QUEUE_PAYLOADS_PER_CLEANUP_PAGE ? 'payload' : 'queues',\n generation: current.generation + 1,\n attempts: 0,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n });\n }\n\n private async deletePayloadBatch(): Promise<boolean> {\n return await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (!cleanup || cleanup.phase !== 'payload') return true;\n const entries = await txn.list({ limit: PAYLOAD_DELETE_BATCH + 3, noCache: true });\n const keys = Array.from(entries.keys())\n .filter((key) => key !== CLEANUP_RECORD_KEY && key !== TOMBSTONE_KEY)\n .slice(0, PAYLOAD_DELETE_BATCH);\n const now = new Date(this.now());\n await txn.put(TOMBSTONE_KEY, cleanupTombstone(cleanup, now));\n if (keys.length > 0) await txn.delete(keys);\n\n if (keys.length > 0) {\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n deletedPayloadKeys: cleanup.deletedPayloadKeys + keys.length,\n generation: cleanup.generation + 1,\n lastError: undefined,\n });\n await txn.setAlarm(this.now() + 1);\n return false;\n }\n\n const completed: CleanupRecord = {\n ...cleanup,\n phase: 'tombstoned',\n generation: cleanup.generation + 1,\n attempts: 0,\n lastError: undefined,\n tombstonedAt: now,\n };\n await txn.put(TOMBSTONE_KEY, cleanupTombstone(completed, now));\n await txn.delete(CLEANUP_RECORD_KEY);\n await txn.deleteAlarm();\n return true;\n });\n }\n\n private async recordCleanupFailure(error: unknown, expected: CleanupRecord): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<CleanupRecord>(CLEANUP_RECORD_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation ||\n cleanup.phase === 'tombstoned'\n ) {\n return;\n }\n const attempts = cleanup.attempts + 1;\n const delay = Math.min(CLEANUP_RETRY_MAX_MS, 1000 * 2 ** Math.min(attempts - 1, 12));\n await txn.put(CLEANUP_RECORD_KEY, {\n ...cleanup,\n generation: cleanup.generation + 1,\n attempts,\n lastError: error instanceof Error ? error.message : String(error),\n lastAttemptAt: new Date(this.now()),\n });\n await txn.setAlarm(this.now() + delay);\n });\n }\n\n private async recordTerminalCleanupFailure(\n error: unknown,\n expected: TerminalCleanupRecord,\n ): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const cleanup = await txn.get<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY);\n if (\n !cleanup ||\n cleanup.phase !== expected.phase ||\n cleanup.generation !== expected.generation\n ) {\n return;\n }\n const attempts = cleanup.attempts + 1;\n const delay = Math.min(CLEANUP_RETRY_MAX_MS, 1000 * 2 ** Math.min(attempts - 1, 12));\n await txn.put<TerminalCleanupRecord>(TERMINAL_CLEANUP_KEY, {\n ...cleanup,\n generation: cleanup.generation + 1,\n attempts,\n lastError: error instanceof Error ? error.message : String(error),\n lastAttemptAt: new Date(this.now()),\n });\n await txn.setAlarm(this.now() + delay);\n });\n }\n\n async registerQueuePayload(\n registration: QueuePayloadRegistration,\n ): Promise<{ ok: true } | { ok: false; message: string }> {\n if (\n !registration ||\n typeof registration.messageId !== 'string' ||\n registration.messageId.length === 0 ||\n typeof registration.key !== 'string' ||\n registration.key.length === 0 ||\n !isNonNegativeSafeInteger(registration.orphanExpiresAt)\n ) {\n throw new TypeError('world-celld queue payload registration is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n await txn.put(queuePayloadRegistryKey(registration.messageId), registration);\n return { ok: true };\n });\n }\n\n async finalizeQueuePayload(\n messageId: string,\n ): Promise<{ ok: true } | { ok: false; message: string }> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload messageId must be a non-empty string');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const { tombstone } = await this.retentionState(txn);\n if (tombstone) {\n return {\n ok: false,\n message: `Workflow run \"${tombstone.runId}\" expired at ${tombstone.expiredAt.toISOString()}`,\n };\n }\n const registration = await txn.get<QueuePayloadRegistration>(\n queuePayloadRegistryKey(messageId),\n );\n return registration\n ? { ok: true }\n : {\n ok: false,\n message: 'workflow queue payload registration was removed before publication',\n };\n });\n }\n\n async unregisterQueuePayload(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload messageId must be a non-empty string');\n }\n await this.ctx.storage.delete(queuePayloadRegistryKey(messageId));\n }\n\n async scheduleQueuePayloadOrphan(orphan: QueuePayloadOrphan): Promise<void> {\n if (\n !orphan ||\n typeof orphan.messageId !== 'string' ||\n orphan.messageId.length === 0 ||\n typeof orphan.runId !== 'string' ||\n orphan.runId.length === 0 ||\n typeof orphan.key !== 'string' ||\n orphan.key.length === 0 ||\n !isNonNegativeSafeInteger(orphan.expiresAt)\n ) {\n throw new TypeError('world-celld queue payload orphan is invalid');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (existing && existing.messageId !== orphan.messageId) {\n throw new Error('world-celld queue payload orphan identity mismatch');\n }\n if (existing?.deleting) {\n throw new Error('world-celld queue payload orphan deletion is in progress');\n }\n const next: QueuePayloadOrphanState = {\n ...orphan,\n expiresAt: Math.max(existing?.expiresAt ?? 0, orphan.expiresAt),\n generation: (existing?.generation ?? 0) + 1,\n deleting: false,\n };\n await txn.put<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY, next);\n await txn.setAlarm(next.expiresAt);\n });\n }\n\n async cancelQueuePayloadOrphan(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue payload orphan messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const existing = await txn.get<QueuePayloadOrphanState>(QUEUE_ORPHAN_KEY);\n if (!existing || existing.messageId !== messageId) return;\n await txn.delete(QUEUE_ORPHAN_KEY);\n await txn.deleteAlarm();\n });\n }\n\n async reserveQueueMessage(params: {\n messageId: string;\n expiresAt: number;\n }): Promise<{ admitted: boolean; messageId: string }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.expiresAt)\n ) {\n throw new TypeError('world-celld queue message reservation is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>([QUEUE_RESERVATION_KEY, 'claim']);\n const existing = values.get(QUEUE_RESERVATION_KEY);\n const claim = values.get('claim');\n const now = this.now();\n if (existing && existing.expiresAt > now && existing.messageId !== params.messageId) {\n await txn.setAlarm(Math.min(existing.expiresAt, claim?.expiresAt ?? existing.expiresAt));\n return { admitted: false, messageId: existing.messageId };\n }\n const reservation: QueueMessageReservation = {\n messageId: params.messageId,\n expiresAt: Math.max(existing?.expiresAt ?? 0, params.expiresAt),\n };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n await txn.setAlarm(\n Math.min(reservation.expiresAt, claim?.expiresAt ?? reservation.expiresAt),\n );\n return { admitted: true, messageId: params.messageId };\n });\n }\n\n async completeQueueMessage(messageId: string): Promise<void> {\n if (typeof messageId !== 'string' || messageId.length === 0) {\n throw new TypeError('world-celld queue messageId must be a non-empty string');\n }\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>([QUEUE_RESERVATION_KEY, 'claim']);\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n let claim = values.get('claim');\n if (reservation?.messageId === messageId) {\n await txn.delete(QUEUE_RESERVATION_KEY);\n reservation = undefined;\n }\n if (claim?.messageId === messageId) {\n await txn.delete('claim');\n claim = undefined;\n }\n const nextAlarm = Math.min(\n reservation?.expiresAt ?? Number.POSITIVE_INFINITY,\n claim?.expiresAt ?? Number.POSITIVE_INFINITY,\n );\n if (Number.isFinite(nextAlarm)) await txn.setAlarm(nextAlarm);\n else await txn.deleteAlarm();\n });\n }\n\n async claimInflight(params: {\n messageId: string;\n staleMs: number;\n }): Promise<{ claimed: boolean; retryAt?: number }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isPositiveSafeInteger(params.staleMs)\n ) {\n throw new TypeError('world-celld queue claim is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n const reservation = values.get(QUEUE_RESERVATION_KEY);\n const now = this.now();\n if (existing && existing.expiresAt > now) {\n if (existing.messageId !== params.messageId) return { claimed: false };\n if (existing.retryAt === undefined || existing.retryAt > now) {\n return { claimed: false, retryAt: existing.retryAt ?? existing.expiresAt };\n }\n }\n const expiresAt = now + params.staleMs;\n await txn.put<InflightClaim>('claim', { messageId: params.messageId, expiresAt });\n await txn.setAlarm(Math.min(expiresAt, reservation?.expiresAt ?? expiresAt));\n return { claimed: true };\n });\n }\n\n async holdInflight(params: {\n messageId: string;\n retryAt: number;\n expiresAt: number;\n reservationExpiresAt?: number;\n }): Promise<{ held: boolean }> {\n if (\n typeof params?.messageId !== 'string' ||\n params.messageId.length === 0 ||\n !isNonNegativeSafeInteger(params.retryAt) ||\n !isNonNegativeSafeInteger(params.expiresAt) ||\n (params.reservationExpiresAt !== undefined &&\n !isNonNegativeSafeInteger(params.reservationExpiresAt))\n ) {\n throw new TypeError('world-celld queue claim hold is invalid');\n }\n return await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n let reservation = values.get(QUEUE_RESERVATION_KEY);\n if (!existing || existing.messageId !== params.messageId) return { held: false };\n const expiresAt = Math.max(existing.expiresAt, params.expiresAt);\n await txn.put<InflightClaim>('claim', { ...existing, retryAt: params.retryAt, expiresAt });\n if (\n reservation?.messageId === params.messageId &&\n params.reservationExpiresAt !== undefined &&\n params.reservationExpiresAt > reservation.expiresAt\n ) {\n reservation = { ...reservation, expiresAt: params.reservationExpiresAt };\n await txn.put(QUEUE_RESERVATION_KEY, reservation);\n }\n await txn.setAlarm(Math.min(expiresAt, reservation?.expiresAt ?? expiresAt));\n return { held: true };\n });\n }\n\n async releaseInflight(messageId?: string): Promise<void> {\n await this.ctx.storage.transaction(async (txn) => {\n const values = await txn.get<InflightClaim>(['claim', QUEUE_RESERVATION_KEY]);\n const existing = values.get('claim');\n const reservation = values.get(QUEUE_RESERVATION_KEY);\n if (!existing || (messageId !== undefined && existing.messageId !== messageId)) return;\n await txn.delete('claim');\n if (reservation) await txn.setAlarm(reservation.expiresAt);\n else await txn.deleteAlarm();\n });\n }\n}\n","/**\n * 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 { RunCatalogDO } from '../worker/durable-objects/RunCatalogDO.js';\nimport { StreamDO } from '../worker/durable-objects/StreamDO.js';\nimport { WorkflowRunDO } from '../worker/durable-objects/WorkflowRunDO.js';\nimport { createQueuePayloadStore } from '../worker/queue-payload-store.js';\nimport { FakeFleet } from './fake-cell.js';\n\nexport interface Harness {\n url: string;\n fleet: FakeFleet;\n queueMessages: string[];\n queuePayloads: ReadonlyMap<string, string>;\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. */\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 queueMessages: string[] = [];\n const queuePayloads = new Map<string, string>();\n const queuePayloadBucket = {\n async put(key: string, value: string) {\n queuePayloads.set(key, value);\n },\n async get(key: string) {\n const value = queuePayloads.get(key);\n return value === undefined ? null : { text: async () => value };\n },\n async delete(keys: string | string[]) {\n for (const key of Array.isArray(keys) ? keys : [keys]) queuePayloads.delete(key);\n },\n };\n const nativeQueue = {\n async send(body: string) {\n queueMessages.push(body);\n },\n };\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 ...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_PAYLOADS: queuePayloadBucket,\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: nativeQueue,\n WORKFLOW_QUEUE_PAYLOADS: createQueuePayloadStore(queuePayloadBucket),\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 queueMessages,\n queuePayloads,\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. Native Queue\n * publications are exposed through `queueMessages` for local inspection.\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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"}
|