rivetkit 2.3.3 → 2.3.5-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/client.d.ts +157 -9
- package/dist/browser/client.js +518 -542
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.d.ts +101 -2
- package/dist/browser/inspector/client.js +1245 -227
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/agent-os/index.cjs +103 -36
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.d.cts +159 -11
- package/dist/tsup/agent-os/index.d.ts +159 -11
- package/dist/tsup/agent-os/index.js +103 -36
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-34P567PO.cjs → chunk-4XKED5P5.cjs} +145 -176
- package/dist/tsup/chunk-4XKED5P5.cjs.map +1 -0
- package/dist/tsup/{chunk-PYO2U53V.cjs → chunk-6HQCLWAW.cjs} +384 -4
- package/dist/tsup/chunk-6HQCLWAW.cjs.map +1 -0
- package/dist/tsup/{chunk-JZ7TWV65.js → chunk-7AFZMFPQ.js} +15 -1
- package/dist/tsup/chunk-7AFZMFPQ.js.map +1 -0
- package/dist/tsup/{chunk-BLDO2FKO.js → chunk-B4IZU537.js} +382 -2
- package/dist/tsup/chunk-B4IZU537.js.map +1 -0
- package/dist/tsup/{chunk-3MHDOUD7.cjs → chunk-G3CCRCTK.cjs} +14 -9
- package/dist/tsup/chunk-G3CCRCTK.cjs.map +1 -0
- package/dist/tsup/{chunk-CXRPENO3.js → chunk-GAV4PKFT.js} +15 -46
- package/dist/tsup/{chunk-CXRPENO3.js.map → chunk-GAV4PKFT.js.map} +1 -1
- package/dist/tsup/{chunk-HXUEHHJF.js → chunk-JI6GZ2C2.js} +2 -11
- package/dist/tsup/{chunk-HXUEHHJF.js.map → chunk-JI6GZ2C2.js.map} +1 -1
- package/dist/tsup/{chunk-YUEC5SEY.cjs → chunk-M3FCXL3Q.cjs} +3 -3
- package/dist/tsup/{chunk-YUEC5SEY.cjs.map → chunk-M3FCXL3Q.cjs.map} +1 -1
- package/dist/tsup/{chunk-KEKWJECX.js → chunk-MGTSVSUC.js} +2 -2
- package/dist/tsup/{chunk-VE2X4KMG.cjs → chunk-MYWZCDML.cjs} +2 -11
- package/dist/tsup/chunk-MYWZCDML.cjs.map +1 -0
- package/dist/tsup/{chunk-DFA7SYSW.js → chunk-NIC3QLKL.js} +3 -3
- package/dist/tsup/{chunk-BZM4PMFS.js → chunk-P4OGQ4JL.js} +5 -7
- package/dist/tsup/{chunk-BZM4PMFS.js.map → chunk-P4OGQ4JL.js.map} +1 -1
- package/dist/tsup/{chunk-NT2NK3VT.js → chunk-PAG6G46L.js} +2 -2
- package/dist/tsup/{chunk-XIX5DOZN.js → chunk-SHBE77IT.js} +14 -9
- package/dist/tsup/chunk-SHBE77IT.js.map +1 -0
- package/dist/tsup/{chunk-TYLP3U4Y.cjs → chunk-TNIWIUNV.cjs} +9 -11
- package/dist/tsup/chunk-TNIWIUNV.cjs.map +1 -0
- package/dist/tsup/{chunk-S644FL73.cjs → chunk-TR5NLR5V.cjs} +4 -4
- package/dist/tsup/{chunk-S644FL73.cjs.map → chunk-TR5NLR5V.cjs.map} +1 -1
- package/dist/tsup/{chunk-ZA7FLHKH.cjs → chunk-UEULFXUI.cjs} +16 -2
- package/dist/tsup/chunk-UEULFXUI.cjs.map +1 -0
- package/dist/tsup/{chunk-X63ROSOG.cjs → chunk-UJ2FQY63.cjs} +7 -7
- package/dist/tsup/{chunk-X63ROSOG.cjs.map → chunk-UJ2FQY63.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +7 -8
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +5 -4
- package/dist/tsup/client/mod.d.ts +5 -4
- package/dist/tsup/client/mod.js +6 -7
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/{config-D49x8NpL.d.cts → config-BxOimoGX.d.cts} +16 -0
- package/dist/tsup/{config-D49x8NpL.d.ts → config-BxOimoGX.d.ts} +16 -0
- package/dist/tsup/{config-ZkIsRFsN.d.ts → config-BzdqbLAP.d.ts} +164 -27
- package/dist/tsup/{config-BfBhjEbk.d.cts → config-CPPEwn_e.d.cts} +164 -27
- package/dist/tsup/{context-sZ9GlaBK.d.cts → context-DSA9gFXB.d.cts} +2 -2
- package/dist/tsup/{context-B7-84u9K.d.ts → context-wWv-K2K_.d.ts} +2 -2
- package/dist/tsup/db/drizzle.cjs +120 -68
- package/dist/tsup/db/drizzle.cjs.map +1 -1
- package/dist/tsup/db/drizzle.d.cts +8 -3
- package/dist/tsup/db/drizzle.d.ts +8 -3
- package/dist/tsup/db/drizzle.js +120 -68
- package/dist/tsup/db/drizzle.js.map +1 -1
- package/dist/tsup/db/mod.cjs +74 -22
- package/dist/tsup/db/mod.cjs.map +1 -1
- package/dist/tsup/db/mod.d.cts +4 -3
- package/dist/tsup/db/mod.d.ts +4 -3
- package/dist/tsup/db/mod.js +74 -22
- package/dist/tsup/db/mod.js.map +1 -1
- package/dist/tsup/dynamic/mod.cjs +2 -2
- package/dist/tsup/dynamic/mod.d.cts +3 -3
- package/dist/tsup/dynamic/mod.d.ts +3 -3
- package/dist/tsup/dynamic/mod.js +1 -1
- package/dist/tsup/inspector/mod.cjs +4 -5
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.js +3 -4
- package/dist/tsup/inspector/mod.js.map +1 -1
- package/dist/tsup/inspector-tab/mod.cjs +2 -2
- package/dist/tsup/inspector-tab/mod.cjs.map +1 -1
- package/dist/tsup/inspector-tab/mod.d.cts +5 -5
- package/dist/tsup/inspector-tab/mod.d.ts +5 -5
- package/dist/tsup/inspector-tab/mod.js +1 -1
- package/dist/tsup/inspector-tab/mod.js.map +1 -1
- package/dist/tsup/mod.cjs +605 -158
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +5 -5
- package/dist/tsup/mod.d.ts +5 -5
- package/dist/tsup/mod.js +528 -81
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +10 -11
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +3 -3
- package/dist/tsup/test/mod.d.ts +3 -3
- package/dist/tsup/test/mod.js +6 -7
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils-CV0akuDD.d.ts +162 -0
- package/dist/tsup/utils-DQDCphrl.d.cts +162 -0
- package/dist/tsup/utils.cjs +6 -2
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +3 -146
- package/dist/tsup/utils.d.ts +3 -146
- package/dist/tsup/utils.js +5 -1
- package/dist/tsup/workflow/mod.cjs +198 -151
- package/dist/tsup/workflow/mod.cjs.map +1 -1
- package/dist/tsup/workflow/mod.d.cts +5 -5
- package/dist/tsup/workflow/mod.d.ts +5 -5
- package/dist/tsup/workflow/mod.js +187 -140
- package/dist/tsup/workflow/mod.js.map +1 -1
- package/package.json +8 -8
- package/src/actor/config.test.ts +14 -0
- package/src/actor/config.ts +104 -16
- package/src/actor/definition.ts +18 -7
- package/src/agent-os/actor/index.ts +2 -2
- package/src/common/bare/generated/actor-runtime-socket-protocol/v1.ts +848 -0
- package/src/common/bare/generated/inspector/v6.ts +1367 -0
- package/src/common/database/config.ts +24 -0
- package/src/common/database/mod.test.ts +148 -59
- package/src/common/database/mod.ts +93 -23
- package/src/common/database/native-database.test.ts +9 -0
- package/src/common/database/native-database.ts +151 -0
- package/src/common/database/shared.ts +15 -0
- package/src/common/encoding.ts +28 -21
- package/src/db/drizzle.test.ts +157 -0
- package/src/db/drizzle.ts +170 -79
- package/src/dynamic/isolate-runtime.ts +0 -2
- package/src/engine-client/driver.ts +0 -15
- package/src/engine-client/mod.ts +0 -41
- package/src/inspector/client.browser.ts +69 -8
- package/src/inspector-tab/mod.ts +1 -0
- package/src/registry/config/index.ts +1 -35
- package/src/registry/napi-runtime.ts +204 -16
- package/src/registry/native.ts +200 -30
- package/src/registry/runtime.ts +146 -3
- package/src/registry/wasm-runtime.ts +217 -6
- package/src/utils.ts +3 -0
- package/src/workflow/context.ts +5 -27
- package/src/workflow/driver.test.ts +62 -0
- package/src/workflow/driver.ts +231 -113
- package/src/workflow/mod.ts +3 -3
- package/dist/tsup/chunk-34P567PO.cjs.map +0 -1
- package/dist/tsup/chunk-3MHDOUD7.cjs.map +0 -1
- package/dist/tsup/chunk-APW73HCH.cjs +0 -382
- package/dist/tsup/chunk-APW73HCH.cjs.map +0 -1
- package/dist/tsup/chunk-BLDO2FKO.js.map +0 -1
- package/dist/tsup/chunk-DHXWD4DF.js +0 -382
- package/dist/tsup/chunk-DHXWD4DF.js.map +0 -1
- package/dist/tsup/chunk-JZ7TWV65.js.map +0 -1
- package/dist/tsup/chunk-PYO2U53V.cjs.map +0 -1
- package/dist/tsup/chunk-TYLP3U4Y.cjs.map +0 -1
- package/dist/tsup/chunk-VE2X4KMG.cjs.map +0 -1
- package/dist/tsup/chunk-XIX5DOZN.js.map +0 -1
- package/dist/tsup/chunk-ZA7FLHKH.cjs.map +0 -1
- package/src/actor/driver.ts +0 -141
- package/src/actor/instance/mod.ts +0 -2484
- package/src/drivers/engine/actor-driver.ts +0 -2473
- /package/dist/tsup/{chunk-KEKWJECX.js.map → chunk-MGTSVSUC.js.map} +0 -0
- /package/dist/tsup/{chunk-DFA7SYSW.js.map → chunk-NIC3QLKL.js.map} +0 -0
- /package/dist/tsup/{chunk-NT2NK3VT.js.map → chunk-PAG6G46L.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/workflow/mod.ts","../../../src/workflow/constants.ts","../../../src/workflow/context.ts","../../../src/workflow/driver.ts"],"sourcesContent":["import {\n\tCriticalError,\n\tEntryInProgressError,\n\tHistoryDivergedError,\n\tJoinError,\n\tRaceError,\n\tRollbackCheckpointError,\n\tRollbackError,\n\treplayWorkflowFromStep,\n\ttype RunWorkflowOptions,\n\trunWorkflow,\n\tStepExhaustedError,\n\ttype WorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nimport invariant from \"invariant\";\nimport type { RunContext } from \"@/actor/config\";\nimport {\n\tACTOR_CONTEXT_INTERNAL_SYMBOL,\n\tRUN_FUNCTION_CONFIG_SYMBOL,\n} from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { isActorAbortedError, RivetError } from \"@/actor/errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"@/actor/schema\";\nimport type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport { stringifyError } from \"@/utils\";\nimport { WorkflowContext } from \"./context\";\nimport { ActorWorkflowControlDriver, ActorWorkflowDriver } from \"./driver\";\nimport { createWorkflowInspectorAdapter } from \"./inspector\";\n\nexport type {\n\tTryBlockCatchKind,\n\tTryBlockConfig,\n\tTryBlockFailure,\n\tTryBlockResult,\n\tTryStepCatchKind,\n\tTryStepConfig,\n\tTryStepFailure,\n\tTryStepResult,\n\tWorkflowError,\n\tWorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nexport { Loop } from \"@rivetkit/workflow-engine\";\nexport {\n\ttype WorkflowBranchConfig,\n\ttype WorkflowBranchContextOf,\n\tWorkflowContext,\n\ttype WorkflowContextOf,\n\ttype WorkflowLoopConfig,\n\ttype WorkflowLoopContextOf,\n\ttype WorkflowStepConfig,\n\tWorkflowStepContext,\n\ttype WorkflowStepContextOf,\n\ttype WorkflowTryConfig,\n\ttype WorkflowTryStepConfig,\n} from \"./context\";\n\nfunction shouldRethrowWorkflowError(error: unknown): boolean {\n\tif (\n\t\terror instanceof CriticalError ||\n\t\terror instanceof JoinError ||\n\t\terror instanceof RaceError ||\n\t\terror instanceof RollbackError ||\n\t\terror instanceof StepExhaustedError\n\t) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\terror instanceof EntryInProgressError ||\n\t\terror instanceof HistoryDivergedError ||\n\t\terror instanceof RollbackCheckpointError\n\t) {\n\t\treturn true;\n\t}\n\n\treturn true;\n}\n\nfunction workflowReplayInFlightError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"workflow_in_flight\",\n\t\t\"Workflow replay is unavailable while the workflow is currently in flight.\",\n\t\t{\n\t\t\tpublic: true,\n\t\t\tstatusCode: 409,\n\t\t},\n\t);\n}\n\nfunction isWorkflowReplayBlockedByRunningEntry(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message ===\n\t\t\t\"Cannot replay a workflow while a step is currently running\"\n\t);\n}\n\nexport interface WorkflowOptions<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\tonError?: (\n\t\tctx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tevent: WorkflowErrorEvent,\n\t) => void | Promise<void>;\n}\n\nexport function workflow<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n>(\n\tfn: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) => Promise<unknown>,\n\toptions: WorkflowOptions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> = {},\n): (\n\tc: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<void> {\n\tconst onError = options.onError;\n\tconst workflowInspectors = new Map<\n\t\tstring,\n\t\tReturnType<typeof createWorkflowInspectorAdapter>\n\t>();\n\n\tfunction getWorkflowInspector(actorId: string) {\n\t\tlet workflowInspector = workflowInspectors.get(actorId);\n\t\tif (!workflowInspector) {\n\t\t\tworkflowInspector = createWorkflowInspectorAdapter();\n\t\t\tworkflowInspectors.set(actorId, workflowInspector);\n\t\t}\n\t\treturn workflowInspector;\n\t}\n\n\tasync function run(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<void> {\n\t\tconst actor = (\n\t\t\trunCtx as unknown as {\n\t\t\t\t[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: AnyStaticActorInstance;\n\t\t\t}\n\t\t)[ACTOR_CONTEXT_INTERNAL_SYMBOL];\n\t\tinvariant(actor, \"workflow() requires an actor instance\");\n\t\tconst workflowInspector = getWorkflowInspector(actor.id);\n\n\t\tconst driver = new ActorWorkflowDriver(actor, runCtx);\n\t\tconst controlDriver = new ActorWorkflowControlDriver(actor);\n\t\tworkflowInspector.setReplayFromStep(async (entryId) => {\n\t\t\tconst workflowState = await workflowInspector.adapter.getState();\n\t\t\tif (\n\t\t\t\tactor.isRunHandlerActive() ||\n\t\t\t\tworkflowState === \"pending\" ||\n\t\t\t\tworkflowState === \"running\"\n\t\t\t) {\n\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t}\n\n\t\t\tlet snapshot;\n\t\t\ttry {\n\t\t\t\tsnapshot = await replayWorkflowFromStep(\n\t\t\t\t\tactor.id,\n\t\t\t\t\tcontrolDriver,\n\t\t\t\t\tentryId,\n\t\t\t\t\t{ scheduleAlarm: false },\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWorkflowReplayBlockedByRunningEntry(error)) {\n\t\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tworkflowInspector.update(snapshot);\n\t\t\tawait actor.restartRunHandler();\n\t\t\treturn workflowInspector.adapter.getHistory();\n\t\t});\n\n\t\tconst handle = runWorkflow(\n\t\t\tactor.id,\n\t\t\tasync (ctx) => await fn(new WorkflowContext(ctx, runCtx)),\n\t\t\tundefined,\n\t\t\tdriver,\n\t\t\t{\n\t\t\t\tmode: \"live\",\n\t\t\t\t// The actor logger and the engine's pino logger are runtime\n\t\t\t\t// compatible but not structurally assignable.\n\t\t\t\tlogger: runCtx.log as RunWorkflowOptions[\"logger\"],\n\t\t\t\tonHistoryUpdated: workflowInspector.update,\n\t\t\t\tonError: onError\n\t\t\t\t\t? async (event) => await onError(runCtx, event)\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t);\n\t\tworkflowInspector.setGetState(async () => await handle.getState());\n\n\t\tconst onAbort = () => {\n\t\t\thandle.evict();\n\t\t};\n\t\tif (runCtx.abortSignal.aborted) {\n\t\t\tonAbort();\n\t\t} else {\n\t\t\trunCtx.abortSignal.addEventListener(\"abort\", onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tawait handle.result;\n\t\t} catch (error) {\n\t\t\t// `abortSignal.aborted` is delivered on a separate async hop and\n\t\t\t// races the rejection, so detect the sleep abort structurally too.\n\t\t\tif (runCtx.abortSignal.aborted || isActorAbortedError(error)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (shouldRethrowWorkflowError(error)) {\n\t\t\t\trunCtx.log.error({\n\t\t\t\t\tmsg: \"workflow run failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\trunCtx.log.warn({\n\t\t\t\tmsg: \"workflow failed and will sleep until woken\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t} finally {\n\t\t\trunCtx.abortSignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t}\n\n\tconst runWithConfig = run as typeof run & {\n\t\t[RUN_FUNCTION_CONFIG_SYMBOL]?: {\n\t\t\ticon?: string;\n\t\t\tinspectorFactory?: (actor: unknown) => unknown;\n\t\t\tdisposeInspector?: (actorId: string) => void;\n\t\t};\n\t};\n\trunWithConfig[RUN_FUNCTION_CONFIG_SYMBOL] = {\n\t\ticon: \"diagram-project\",\n\t\t// Drop the per-actor inspector when the actor is destroyed so this map\n\t\t// does not retain one inspector (and its encoded history) per actor id\n\t\t// for the process lifetime.\n\t\tdisposeInspector: (actorId) => {\n\t\t\tworkflowInspectors.delete(actorId);\n\t\t},\n\t\tinspectorFactory: (actor) => {\n\t\t\tconst actorId = resolveWorkflowInspectorActorId(actor);\n\t\t\treturn {\n\t\t\t\tworkflow: actorId\n\t\t\t\t\t? getWorkflowInspector(actorId).adapter\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tgetHistory: () => null,\n\t\t\t\t\t\t\tonHistoryUpdated: () => () => {},\n\t\t\t\t\t\t\treplayFromStep: async () => null,\n\t\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n\n\treturn runWithConfig;\n}\n\nfunction resolveWorkflowInspectorActorId(actor: unknown): string | undefined {\n\tif (typeof actor === \"string\" && actor.length > 0) {\n\t\treturn actor;\n\t}\n\n\tif (!actor || typeof actor !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\tconst candidate = actor as {\n\t\tid?: unknown;\n\t\tactorId?: unknown;\n\t};\n\tif (typeof candidate.id === \"string\" && candidate.id.length > 0) {\n\t\treturn candidate.id;\n\t}\n\tif (typeof candidate.actorId === \"string\" && candidate.actorId.length > 0) {\n\t\treturn candidate.actorId;\n\t}\n\n\treturn undefined;\n}\n","export const WORKFLOW_GUARD_KV_KEY = \"__rivet_actor_workflow_guard_triggered\";\n","import type {\n\tBranchConfig,\n\tBranchOutput,\n\tEntryKindType,\n\tLoopConfig,\n\tLoopResult,\n\tStepConfig,\n\tTryBlockConfig,\n\tTryBlockResult,\n\tTryStepConfig,\n\tTryStepResult,\n\tWorkflowContextInterface,\n\tWorkflowQueueMessage,\n} from \"@rivetkit/workflow-engine\";\nimport type {\n\tQueueFilterName,\n\tQueueNextBatchOptions,\n\tQueueNextOptions,\n\tQueueResultMessageForName,\n} from \"@/actor/config\";\nimport { RAW_STATE_SYMBOL, type RunContext } from \"@/actor/config\";\nimport type {\n\tAnyActorDefinition,\n\tBaseActorDefinition,\n} from \"@/actor/definition\";\nimport type {\n\tEventSchemaConfig,\n\tInferEventArgs,\n\tInferSchemaMap,\n\tQueueSchemaConfig,\n} from \"@/actor/schema\";\nimport type { Client } from \"@/client/client\";\nimport type {\n\tAnyDatabaseProvider,\n\tInferDatabaseClient,\n} from \"@/common/database/config\";\nimport type { Registry } from \"@/registry\";\nimport { WORKFLOW_GUARD_KV_KEY } from \"./constants\";\n\ntype WorkflowActorQueueNextOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextOptionsFallback<TCompletable extends boolean> = Omit<\n\tQueueNextOptions<string, TCompletable>,\n\t\"signal\"\n>;\n\ntype WorkflowActorQueueNextBatchOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextBatchOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextBatchOptionsFallback<TCompletable extends boolean> =\n\tOmit<QueueNextBatchOptions<string, TCompletable>, \"signal\">;\n\n// Step run callbacks receive a WorkflowStepContext, which is the only place\n// actor data (state/db/vars/client) may be touched.\ntype WorkflowStepRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\n// Step rollback callbacks compensate a committed step, so they also run with a\n// WorkflowStepContext to mutate actor data.\ntype WorkflowStepRollback<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n\toutput: T,\n) => Promise<void>;\n\n// Orchestration callbacks (try/loop/race/join) receive a WorkflowContext,\n// because inside them you sequence further steps rather than touch actor data.\ntype WorkflowContextRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tctx: WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\nexport type WorkflowStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<StepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryStepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryBlockConfig<T>, \"run\"> & {\n\trun: WorkflowContextRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowLoopConfig<\n\tS,\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<LoopConfig<S, T>, \"run\"> & {\n\trun: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tstate: S,\n\t) => Promise<\n\t\tLoopResult<S, T> | (S extends undefined ? undefined | void : never)\n\t>;\n};\n\nexport type WorkflowBranchConfig<\n\tTOutput,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = {\n\trun: WorkflowContextRun<\n\t\tTOutput,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\n// Marks a step context inactive once its step has finished. Module-private so it\n// never appears on the public surface.\nconst DEACTIVATE_STEP = Symbol(\"workflow.step.deactivate\");\n\n/**\n * The context handed to a workflow step (`step` / `tryStep` callbacks). This is\n * the only scope where actor data (state, vars, db, client) and side effects\n * (broadcast, queue.send) are reachable. It is valid only while its step is\n * executing; using it after the step resolves throws.\n */\nexport class WorkflowStepContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\t#active = true;\n\t#onGuardViolation: () => void;\n\n\tconstructor(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tonGuardViolation: () => void,\n\t) {\n\t\tthis.#runCtx = runCtx;\n\t\tthis.#onGuardViolation = onGuardViolation;\n\t}\n\n\t[DEACTIVATE_STEP](): void {\n\t\tthis.#active = false;\n\t}\n\n\t#ensureActive(feature: string): void {\n\t\tif (!this.#active) {\n\t\t\tthis.#onGuardViolation();\n\t\t\tthrow new Error(\n\t\t\t\t`${feature} is only available inside workflow steps`,\n\t\t\t);\n\t\t}\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#runCtx.abortSignal;\n\t}\n\n\tget state(): TState extends never ? never : TState {\n\t\tthis.#ensureActive(\"state\");\n\t\treturn this.#runCtx.state as TState extends never ? never : TState;\n\t}\n\n\tget vars(): TVars extends never ? never : TVars {\n\t\tthis.#ensureActive(\"vars\");\n\t\treturn this.#runCtx.vars as TVars extends never ? never : TVars;\n\t}\n\n\tget db(): TDatabase extends never ? never : InferDatabaseClient<TDatabase> {\n\t\tthis.#ensureActive(\"db\");\n\t\treturn this.#runCtx.db as TDatabase extends never\n\t\t\t? never\n\t\t\t: InferDatabaseClient<TDatabase>;\n\t}\n\n\tclient<R extends Registry<any> = Registry<any>>(): Client<R> {\n\t\tthis.#ensureActive(\"client\");\n\t\treturn this.#runCtx.client<R>();\n\t}\n\n\tbroadcast<K extends keyof TEvents & string>(\n\t\tname: K,\n\t\t...args: InferEventArgs<InferSchemaMap<TEvents>[K]>\n\t): void;\n\tbroadcast(\n\t\tname: keyof TEvents extends never ? string : never,\n\t\t...args: Array<unknown>\n\t): void;\n\tbroadcast(name: string, ...args: Array<unknown>): void {\n\t\tthis.#ensureActive(\"broadcast\");\n\t\tthis.#runCtx.broadcast(\n\t\t\tname as never,\n\t\t\t...(args as unknown[] as never[]),\n\t\t);\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction send<K extends keyof TQueues & string>(\n\t\t\tname: K,\n\t\t\tbody: InferSchemaMap<TQueues>[K],\n\t\t): Promise<void>;\n\t\tfunction send(\n\t\t\tname: keyof TQueues extends never ? string : never,\n\t\t\tbody: unknown,\n\t\t): Promise<void>;\n\t\tasync function send(name: string, body: unknown): Promise<void> {\n\t\t\tself.#ensureActive(\"queue.send\");\n\t\t\tawait self.#runCtx.queue.send(name as never, body as never);\n\t\t}\n\t\treturn { send };\n\t}\n\n\t/**\n\t * Holds the actor awake for the duration of the provided promise. The actor\n\t * cannot idle-sleep or finalize the sleep grace period until the promise\n\t * settles.\n\t */\n\tkeepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tthis.#ensureActive(\"keepAwake\");\n\t\treturn this.#runCtx.keepAwake(promise);\n\t}\n\n\t/**\n\t * Registers a promise that the sleep grace period will wait on. Use this for\n\t * best-effort flush/cleanup work that may complete inside the grace window.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#ensureActive(\"waitUntil\");\n\t\tthis.#runCtx.waitUntil(promise);\n\t}\n\n\tdestroy(): void {\n\t\tthis.#ensureActive(\"destroy\");\n\t\tthis.#runCtx.destroy();\n\t}\n}\n\n/**\n * The context handed to the workflow function and to orchestration callbacks\n * (`try` / `loop` / `race` / `join`). It exposes the deterministic, replayable\n * workflow primitives (step, sleep, queue waits, control flow). It deliberately\n * does NOT expose actor data; reach `state`, `db`, `vars`, `client`, and\n * `broadcast` through the step context passed to `step` / `tryStep`.\n */\nexport class WorkflowContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#inner: WorkflowContextInterface;\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\n\tconstructor(\n\t\tinner: WorkflowContextInterface,\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) {\n\t\tthis.#inner = inner;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tget workflowId(): string {\n\t\treturn this.#inner.workflowId;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#inner.abortSignal;\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction next<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptions<TName, TCompletable>,\n\t\t): Promise<QueueResultMessageForName<TQueues, TName, TCompletable>>;\n\t\tfunction next<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tQueueResultMessageForName<\n\t\t\t\tTQueues,\n\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\tTCompletable\n\t\t\t>\n\t\t>;\n\t\t// The implementation signature stays broad so the schema-typed public\n\t\t// overloads above remain compatible with it.\n\t\tasync function next(name: string, opts?: any): Promise<any> {\n\t\t\tconst message = await self.#inner.queue.next(name, opts);\n\t\t\treturn self.#toActorQueueMessage(message);\n\t\t}\n\n\t\tfunction nextBatch<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptions<TName, TCompletable>,\n\t\t): Promise<\n\t\t\tArray<QueueResultMessageForName<TQueues, TName, TCompletable>>\n\t\t>;\n\t\tfunction nextBatch<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tArray<\n\t\t\t\tQueueResultMessageForName<\n\t\t\t\t\tTQueues,\n\t\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\t\tTCompletable\n\t\t\t\t>\n\t\t\t>\n\t\t>;\n\t\tasync function nextBatch(name: string, opts?: any): Promise<any> {\n\t\t\tconst messages = await self.#inner.queue.nextBatch(name, opts);\n\t\t\treturn messages.map((message) =>\n\t\t\t\tself.#toActorQueueMessage(message),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tnext,\n\t\t\tnextBatch,\n\t\t};\n\t}\n\n\tstep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tstep<T>(\n\t\tconfig: WorkflowStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync step<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.step(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: StepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.step(config));\n\t}\n\n\ttryStep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\ttryStep<T>(\n\t\tconfig: WorkflowTryStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\tasync tryStep<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.tryStep(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: TryStepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.tryStep(config));\n\t}\n\n\ttry<T>(\n\t\tname: string,\n\t\trun: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\ttry<T>(\n\t\tconfig: WorkflowTryConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\tasync try<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Try run function missing\");\n\t\t\t}\n\t\t\tconst tryRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.try(nameOrConfig, async (ctx) =>\n\t\t\t\t\ttryRun(this.#createChildContext(ctx)),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst tryConfig = nameOrConfig;\n\t\tconst config: TryBlockConfig<T> = {\n\t\t\t...tryConfig,\n\t\t\trun: async (ctx) => tryConfig.run(this.#createChildContext(ctx)),\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.try(config));\n\t}\n\n\tloop<T>(\n\t\tname: string,\n\t\trun: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, T> | undefined | void>,\n\t): Promise<T>;\n\tloop<S, T>(\n\t\tconfig: WorkflowLoopConfig<\n\t\t\tS,\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync loop(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowLoopConfig<\n\t\t\t\t\tany,\n\t\t\t\t\tany,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, any> | undefined | void>,\n\t): Promise<any> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Loop run function missing\");\n\t\t\t}\n\t\t\tconst loopRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.loop(\n\t\t\t\t\tnameOrConfig,\n\t\t\t\t\t// A void return (no explicit Loop result) is undefined at\n\t\t\t\t\t// runtime, which the engine treats as continue.\n\t\t\t\t\tasync (\n\t\t\t\t\t\tctx,\n\t\t\t\t\t): Promise<LoopResult<undefined, any> | undefined> =>\n\t\t\t\t\t\t(await loopRun(this.#createChildContext(ctx))) ??\n\t\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst loopConfig = nameOrConfig;\n\t\tconst wrapped: LoopConfig<any, any> = {\n\t\t\t...loopConfig,\n\t\t\trun: (async (ctx, state) =>\n\t\t\t\t(await loopConfig.run(this.#createChildContext(ctx), state)) ??\n\t\t\t\tundefined) as LoopConfig<any, any>[\"run\"],\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.loop(wrapped));\n\t}\n\n\tsleep(name: string, durationMs: number): Promise<void> {\n\t\treturn this.#inner.sleep(name, durationMs);\n\t}\n\n\tsleepUntil(name: string, timestampMs: number): Promise<void> {\n\t\treturn this.#inner.sleepUntil(name, timestampMs);\n\t}\n\n\tasync rollbackCheckpoint(name: string): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.rollbackCheckpoint(name));\n\t}\n\n\tasync join<\n\t\tT extends Record<\n\t\t\tstring,\n\t\t\tWorkflowBranchConfig<\n\t\t\t\tunknown,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>\n\t\t>,\n\t>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K][\"run\"]>> }>;\n\tasync join<T extends Record<string, BranchConfig<unknown>>>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: BranchOutput<T[K]> }>;\n\tasync join(\n\t\tname: string,\n\t\tbranches: Record<string, { run: (ctx: any) => Promise<unknown> }>,\n\t) {\n\t\tconst wrappedBranches = Object.fromEntries(\n\t\t\tObject.entries(branches).map(([key, branch]) => [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\trun: async (ctx: WorkflowContextInterface) =>\n\t\t\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t\t\t},\n\t\t\t]),\n\t\t) as Record<string, BranchConfig<unknown>>;\n\t\treturn await this.#wrapActive(() =>\n\t\t\tthis.#inner.join(name, wrappedBranches),\n\t\t);\n\t}\n\n\tasync race<T>(\n\t\tname: string,\n\t\tbranches: Array<{\n\t\t\tname: string;\n\t\t\trun: WorkflowContextRun<\n\t\t\t\tT,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>;\n\t\t}>,\n\t): Promise<{ winner: string; value: T }> {\n\t\tconst wrappedBranches = branches.map((branch) => ({\n\t\t\tname: branch.name,\n\t\t\trun: (ctx: WorkflowContextInterface) =>\n\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t}));\n\t\treturn (await this.#wrapActive(() =>\n\t\t\tthis.#inner.race(name, wrappedBranches),\n\t\t)) as { winner: string; value: T };\n\t}\n\n\tasync removed(name: string, originalType: EntryKindType): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.removed(name, originalType));\n\t}\n\n\tgetVersion(name: string, latest: number): Promise<number> {\n\t\treturn this.#wrapActive(() => this.#inner.getVersion(name, latest));\n\t}\n\n\tisEvicted(): boolean {\n\t\treturn this.#inner.isEvicted();\n\t}\n\n\t// Runs a user step body inside a fresh step context, snapshotting actor\n\t// state/vars so a thrown step rolls back its mutations, and deactivating the\n\t// step context once the body settles so it cannot be used after the step.\n\tasync #runStep<T>(\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\n\t\tlet stateSnapshot: { state: TState } | null = null;\n\t\ttry {\n\t\t\tstateSnapshot = { state: this.#runCtx[RAW_STATE_SYMBOL]() };\n\t\t} catch (error) {\n\t\t\tthis.#runCtx.log.debug({\n\t\t\t\tmsg: \"failed to get state, likely due to being stateless workflow\",\n\t\t\t\terror,\n\t\t\t});\n\t\t}\n\t\tif (stateSnapshot) {\n\t\t\tstateSnapshot.state = structuredClone(stateSnapshot.state);\n\t\t}\n\t\tconst varsSnapshot = structuredClone(this.#runCtx.vars);\n\n\t\ttry {\n\t\t\treturn await run(stepCtx);\n\t\t} catch (error) {\n\t\t\tif (stateSnapshot) {\n\t\t\t\tthis.#runCtx.state = stateSnapshot.state;\n\t\t\t}\n\t\t\tthis.#runCtx.vars = varsSnapshot;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\t#toActorQueueMessage<T>(\n\t\tmessage: WorkflowQueueMessage<T>,\n\t): WorkflowQueueMessage<T> & { id: bigint } {\n\t\tlet id: bigint;\n\t\ttry {\n\t\t\tid = BigInt(message.id);\n\t\t} catch {\n\t\t\tthrow new Error(`Invalid queue message id \"${message.id}\"`);\n\t\t}\n\t\treturn {\n\t\t\tid,\n\t\t\tname: message.name,\n\t\t\tbody: message.body,\n\t\t\tcreatedAt: message.createdAt,\n\t\t\t...(message.complete ? { complete: message.complete } : {}),\n\t\t};\n\t}\n\n\t// Runs a step rollback compensation with an active step context. Rollbacks\n\t// intentionally mutate actor state, so their writes are not snapshotted.\n\tasync #runRollback<T>(\n\t\trollback: WorkflowStepRollback<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\toutput: T,\n\t): Promise<void> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\t\ttry {\n\t\t\tawait rollback(stepCtx, output);\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\tasync #wrapActive<T>(run: () => Promise<T>): Promise<T> {\n\t\treturn await this.#runCtx.internalKeepAwake(run);\n\t}\n\n\t// Records that a step context was used outside its step. Mirrors the value\n\t// onto actor state and a KV flag so callers can observe the violation.\n\t#markGuardTriggered(): void {\n\t\ttry {\n\t\t\tconst state = this.#runCtx.state as Record<string, unknown>;\n\t\t\tif (\n\t\t\t\tstate &&\n\t\t\t\ttypeof state === \"object\" &&\n\t\t\t\t\"guardTriggered\" in state\n\t\t\t) {\n\t\t\t\t(state as Record<string, unknown>).guardTriggered = true;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore if state is unavailable\n\t\t}\n\n\t\tthis.#runCtx.waitUntil(\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#runCtx.kv.put(WORKFLOW_GUARD_KV_KEY, \"true\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#runCtx.log.error({\n\t\t\t\t\t\tmsg: \"failed to persist workflow guard flag\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\t}\n\n\t#createChildContext(\n\t\tctx: WorkflowContextInterface,\n\t): WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> {\n\t\treturn new WorkflowContext(ctx, this.#runCtx);\n\t}\n}\n\nexport type WorkflowContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n\nexport type WorkflowLoopContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowBranchContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowStepContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowStepContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type {\n\tEngineDriver,\n\tKVEntry,\n\tKVWrite,\n\tMessage,\n\tWorkflowMessageDriver,\n} from \"@rivetkit/workflow-engine\";\nimport type { RunContext } from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { makeWorkflowKey, workflowStoragePrefix } from \"@/actor/keys\";\n\nconst WORKFLOW_STORAGE_PREFIX = workflowStoragePrefix();\n\n// Mirrors the element shape returned by `queueManager.receive`. The actor\n// instance is reached through a loose type here, so the call's result is\n// untyped and the message must be annotated explicitly.\ninterface ReceivedQueueMessage {\n\tid: bigint;\n\tname: string;\n\tbody: unknown;\n\tcreatedAt: number;\n\tcomplete?: (response?: unknown) => Promise<void>;\n}\n\n// `kvListPrefix` returns key/value tuples, but the loose actor type erases that\n// so the tuple destructures need an explicit annotation.\ntype KVEntryTuple = [Uint8Array, Uint8Array];\n\nfunction stripWorkflowKey(prefixed: Uint8Array): Uint8Array {\n\treturn prefixed.slice(WORKFLOW_STORAGE_PREFIX.length);\n}\n\nfunction computeUpperBound(prefix: Uint8Array): Uint8Array | null {\n\tconst upperBound = prefix.slice();\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i]++;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn null;\n}\n\nclass ActorWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.enqueue(message.name, message.data),\n\t\t);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst messages = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.receive(\n\t\t\t\topts.names && opts.names.length > 0\n\t\t\t\t\t? [...opts.names]\n\t\t\t\t\t: undefined,\n\t\t\t\topts.count,\n\t\t\t\t0,\n\t\t\t\tundefined,\n\t\t\t\topts.completable,\n\t\t\t),\n\t\t);\n\t\treturn messages.map((message: ReceivedQueueMessage) => ({\n\t\t\tid: message.id.toString(),\n\t\t\tname: message.name,\n\t\t\tdata: message.body,\n\t\t\tsentAt: message.createdAt,\n\t\t\t...(opts.completable\n\t\t\t\t? {\n\t\t\t\t\t\tcomplete: async (response?: unknown) => {\n\t\t\t\t\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\t\t\t\t\tthis.#actor.queueManager.completeMessage(\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}));\n\t}\n\n\tasync completeMessage(\n\t\tmessageId: string,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tlet parsedId: bigint;\n\t\ttry {\n\t\t\tparsedId = BigInt(messageId);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.completeMessageById(parsedId, response),\n\t\t);\n\t}\n}\n\nexport class ActorWorkflowDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver;\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t\tthis.messageDriver = new ActorWorkflowMessageDriver(actor, runCtx);\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchGet(this.#actor.id, [\n\t\t\t\tmakeWorkflowKey(key),\n\t\t\t]),\n\t\t);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[makeWorkflowKey(key), value],\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\t\tmakeWorkflowKey(key),\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvDeleteRange(this.#actor.id, start, end),\n\t\t\t);\n\t\t} else {\n\t\t\tconst entries = await this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvListPrefix(this.#actor.id, start),\n\t\t\t);\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\tthis.#actor.driver.kvBatchDelete(\n\t\t\t\t\tthis.#actor.id,\n\t\t\t\t\tentries.map(([key]: KVEntryTuple) => key),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvDeleteRange(\n\t\t\t\tthis.#actor.id,\n\t\t\t\tmakeWorkflowKey(start),\n\t\t\t\tmakeWorkflowKey(end),\n\t\t\t),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst entries = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.kvListPrefix(\n\t\t\t\tthis.#actor.id,\n\t\t\t\tmakeWorkflowKey(prefix),\n\t\t\t),\n\t\t);\n\t\treturn entries.map(([key, value]: KVEntryTuple) => ({\n\t\t\tkey: stripWorkflowKey(key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) return;\n\n\t\t// Flush actor state together with workflow state to ensure atomicity.\n\t\t// If the server crashes after workflow flush, actor state must also be persisted.\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tPromise.all([\n\t\t\t\tthis.#actor.driver.kvBatchPut(\n\t\t\t\t\tthis.#actor.id,\n\t\t\t\t\twrites.map(({ key, value }) => [\n\t\t\t\t\t\tmakeWorkflowKey(key),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t\tthis.#actor.stateManager.saveState({\n\t\t\t\t\timmediate: true,\n\t\t\t\t}),\n\t\t\t]),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.setAlarm(this.#actor, wakeAt),\n\t\t);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\t// No dedicated clear alarm support in actor drivers.\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\treturn this.#actor.queueManager.waitForNames(\n\t\t\tmessageNames.length > 0 ? messageNames : undefined,\n\t\t\tabortSignal,\n\t\t);\n\t}\n}\n\nclass NoopWorkflowMessageDriver implements WorkflowMessageDriver {\n\tasync addMessage(_message: Message): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync receiveMessages(_opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync completeMessage(\n\t\t_messageId: string,\n\t\t_response?: unknown,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n\nexport class ActorWorkflowControlDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver =\n\t\tnew NoopWorkflowMessageDriver();\n\t#actor: AnyStaticActorInstance;\n\n\tconstructor(actor: AnyStaticActorInstance) {\n\t\tthis.#actor = actor;\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#actor.driver.kvBatchGet(this.#actor.id, [\n\t\t\tmakeWorkflowKey(key),\n\t\t]);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvBatchPut(this.#actor.id, [\n\t\t\t[makeWorkflowKey(key), value],\n\t\t]);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\tmakeWorkflowKey(key),\n\t\t]);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#actor.driver.kvDeleteRange(this.#actor.id, start, end);\n\t\t\treturn;\n\t\t}\n\n\t\tconst entries = await this.#actor.driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tstart,\n\t\t);\n\t\tif (entries.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.#actor.driver.kvBatchDelete(\n\t\t\tthis.#actor.id,\n\t\t\tentries.map(([key]: KVEntryTuple) => key),\n\t\t);\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#actor.driver.kvDeleteRange(\n\t\t\tthis.#actor.id,\n\t\t\tmakeWorkflowKey(start),\n\t\t\tmakeWorkflowKey(end),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst entries = await this.#actor.driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tmakeWorkflowKey(prefix),\n\t\t);\n\t\treturn entries.map(([key, value]: KVEntryTuple) => ({\n\t\t\tkey: stripWorkflowKey(key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#actor.driver.kvBatchPut(\n\t\t\tthis.#actor.id,\n\t\t\twrites.map(({ key, value }) => [makeWorkflowKey(key), value]),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#actor.driver.setAlarm(this.#actor, wakeAt);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\t_messageNames: string[],\n\t\t_abortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/workflow/mod.ts","../../../src/workflow/constants.ts","../../../src/workflow/context.ts","../../../src/workflow/driver.ts"],"sourcesContent":["import {\n\tCriticalError,\n\tEntryInProgressError,\n\tHistoryDivergedError,\n\tJoinError,\n\tRaceError,\n\tRollbackCheckpointError,\n\tRollbackError,\n\ttype RunWorkflowOptions,\n\treplayWorkflowFromStep,\n\trunWorkflow,\n\tStepExhaustedError,\n\ttype WorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nimport invariant from \"invariant\";\nimport type { RunContext } from \"@/actor/config\";\nimport {\n\tACTOR_CONTEXT_INTERNAL_SYMBOL,\n\tRUN_FUNCTION_CONFIG_SYMBOL,\n} from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { isActorAbortedError, RivetError } from \"@/actor/errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"@/actor/schema\";\nimport type { AnyDatabaseProvider } from \"@/common/database/config\";\nimport { stringifyError } from \"@/utils\";\nimport { WorkflowContext } from \"./context\";\nimport { ActorWorkflowControlDriver, ActorWorkflowDriver } from \"./driver\";\nimport { createWorkflowInspectorAdapter } from \"./inspector\";\n\nexport type {\n\tTryBlockCatchKind,\n\tTryBlockConfig,\n\tTryBlockFailure,\n\tTryBlockResult,\n\tTryStepCatchKind,\n\tTryStepConfig,\n\tTryStepFailure,\n\tTryStepResult,\n\tWorkflowError,\n\tWorkflowErrorEvent,\n} from \"@rivetkit/workflow-engine\";\nexport { Loop } from \"@rivetkit/workflow-engine\";\nexport {\n\ttype WorkflowBranchConfig,\n\ttype WorkflowBranchContextOf,\n\tWorkflowContext,\n\ttype WorkflowContextOf,\n\ttype WorkflowLoopConfig,\n\ttype WorkflowLoopContextOf,\n\ttype WorkflowStepConfig,\n\tWorkflowStepContext,\n\ttype WorkflowStepContextOf,\n\ttype WorkflowTryConfig,\n\ttype WorkflowTryStepConfig,\n} from \"./context\";\n\nfunction shouldRethrowWorkflowError(error: unknown): boolean {\n\tif (\n\t\terror instanceof CriticalError ||\n\t\terror instanceof JoinError ||\n\t\terror instanceof RaceError ||\n\t\terror instanceof RollbackError ||\n\t\terror instanceof StepExhaustedError\n\t) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\terror instanceof EntryInProgressError ||\n\t\terror instanceof HistoryDivergedError ||\n\t\terror instanceof RollbackCheckpointError\n\t) {\n\t\treturn true;\n\t}\n\n\treturn true;\n}\n\nfunction workflowReplayInFlightError(): RivetError {\n\treturn new RivetError(\n\t\t\"actor\",\n\t\t\"workflow_in_flight\",\n\t\t\"Workflow replay is unavailable while the workflow is currently in flight.\",\n\t\t{\n\t\t\tpublic: true,\n\t\t\tstatusCode: 409,\n\t\t},\n\t);\n}\n\nfunction isWorkflowReplayBlockedByRunningEntry(error: unknown): boolean {\n\treturn (\n\t\terror instanceof Error &&\n\t\terror.message ===\n\t\t\t\"Cannot replay a workflow while a step is currently running\"\n\t);\n}\n\nexport interface WorkflowOptions<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\tonError?: (\n\t\tctx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tevent: WorkflowErrorEvent,\n\t) => void | Promise<void>;\n}\n\nexport function workflow<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n>(\n\tfn: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) => Promise<unknown>,\n\toptions: WorkflowOptions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> = {},\n): (\n\tc: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<void> {\n\tconst onError = options.onError;\n\tconst workflowInspectors = new Map<\n\t\tstring,\n\t\tReturnType<typeof createWorkflowInspectorAdapter>\n\t>();\n\n\tfunction getWorkflowInspector(actorId: string) {\n\t\tlet workflowInspector = workflowInspectors.get(actorId);\n\t\tif (!workflowInspector) {\n\t\t\tworkflowInspector = createWorkflowInspectorAdapter();\n\t\t\tworkflowInspectors.set(actorId, workflowInspector);\n\t\t}\n\t\treturn workflowInspector;\n\t}\n\n\tasync function run(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<void> {\n\t\tconst actor = (\n\t\t\trunCtx as unknown as {\n\t\t\t\t[ACTOR_CONTEXT_INTERNAL_SYMBOL]?: AnyStaticActorInstance;\n\t\t\t}\n\t\t)[ACTOR_CONTEXT_INTERNAL_SYMBOL];\n\t\tinvariant(actor, \"workflow() requires an actor instance\");\n\t\tconst workflowInspector = getWorkflowInspector(actor.id);\n\n\t\tconst driver = new ActorWorkflowDriver(actor, runCtx);\n\t\tconst controlDriver = new ActorWorkflowControlDriver(actor, runCtx);\n\t\tworkflowInspector.setReplayFromStep(async (entryId) => {\n\t\t\tconst workflowState = await workflowInspector.adapter.getState();\n\t\t\tif (\n\t\t\t\tactor.isRunHandlerActive() ||\n\t\t\t\tworkflowState === \"pending\" ||\n\t\t\t\tworkflowState === \"running\"\n\t\t\t) {\n\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t}\n\n\t\t\tlet snapshot: Awaited<ReturnType<typeof replayWorkflowFromStep>>;\n\t\t\ttry {\n\t\t\t\tsnapshot = await replayWorkflowFromStep(\n\t\t\t\t\tactor.id,\n\t\t\t\t\tcontrolDriver,\n\t\t\t\t\tentryId,\n\t\t\t\t\t{ scheduleAlarm: false },\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tif (isWorkflowReplayBlockedByRunningEntry(error)) {\n\t\t\t\t\tthrow workflowReplayInFlightError();\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tworkflowInspector.update(snapshot);\n\t\t\tawait actor.restartRunHandler();\n\t\t\treturn workflowInspector.adapter.getHistory();\n\t\t});\n\n\t\tconst handle = runWorkflow(\n\t\t\tactor.id,\n\t\t\tasync (ctx) => await fn(new WorkflowContext(ctx, runCtx)),\n\t\t\tundefined,\n\t\t\tdriver,\n\t\t\t{\n\t\t\t\tmode: \"live\",\n\t\t\t\t// The actor logger and the engine's pino logger are runtime\n\t\t\t\t// compatible but not structurally assignable.\n\t\t\t\tlogger: runCtx.log as RunWorkflowOptions[\"logger\"],\n\t\t\t\tonHistoryUpdated: workflowInspector.update,\n\t\t\t\tonError: onError\n\t\t\t\t\t? async (event) => await onError(runCtx, event)\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t);\n\t\tworkflowInspector.setGetState(async () => await handle.getState());\n\n\t\tconst onAbort = () => {\n\t\t\thandle.evict();\n\t\t};\n\t\tif (runCtx.abortSignal.aborted) {\n\t\t\tonAbort();\n\t\t} else {\n\t\t\trunCtx.abortSignal.addEventListener(\"abort\", onAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tawait handle.result;\n\t\t} catch (error) {\n\t\t\t// `abortSignal.aborted` is delivered on a separate async hop and\n\t\t\t// races the rejection, so detect the sleep abort structurally too.\n\t\t\tif (runCtx.abortSignal.aborted || isActorAbortedError(error)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (shouldRethrowWorkflowError(error)) {\n\t\t\t\trunCtx.log.error({\n\t\t\t\t\tmsg: \"workflow run failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\trunCtx.log.warn({\n\t\t\t\tmsg: \"workflow failed and will sleep until woken\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t} finally {\n\t\t\trunCtx.abortSignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t}\n\n\tconst runWithConfig = run as typeof run & {\n\t\t[RUN_FUNCTION_CONFIG_SYMBOL]?: {\n\t\t\ticon?: string;\n\t\t\tinspectorFactory?: (actor: unknown) => unknown;\n\t\t\tdisposeInspector?: (actorId: string) => void;\n\t\t};\n\t};\n\trunWithConfig[RUN_FUNCTION_CONFIG_SYMBOL] = {\n\t\ticon: \"diagram-project\",\n\t\t// Drop the per-actor inspector when the actor is destroyed so this map\n\t\t// does not retain one inspector (and its encoded history) per actor id\n\t\t// for the process lifetime.\n\t\tdisposeInspector: (actorId) => {\n\t\t\tworkflowInspectors.delete(actorId);\n\t\t},\n\t\tinspectorFactory: (actor) => {\n\t\t\tconst actorId = resolveWorkflowInspectorActorId(actor);\n\t\t\treturn {\n\t\t\t\tworkflow: actorId\n\t\t\t\t\t? getWorkflowInspector(actorId).adapter\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tgetHistory: () => null,\n\t\t\t\t\t\t\tonHistoryUpdated: () => () => {},\n\t\t\t\t\t\t\treplayFromStep: async () => null,\n\t\t\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n\n\treturn runWithConfig;\n}\n\nfunction resolveWorkflowInspectorActorId(actor: unknown): string | undefined {\n\tif (typeof actor === \"string\" && actor.length > 0) {\n\t\treturn actor;\n\t}\n\n\tif (!actor || typeof actor !== \"object\") {\n\t\treturn undefined;\n\t}\n\n\tconst candidate = actor as {\n\t\tid?: unknown;\n\t\tactorId?: unknown;\n\t};\n\tif (typeof candidate.id === \"string\" && candidate.id.length > 0) {\n\t\treturn candidate.id;\n\t}\n\tif (typeof candidate.actorId === \"string\" && candidate.actorId.length > 0) {\n\t\treturn candidate.actorId;\n\t}\n\n\treturn undefined;\n}\n","export const WORKFLOW_GUARD_KV_KEY = \"__rivet_actor_workflow_guard_triggered\";\n","import type {\n\tBranchConfig,\n\tBranchOutput,\n\tEntryKindType,\n\tLoopConfig,\n\tLoopResult,\n\tStepConfig,\n\tTryBlockConfig,\n\tTryBlockResult,\n\tTryStepConfig,\n\tTryStepResult,\n\tWorkflowContextInterface,\n\tWorkflowQueueMessage,\n} from \"@rivetkit/workflow-engine\";\nimport type {\n\tQueueFilterName,\n\tQueueNextBatchOptions,\n\tQueueNextOptions,\n\tQueueResultMessageForName,\n\tRunContext,\n} from \"@/actor/config\";\nimport type {\n\tAnyActorDefinition,\n\tBaseActorDefinition,\n} from \"@/actor/definition\";\nimport type {\n\tEventSchemaConfig,\n\tInferEventArgs,\n\tInferSchemaMap,\n\tQueueSchemaConfig,\n} from \"@/actor/schema\";\nimport type { Client } from \"@/client/client\";\nimport type {\n\tAnyDatabaseProvider,\n\tInferDatabaseClient,\n} from \"@/common/database/config\";\nimport type { Registry } from \"@/registry\";\nimport { WORKFLOW_GUARD_KV_KEY } from \"./constants\";\n\ntype WorkflowActorQueueNextOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextOptionsFallback<TCompletable extends boolean> = Omit<\n\tQueueNextOptions<string, TCompletable>,\n\t\"signal\"\n>;\n\ntype WorkflowActorQueueNextBatchOptions<\n\tTName extends string,\n\tTCompletable extends boolean,\n> = Omit<QueueNextBatchOptions<TName, TCompletable>, \"signal\">;\n\ntype WorkflowActorQueueNextBatchOptionsFallback<TCompletable extends boolean> =\n\tOmit<QueueNextBatchOptions<string, TCompletable>, \"signal\">;\n\n// Step run callbacks receive a WorkflowStepContext, which is the only place\n// actor data (state/db/vars/client) may be touched.\ntype WorkflowStepRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\n// Step rollback callbacks compensate a committed step, so they also run with a\n// WorkflowStepContext to mutate actor data.\ntype WorkflowStepRollback<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tstep: WorkflowStepContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n\toutput: T,\n) => Promise<void>;\n\n// Orchestration callbacks (try/loop/race/join) receive a WorkflowContext,\n// because inside them you sequence further steps rather than touch actor data.\ntype WorkflowContextRun<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = (\n\tctx: WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>,\n) => Promise<T>;\n\nexport type WorkflowStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<StepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryStepConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryStepConfig<T>, \"run\" | \"rollback\"> & {\n\trun: WorkflowStepRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\trollback?: WorkflowStepRollback<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowTryConfig<\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<TryBlockConfig<T>, \"run\"> & {\n\trun: WorkflowContextRun<\n\t\tT,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\nexport type WorkflowLoopConfig<\n\tS,\n\tT,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = Omit<LoopConfig<S, T>, \"run\"> & {\n\trun: (\n\t\tctx: WorkflowContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tstate: S,\n\t) => Promise<\n\t\tLoopResult<S, T> | (S extends undefined ? undefined | void : never)\n\t>;\n};\n\nexport type WorkflowBranchConfig<\n\tTOutput,\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig,\n\tTQueues extends QueueSchemaConfig,\n> = {\n\trun: WorkflowContextRun<\n\t\tTOutput,\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n};\n\n// Marks a step context inactive once its step has finished. Module-private so it\n// never appears on the public surface.\nconst DEACTIVATE_STEP = Symbol(\"workflow.step.deactivate\");\n\n/**\n * The context handed to a workflow step (`step` / `tryStep` callbacks). This is\n * the only scope where actor data (state, vars, db, client) and side effects\n * (broadcast, queue.send) are reachable. It is valid only while its step is\n * executing; using it after the step resolves throws.\n */\nexport class WorkflowStepContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\t#active = true;\n\t#onGuardViolation: () => void;\n\n\tconstructor(\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\tonGuardViolation: () => void,\n\t) {\n\t\tthis.#runCtx = runCtx;\n\t\tthis.#onGuardViolation = onGuardViolation;\n\t}\n\n\t[DEACTIVATE_STEP](): void {\n\t\tthis.#active = false;\n\t}\n\n\t#ensureActive(feature: string): void {\n\t\tif (!this.#active) {\n\t\t\tthis.#onGuardViolation();\n\t\t\tthrow new Error(\n\t\t\t\t`${feature} is only available inside workflow steps`,\n\t\t\t);\n\t\t}\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#runCtx.abortSignal;\n\t}\n\n\tget state(): TState extends never ? never : TState {\n\t\tthis.#ensureActive(\"state\");\n\t\treturn this.#runCtx.state as TState extends never ? never : TState;\n\t}\n\n\tget vars(): TVars extends never ? never : TVars {\n\t\tthis.#ensureActive(\"vars\");\n\t\treturn this.#runCtx.vars as TVars extends never ? never : TVars;\n\t}\n\n\tget db(): TDatabase extends never ? never : InferDatabaseClient<TDatabase> {\n\t\tthis.#ensureActive(\"db\");\n\t\treturn this.#runCtx.db as TDatabase extends never\n\t\t\t? never\n\t\t\t: InferDatabaseClient<TDatabase>;\n\t}\n\n\tclient<R extends Registry<any> = Registry<any>>(): Client<R> {\n\t\tthis.#ensureActive(\"client\");\n\t\treturn this.#runCtx.client<R>();\n\t}\n\n\tbroadcast<K extends keyof TEvents & string>(\n\t\tname: K,\n\t\t...args: InferEventArgs<InferSchemaMap<TEvents>[K]>\n\t): void;\n\tbroadcast(\n\t\tname: keyof TEvents extends never ? string : never,\n\t\t...args: Array<unknown>\n\t): void;\n\tbroadcast(name: string, ...args: Array<unknown>): void {\n\t\tthis.#ensureActive(\"broadcast\");\n\t\tthis.#runCtx.broadcast(\n\t\t\tname as never,\n\t\t\t...(args as unknown[] as never[]),\n\t\t);\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction send<K extends keyof TQueues & string>(\n\t\t\tname: K,\n\t\t\tbody: InferSchemaMap<TQueues>[K],\n\t\t): Promise<void>;\n\t\tfunction send(\n\t\t\tname: keyof TQueues extends never ? string : never,\n\t\t\tbody: unknown,\n\t\t): Promise<void>;\n\t\tasync function send(name: string, body: unknown): Promise<void> {\n\t\t\tself.#ensureActive(\"queue.send\");\n\t\t\tawait self.#runCtx.queue.send(name as never, body as never);\n\t\t}\n\t\treturn { send };\n\t}\n\n\t/**\n\t * Holds the actor awake for the duration of the provided promise. The actor\n\t * cannot idle-sleep or finalize the sleep grace period until the promise\n\t * settles.\n\t */\n\tkeepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tthis.#ensureActive(\"keepAwake\");\n\t\treturn this.#runCtx.keepAwake(promise);\n\t}\n\n\t/**\n\t * Registers a promise that the sleep grace period will wait on. Use this for\n\t * best-effort flush/cleanup work that may complete inside the grace window.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#ensureActive(\"waitUntil\");\n\t\tthis.#runCtx.waitUntil(promise);\n\t}\n\n\tdestroy(): void {\n\t\tthis.#ensureActive(\"destroy\");\n\t\tthis.#runCtx.destroy();\n\t}\n}\n\n/**\n * The context handed to the workflow function and to orchestration callbacks\n * (`try` / `loop` / `race` / `join`). It exposes the deterministic, replayable\n * workflow primitives (step, sleep, queue waits, control flow). It deliberately\n * does NOT expose actor data; reach `state`, `db`, `vars`, `client`, and\n * `broadcast` through the step context passed to `step` / `tryStep`.\n */\nexport class WorkflowContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTEvents extends EventSchemaConfig = Record<never, never>,\n\tTQueues extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#inner: WorkflowContextInterface;\n\t#runCtx: RunContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t>;\n\tconstructor(\n\t\tinner: WorkflowContextInterface,\n\t\trunCtx: RunContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t) {\n\t\tthis.#inner = inner;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tget workflowId(): string {\n\t\treturn this.#inner.workflowId;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#inner.abortSignal;\n\t}\n\n\tget actorId(): string {\n\t\treturn this.#runCtx.actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#runCtx.name;\n\t}\n\n\tget key(): string[] {\n\t\treturn this.#runCtx.key;\n\t}\n\n\tget log() {\n\t\treturn this.#runCtx.log;\n\t}\n\n\tget queue() {\n\t\tconst self = this;\n\t\tfunction next<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptions<TName, TCompletable>,\n\t\t): Promise<QueueResultMessageForName<TQueues, TName, TCompletable>>;\n\t\tfunction next<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tQueueResultMessageForName<\n\t\t\t\tTQueues,\n\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\tTCompletable\n\t\t\t>\n\t\t>;\n\t\t// The implementation signature stays broad so the schema-typed public\n\t\t// overloads above remain compatible with it.\n\t\tasync function next(name: string, opts?: any): Promise<any> {\n\t\t\tconst message = await self.#inner.queue.next(name, opts);\n\t\t\treturn self.#toActorQueueMessage(message);\n\t\t}\n\n\t\tfunction nextBatch<\n\t\t\tconst TName extends QueueFilterName<TQueues>,\n\t\t\tconst TCompletable extends boolean = false,\n\t\t>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptions<TName, TCompletable>,\n\t\t): Promise<\n\t\t\tArray<QueueResultMessageForName<TQueues, TName, TCompletable>>\n\t\t>;\n\t\tfunction nextBatch<const TCompletable extends boolean = false>(\n\t\t\tname: string,\n\t\t\topts?: WorkflowActorQueueNextBatchOptionsFallback<TCompletable>,\n\t\t): Promise<\n\t\t\tArray<\n\t\t\t\tQueueResultMessageForName<\n\t\t\t\t\tTQueues,\n\t\t\t\t\tQueueFilterName<TQueues>,\n\t\t\t\t\tTCompletable\n\t\t\t\t>\n\t\t\t>\n\t\t>;\n\t\tasync function nextBatch(name: string, opts?: any): Promise<any> {\n\t\t\tconst messages = await self.#inner.queue.nextBatch(name, opts);\n\t\t\treturn messages.map((message) =>\n\t\t\t\tself.#toActorQueueMessage(message),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tnext,\n\t\t\tnextBatch,\n\t\t};\n\t}\n\n\tstep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tstep<T>(\n\t\tconfig: WorkflowStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync step<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.step(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: StepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.step(config));\n\t}\n\n\ttryStep<T>(\n\t\tname: string,\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\ttryStep<T>(\n\t\tconfig: WorkflowTryStepConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>>;\n\tasync tryStep<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryStepConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryStepResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Step run function missing\");\n\t\t\t}\n\t\t\tconst stepRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.tryStep(nameOrConfig, () => this.#runStep(stepRun)),\n\t\t\t);\n\t\t}\n\t\tconst stepConfig = nameOrConfig;\n\t\tconst rollback = stepConfig.rollback;\n\t\tconst config: TryStepConfig<T> = {\n\t\t\t...stepConfig,\n\t\t\trun: () => this.#runStep(stepConfig.run),\n\t\t\trollback: rollback\n\t\t\t\t? (_ctx, output) => this.#runRollback(rollback, output)\n\t\t\t\t: undefined,\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.tryStep(config));\n\t}\n\n\ttry<T>(\n\t\tname: string,\n\t\trun: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\ttry<T>(\n\t\tconfig: WorkflowTryConfig<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>>;\n\tasync try<T>(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowTryConfig<\n\t\t\t\t\tT,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: WorkflowContextRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<TryBlockResult<T>> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Try run function missing\");\n\t\t\t}\n\t\t\tconst tryRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.try(nameOrConfig, async (ctx) =>\n\t\t\t\t\ttryRun(this.#createChildContext(ctx)),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst tryConfig = nameOrConfig;\n\t\tconst config: TryBlockConfig<T> = {\n\t\t\t...tryConfig,\n\t\t\trun: async (ctx) => tryConfig.run(this.#createChildContext(ctx)),\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.try(config));\n\t}\n\n\tloop<T>(\n\t\tname: string,\n\t\trun: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, T> | undefined | void>,\n\t): Promise<T>;\n\tloop<S, T>(\n\t\tconfig: WorkflowLoopConfig<\n\t\t\tS,\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T>;\n\tasync loop(\n\t\tnameOrConfig:\n\t\t\t| string\n\t\t\t| WorkflowLoopConfig<\n\t\t\t\t\tany,\n\t\t\t\t\tany,\n\t\t\t\t\tTState,\n\t\t\t\t\tTConnParams,\n\t\t\t\t\tTConnState,\n\t\t\t\t\tTVars,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTDatabase,\n\t\t\t\t\tTEvents,\n\t\t\t\t\tTQueues\n\t\t\t >,\n\t\trun?: (\n\t\t\tctx: WorkflowContext<\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>,\n\t\t) => Promise<LoopResult<undefined, any> | undefined | void>,\n\t): Promise<any> {\n\t\tif (typeof nameOrConfig === \"string\") {\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(\"Loop run function missing\");\n\t\t\t}\n\t\t\tconst loopRun = run;\n\t\t\treturn await this.#wrapActive(() =>\n\t\t\t\tthis.#inner.loop(\n\t\t\t\t\tnameOrConfig,\n\t\t\t\t\t// A void return (no explicit Loop result) is undefined at\n\t\t\t\t\t// runtime, which the engine treats as continue.\n\t\t\t\t\tasync (\n\t\t\t\t\t\tctx,\n\t\t\t\t\t): Promise<LoopResult<undefined, any> | undefined> =>\n\t\t\t\t\t\t(await loopRun(this.#createChildContext(ctx))) ??\n\t\t\t\t\t\tundefined,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tconst loopConfig = nameOrConfig;\n\t\tconst wrapped: LoopConfig<any, any> = {\n\t\t\t...loopConfig,\n\t\t\trun: (async (ctx, state) =>\n\t\t\t\t(await loopConfig.run(this.#createChildContext(ctx), state)) ??\n\t\t\t\tundefined) as LoopConfig<any, any>[\"run\"],\n\t\t};\n\t\treturn await this.#wrapActive(() => this.#inner.loop(wrapped));\n\t}\n\n\tsleep(name: string, durationMs: number): Promise<void> {\n\t\treturn this.#inner.sleep(name, durationMs);\n\t}\n\n\tsleepUntil(name: string, timestampMs: number): Promise<void> {\n\t\treturn this.#inner.sleepUntil(name, timestampMs);\n\t}\n\n\tasync rollbackCheckpoint(name: string): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.rollbackCheckpoint(name));\n\t}\n\n\tasync join<\n\t\tT extends Record<\n\t\t\tstring,\n\t\t\tWorkflowBranchConfig<\n\t\t\t\tunknown,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>\n\t\t>,\n\t>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K][\"run\"]>> }>;\n\tasync join<T extends Record<string, BranchConfig<unknown>>>(\n\t\tname: string,\n\t\tbranches: T,\n\t): Promise<{ [K in keyof T]: BranchOutput<T[K]> }>;\n\tasync join(\n\t\tname: string,\n\t\tbranches: Record<string, { run: (ctx: any) => Promise<unknown> }>,\n\t) {\n\t\tconst wrappedBranches = Object.fromEntries(\n\t\t\tObject.entries(branches).map(([key, branch]) => [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\trun: async (ctx: WorkflowContextInterface) =>\n\t\t\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t\t\t},\n\t\t\t]),\n\t\t) as Record<string, BranchConfig<unknown>>;\n\t\treturn await this.#wrapActive(() =>\n\t\t\tthis.#inner.join(name, wrappedBranches),\n\t\t);\n\t}\n\n\tasync race<T>(\n\t\tname: string,\n\t\tbranches: Array<{\n\t\t\tname: string;\n\t\t\trun: WorkflowContextRun<\n\t\t\t\tT,\n\t\t\t\tTState,\n\t\t\t\tTConnParams,\n\t\t\t\tTConnState,\n\t\t\t\tTVars,\n\t\t\t\tTInput,\n\t\t\t\tTDatabase,\n\t\t\t\tTEvents,\n\t\t\t\tTQueues\n\t\t\t>;\n\t\t}>,\n\t): Promise<{ winner: string; value: T }> {\n\t\tconst wrappedBranches = branches.map((branch) => ({\n\t\t\tname: branch.name,\n\t\t\trun: (ctx: WorkflowContextInterface) =>\n\t\t\t\tbranch.run(this.#createChildContext(ctx)),\n\t\t}));\n\t\treturn (await this.#wrapActive(() =>\n\t\t\tthis.#inner.race(name, wrappedBranches),\n\t\t)) as { winner: string; value: T };\n\t}\n\n\tasync removed(name: string, originalType: EntryKindType): Promise<void> {\n\t\tawait this.#wrapActive(() => this.#inner.removed(name, originalType));\n\t}\n\n\tgetVersion(name: string, latest: number): Promise<number> {\n\t\treturn this.#wrapActive(() => this.#inner.getVersion(name, latest));\n\t}\n\n\tisEvicted(): boolean {\n\t\treturn this.#inner.isEvicted();\n\t}\n\n\t// Runs a user step body inside a fresh step context and deactivates the step\n\t// context once the body settles. Workflows are roll-forward only, so state and\n\t// vars mutations made before a failure always remain visible.\n\tasync #runStep<T>(\n\t\trun: WorkflowStepRun<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t): Promise<T> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\n\t\ttry {\n\t\t\treturn await run(stepCtx);\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\t#toActorQueueMessage<T>(\n\t\tmessage: WorkflowQueueMessage<T>,\n\t): WorkflowQueueMessage<T> & { id: bigint } {\n\t\tlet id: bigint;\n\t\ttry {\n\t\t\tid = BigInt(message.id);\n\t\t} catch {\n\t\t\tthrow new Error(`Invalid queue message id \"${message.id}\"`);\n\t\t}\n\t\treturn {\n\t\t\tid,\n\t\t\tname: message.name,\n\t\t\tbody: message.body,\n\t\t\tcreatedAt: message.createdAt,\n\t\t\t...(message.complete ? { complete: message.complete } : {}),\n\t\t};\n\t}\n\n\t// Runs a step rollback compensation with an active step context.\n\tasync #runRollback<T>(\n\t\trollback: WorkflowStepRollback<\n\t\t\tT,\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>,\n\t\toutput: T,\n\t): Promise<void> {\n\t\tconst stepCtx = new WorkflowStepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase,\n\t\t\tTEvents,\n\t\t\tTQueues\n\t\t>(this.#runCtx, () => this.#markGuardTriggered());\n\t\ttry {\n\t\t\tawait rollback(stepCtx, output);\n\t\t} finally {\n\t\t\tstepCtx[DEACTIVATE_STEP]();\n\t\t}\n\t}\n\n\tasync #wrapActive<T>(run: () => Promise<T>): Promise<T> {\n\t\treturn await this.#runCtx.internalKeepAwake(run);\n\t}\n\n\t// Records that a step context was used outside its step. Mirrors the value\n\t// onto actor state and a KV flag so callers can observe the violation.\n\t#markGuardTriggered(): void {\n\t\ttry {\n\t\t\tconst state = this.#runCtx.state as Record<string, unknown>;\n\t\t\tif (\n\t\t\t\tstate &&\n\t\t\t\ttypeof state === \"object\" &&\n\t\t\t\t\"guardTriggered\" in state\n\t\t\t) {\n\t\t\t\t(state as Record<string, unknown>).guardTriggered = true;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore if state is unavailable\n\t\t}\n\n\t\tthis.#runCtx.waitUntil(\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#runCtx.kv.put(WORKFLOW_GUARD_KV_KEY, \"true\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#runCtx.log.error({\n\t\t\t\t\t\tmsg: \"failed to persist workflow guard flag\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\t}\n\n\t#createChildContext(\n\t\tctx: WorkflowContextInterface,\n\t): WorkflowContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTEvents,\n\t\tTQueues\n\t> {\n\t\treturn new WorkflowContext(ctx, this.#runCtx);\n\t}\n}\n\nexport type WorkflowContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n\nexport type WorkflowLoopContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowBranchContextOf<AD extends AnyActorDefinition> =\n\tWorkflowContextOf<AD>;\n\nexport type WorkflowStepContextOf<AD extends AnyActorDefinition> =\n\tAD extends BaseActorDefinition<\n\t\tinfer S,\n\t\tinfer CP,\n\t\tinfer CS,\n\t\tinfer V,\n\t\tinfer I,\n\t\tinfer DB extends AnyDatabaseProvider,\n\t\tinfer E extends EventSchemaConfig,\n\t\tinfer Q extends QueueSchemaConfig,\n\t\tany\n\t>\n\t\t? WorkflowStepContext<S, CP, CS, V, I, DB, E, Q>\n\t\t: never;\n","import type {\n\tEngineDriver,\n\tKVEntry,\n\tKVWrite,\n\tMessage,\n\tWorkflowMessageDriver,\n} from \"@rivetkit/workflow-engine\";\nimport type { RunContext } from \"@/actor/config\";\nimport type { AnyStaticActorInstance } from \"@/actor/definition\";\nimport { makeWorkflowKey, workflowStoragePrefix } from \"@/actor/keys\";\nimport type { SqliteDatabase } from \"@/common/database/config\";\n\nconst WORKFLOW_STORAGE_PREFIX = workflowStoragePrefix();\n// Keep workflow flushes below depot's 320-dirty-page commit ceiling. The\n// former actor-KV transport allowed 976 KiB batches; SQLite also dirties table\n// and index pages, so it needs the same conservative budget as core imports.\nconst WORKFLOW_SQLITE_MAX_BATCH_ROWS = 128;\nconst WORKFLOW_SQLITE_MAX_BATCH_BYTES = 512 * 1024;\n\n// Mirrors the element shape returned by `queueManager.receive`. The actor\n// instance is reached through a loose type here, so the call's result is\n// untyped and the message must be annotated explicitly.\ninterface ReceivedQueueMessage {\n\tid: bigint;\n\tname: string;\n\tbody: unknown;\n\tcreatedAt: number;\n\tcomplete?: (response?: unknown) => Promise<void>;\n}\n\ntype KVEntryTuple = [Uint8Array, Uint8Array];\n\nfunction stripWorkflowKey(prefixed: Uint8Array): Uint8Array {\n\treturn prefixed.slice(WORKFLOW_STORAGE_PREFIX.length);\n}\n\nfunction computeUpperBound(prefix: Uint8Array): Uint8Array | null {\n\tconst upperBound = prefix.slice();\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i]++;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction normalizeSqlBlob(value: unknown): Uint8Array {\n\tif (value instanceof Uint8Array) {\n\t\treturn value;\n\t}\n\tif (value instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(value);\n\t}\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n\t}\n\tif (Array.isArray(value)) {\n\t\tconst bytes = new Uint8Array(value.length);\n\t\tfor (const [i, item] of value.entries()) {\n\t\t\tif (!Number.isInteger(item) || item < 0 || item > 255) {\n\t\t\t\tthrow new Error(\"workflow sqlite value was not a byte array\");\n\t\t\t}\n\t\t\tbytes[i] = item;\n\t\t}\n\t\treturn bytes;\n\t}\n\tthrow new Error(\"workflow sqlite value was not a blob\");\n}\n\nfunction runtimeSqlFromContext(\n\trunCtx?: RunContext<any, any, any, any, any, any, any, any>,\n): SqliteDatabase | undefined {\n\tconst sql = (runCtx as unknown as { sql?: unknown } | undefined)?.sql;\n\tif (\n\t\tsql &&\n\t\ttypeof sql === \"object\" &&\n\t\t\"query\" in sql &&\n\t\t\"execute\" in sql &&\n\t\t\"executeBatch\" in sql &&\n\t\t\"run\" in sql\n\t) {\n\t\treturn sql as SqliteDatabase;\n\t}\n\treturn undefined;\n}\n\ntype WorkflowSqliteDatabase = SqliteDatabase &\n\tRequired<Pick<SqliteDatabase, \"executeBatch\">>;\n\nclass WorkflowStorage {\n\t#sql: WorkflowSqliteDatabase;\n\n\tconstructor(sql?: SqliteDatabase) {\n\t\tif (!sql) {\n\t\t\tthrow new Error(\n\t\t\t\t\"workflow storage requires embedded SQLite; actor KV workflow storage is no longer supported\",\n\t\t\t);\n\t\t}\n\t\tif (!sql.executeBatch) {\n\t\t\tthrow new Error(\n\t\t\t\t\"workflow storage requires a SQLite database with executeBatch support\",\n\t\t\t);\n\t\t}\n\t\tthis.#sql = sql as WorkflowSqliteDatabase;\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst prefixed = makeWorkflowKey(key);\n\t\tconst result = await this.#sql.query(\n\t\t\t\"SELECT value FROM _rivet_wf_kv WHERE key = ?\",\n\t\t\t[prefixed],\n\t\t);\n\t\treturn result.rows[0]?.[0] == null\n\t\t\t? null\n\t\t\t: normalizeSqlBlob(result.rows[0][0]);\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.batch([{ key, value }]);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tconst prefixed = makeWorkflowKey(key);\n\t\tawait this.#sql.run(\"DELETE FROM _rivet_wf_kv WHERE key = ?\", [\n\t\t\tprefixed,\n\t\t]);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst start = makeWorkflowKey(prefix);\n\t\tconst end = computeUpperBound(start);\n\t\tif (end) {\n\t\t\tawait this.#sql.run(\n\t\t\t\t\"DELETE FROM _rivet_wf_kv WHERE key >= ? AND key < ?\",\n\t\t\t\t[start, end],\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst entries = await this.listRaw(start);\n\t\tawait this.deleteRawKeys(\n\t\t\tentries\n\t\t\t\t.filter(([key]) => keyStartsWith(key, start))\n\t\t\t\t.map(([key]) => key),\n\t\t);\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tconst prefixedStart = makeWorkflowKey(start);\n\t\tconst prefixedEnd = makeWorkflowKey(end);\n\t\tawait this.#sql.run(\n\t\t\t\"DELETE FROM _rivet_wf_kv WHERE key >= ? AND key < ?\",\n\t\t\t[prefixedStart, prefixedEnd],\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\tconst prefixed = makeWorkflowKey(prefix);\n\t\tconst entries = await this.listRaw(prefixed);\n\t\treturn entries\n\t\t\t.filter(([key]) => keyStartsWith(key, prefixed))\n\t\t\t.map(([key, value]: KVEntryTuple) => ({\n\t\t\t\tkey: stripWorkflowKey(key),\n\t\t\t\tvalue,\n\t\t\t}));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) return;\n\t\tfor (const chunk of chunkWorkflowWrites(writes)) {\n\t\t\tawait this.#sql.executeBatch(\n\t\t\t\tchunk.map(({ key, value }) => ({\n\t\t\t\t\tsql: \"INSERT INTO _rivet_wf_kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value\",\n\t\t\t\t\tparams: [makeWorkflowKey(key), value],\n\t\t\t\t})),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync listRaw(prefix: Uint8Array): Promise<KVEntryTuple[]> {\n\t\tconst end = computeUpperBound(prefix);\n\t\tconst result = end\n\t\t\t? await this.#sql.query(\n\t\t\t\t\t\"SELECT key, value FROM _rivet_wf_kv WHERE key >= ? AND key < ? ORDER BY key ASC\",\n\t\t\t\t\t[prefix, end],\n\t\t\t\t)\n\t\t\t: await this.#sql.query(\n\t\t\t\t\t\"SELECT key, value FROM _rivet_wf_kv WHERE key >= ? ORDER BY key ASC\",\n\t\t\t\t\t[prefix],\n\t\t\t\t);\n\t\treturn result.rows.map((row) => [\n\t\t\tnormalizeSqlBlob(row[0]),\n\t\t\tnormalizeSqlBlob(row[1]),\n\t\t]);\n\t}\n\n\tasync deleteRawKeys(keys: Uint8Array[]): Promise<void> {\n\t\tfor (\n\t\t\tlet start = 0;\n\t\t\tstart < keys.length;\n\t\t\tstart += WORKFLOW_SQLITE_MAX_BATCH_ROWS\n\t\t) {\n\t\t\tawait this.#sql.executeBatch(\n\t\t\t\tkeys\n\t\t\t\t\t.slice(start, start + WORKFLOW_SQLITE_MAX_BATCH_ROWS)\n\t\t\t\t\t.map((key) => ({\n\t\t\t\t\t\tsql: \"DELETE FROM _rivet_wf_kv WHERE key = ?\",\n\t\t\t\t\t\tparams: [key],\n\t\t\t\t\t})),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function chunkWorkflowWrites(writes: KVWrite[]): KVWrite[][] {\n\tconst chunks: KVWrite[][] = [];\n\tlet chunk: KVWrite[] = [];\n\tlet chunkBytes = 0;\n\tfor (const write of writes) {\n\t\tconst writeBytes =\n\t\t\tWORKFLOW_STORAGE_PREFIX.length +\n\t\t\twrite.key.length +\n\t\t\twrite.value.length;\n\t\tif (\n\t\t\tchunk.length > 0 &&\n\t\t\t(chunk.length >= WORKFLOW_SQLITE_MAX_BATCH_ROWS ||\n\t\t\t\tchunkBytes + writeBytes > WORKFLOW_SQLITE_MAX_BATCH_BYTES)\n\t\t) {\n\t\t\tchunks.push(chunk);\n\t\t\tchunk = [];\n\t\t\tchunkBytes = 0;\n\t\t}\n\t\tchunk.push(write);\n\t\tchunkBytes += writeBytes;\n\t}\n\tif (chunk.length > 0) chunks.push(chunk);\n\treturn chunks;\n}\n\nfunction keyStartsWith(key: Uint8Array, prefix: Uint8Array): boolean {\n\tif (key.length < prefix.length) return false;\n\tfor (let i = 0; i < prefix.length; i++) {\n\t\tif (key[i] !== prefix[i]) return false;\n\t}\n\treturn true;\n}\n\nclass ActorWorkflowMessageDriver implements WorkflowMessageDriver {\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t}\n\n\tasync addMessage(message: Message): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.enqueue(message.name, message.data),\n\t\t);\n\t}\n\n\tasync receiveMessages(opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tconst messages = await this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.receive(\n\t\t\t\topts.names && opts.names.length > 0\n\t\t\t\t\t? [...opts.names]\n\t\t\t\t\t: undefined,\n\t\t\t\topts.count,\n\t\t\t\t0,\n\t\t\t\tundefined,\n\t\t\t\topts.completable,\n\t\t\t),\n\t\t);\n\t\treturn messages.map((message: ReceivedQueueMessage) => ({\n\t\t\tid: message.id.toString(),\n\t\t\tname: message.name,\n\t\t\tdata: message.body,\n\t\t\tsentAt: message.createdAt,\n\t\t\t...(opts.completable\n\t\t\t\t? {\n\t\t\t\t\t\tcomplete: async (response?: unknown) => {\n\t\t\t\t\t\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\t\t\t\t\t\tthis.#actor.queueManager.completeMessage(\n\t\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}));\n\t}\n\n\tasync completeMessage(\n\t\tmessageId: string,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tlet parsedId: bigint;\n\t\ttry {\n\t\t\tparsedId = BigInt(messageId);\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.queueManager.completeMessageById(parsedId, response),\n\t\t);\n\t}\n}\n\nexport class ActorWorkflowDriver implements EngineDriver {\n\treadonly atomicBatch = true;\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver;\n\t#actor: AnyStaticActorInstance;\n\t#runCtx: RunContext<any, any, any, any, any, any, any, any>;\n\t#storage: WorkflowStorage;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#runCtx = runCtx;\n\t\tthis.messageDriver = new ActorWorkflowMessageDriver(actor, runCtx);\n\t\tthis.#storage = new WorkflowStorage(runtimeSqlFromContext(runCtx));\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\treturn await this.#runCtx.internalKeepAwake(this.#storage.get(key));\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(this.#storage.set(key, value));\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(this.#storage.delete(key));\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#storage.deletePrefix(prefix),\n\t\t);\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#storage.deleteRange(start, end),\n\t\t);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\treturn await this.#runCtx.internalKeepAwake(this.#storage.list(prefix));\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) return;\n\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.stateManager.saveStateAndWorkflowBatch(writes),\n\t\t);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#runCtx.internalKeepAwake(\n\t\t\tthis.#actor.driver.setAlarm(this.#actor, wakeAt),\n\t\t);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\t// No dedicated clear alarm support in actor drivers.\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\tmessageNames: string[],\n\t\tabortSignal: AbortSignal,\n\t): Promise<void> {\n\t\treturn this.#actor.queueManager.waitForNames(\n\t\t\tmessageNames.length > 0 ? messageNames : undefined,\n\t\t\tabortSignal,\n\t\t);\n\t}\n}\n\nclass NoopWorkflowMessageDriver implements WorkflowMessageDriver {\n\tasync addMessage(_message: Message): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync receiveMessages(_opts: {\n\t\tnames?: readonly string[];\n\t\tcount: number;\n\t\tcompletable: boolean;\n\t}): Promise<Message[]> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n\n\tasync completeMessage(\n\t\t_messageId: string,\n\t\t_response?: unknown,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n\nexport class ActorWorkflowControlDriver implements EngineDriver {\n\treadonly workerPollInterval = 100;\n\treadonly messageDriver: WorkflowMessageDriver =\n\t\tnew NoopWorkflowMessageDriver();\n\t#actor: AnyStaticActorInstance;\n\t#storage: WorkflowStorage;\n\n\tconstructor(\n\t\tactor: AnyStaticActorInstance,\n\t\trunCtx?: RunContext<any, any, any, any, any, any, any, any>,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#storage = new WorkflowStorage(runtimeSqlFromContext(runCtx));\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\treturn await this.#storage.get(key);\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#storage.set(key, value);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#storage.delete(key);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tawait this.#storage.deletePrefix(prefix);\n\t}\n\n\tasync deleteRange(start: Uint8Array, end: Uint8Array): Promise<void> {\n\t\tawait this.#storage.deleteRange(start, end);\n\t}\n\n\tasync list(prefix: Uint8Array): Promise<KVEntry[]> {\n\t\treturn await this.#storage.list(prefix);\n\t}\n\n\tasync batch(writes: KVWrite[]): Promise<void> {\n\t\tif (writes.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#storage.batch(writes);\n\t}\n\n\tasync setAlarm(_workflowId: string, wakeAt: number): Promise<void> {\n\t\tawait this.#actor.driver.setAlarm(this.#actor, wakeAt);\n\t}\n\n\tasync clearAlarm(_workflowId: string): Promise<void> {\n\t\treturn;\n\t}\n\n\twaitForMessages(\n\t\t_messageNames: string[],\n\t\t_abortSignal: AbortSignal,\n\t): Promise<void> {\n\t\tthrow new Error(\"Workflow control driver does not support messages\");\n\t}\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rivetkit",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.5-rc.1",
|
|
4
4
|
"description": "Lightweight libraries for building stateful actors on edge platforms",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"keywords": [
|
|
@@ -191,14 +191,14 @@
|
|
|
191
191
|
"@hono/zod-openapi": "^1.1.5",
|
|
192
192
|
"@rivet-dev/agent-os-core": "^0.1.1",
|
|
193
193
|
"@rivetkit/bare-ts": "^0.6.2",
|
|
194
|
-
"@rivetkit/engine-cli": "2.3.
|
|
195
|
-
"@rivetkit/engine-envoy-protocol": "2.3.
|
|
194
|
+
"@rivetkit/engine-cli": "2.3.5-rc.1",
|
|
195
|
+
"@rivetkit/engine-envoy-protocol": "2.3.5-rc.1",
|
|
196
196
|
"@rivetkit/on-change": "6.0.1",
|
|
197
|
-
"@rivetkit/rivetkit-napi": "2.3.
|
|
198
|
-
"@rivetkit/rivetkit-wasm": "2.3.
|
|
199
|
-
"@rivetkit/traces": "2.3.
|
|
200
|
-
"@rivetkit/virtual-websocket": "2.3.
|
|
201
|
-
"@rivetkit/workflow-engine": "2.3.
|
|
197
|
+
"@rivetkit/rivetkit-napi": "2.3.5-rc.1",
|
|
198
|
+
"@rivetkit/rivetkit-wasm": "2.3.5-rc.1",
|
|
199
|
+
"@rivetkit/traces": "2.3.5-rc.1",
|
|
200
|
+
"@rivetkit/virtual-websocket": "2.3.5-rc.1",
|
|
201
|
+
"@rivetkit/workflow-engine": "2.3.5-rc.1",
|
|
202
202
|
"cbor-x": "^1.6.0",
|
|
203
203
|
"drizzle-orm": "^0.44.2",
|
|
204
204
|
"hono": "^4.7.0",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { ActorOptionsSchema } from "./config";
|
|
3
|
+
|
|
4
|
+
describe("ActorOptionsSchema", () => {
|
|
5
|
+
test("keeps the Actor Runtime Socket opt-in", () => {
|
|
6
|
+
expect(ActorOptionsSchema.parse({}).enableActorRuntimeSocket).toBe(
|
|
7
|
+
false,
|
|
8
|
+
);
|
|
9
|
+
expect(
|
|
10
|
+
ActorOptionsSchema.parse({ enableActorRuntimeSocket: true })
|
|
11
|
+
.enableActorRuntimeSocket,
|
|
12
|
+
).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
});
|
package/src/actor/config.ts
CHANGED
|
@@ -107,11 +107,89 @@ export interface ActorKv {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
export interface ActorSchedule {
|
|
110
|
-
after(
|
|
111
|
-
|
|
110
|
+
after(
|
|
111
|
+
duration: number,
|
|
112
|
+
action: string,
|
|
113
|
+
...args: unknown[]
|
|
114
|
+
): Promise<string>;
|
|
115
|
+
at(timestamp: number, action: string, ...args: unknown[]): Promise<string>;
|
|
116
|
+
cancel(id: string): Promise<boolean>;
|
|
117
|
+
get(id: string): Promise<ScheduledEventInfo | undefined>;
|
|
118
|
+
list(): Promise<ScheduledEventInfo[]>;
|
|
112
119
|
[key: string]: any;
|
|
113
120
|
}
|
|
114
121
|
|
|
122
|
+
export interface ActorCronSetOptions {
|
|
123
|
+
name: string;
|
|
124
|
+
expression: string;
|
|
125
|
+
action: string;
|
|
126
|
+
args?: unknown[];
|
|
127
|
+
timezone?: string;
|
|
128
|
+
/** Defaults to 100. Set to 0 to disable and clear history. Maximum 1,000. */
|
|
129
|
+
maxHistory?: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface ActorCronEveryOptions {
|
|
133
|
+
name: string;
|
|
134
|
+
/** Fixed interval in milliseconds. Minimum 5,000. */
|
|
135
|
+
interval: number;
|
|
136
|
+
action: string;
|
|
137
|
+
args?: unknown[];
|
|
138
|
+
/** Defaults to 100. Set to 0 to disable and clear history. Maximum 1,000. */
|
|
139
|
+
maxHistory?: number;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface ActorCron {
|
|
143
|
+
set(options: ActorCronSetOptions): Promise<void>;
|
|
144
|
+
every(options: ActorCronEveryOptions): Promise<void>;
|
|
145
|
+
get(name: string): Promise<CronJobInfo | undefined>;
|
|
146
|
+
list(): Promise<CronJobInfo[]>;
|
|
147
|
+
delete(name: string): Promise<boolean>;
|
|
148
|
+
history(name: string, options?: { limit?: number }): Promise<CronFire[]>;
|
|
149
|
+
[key: string]: any;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface ScheduledEventInfo {
|
|
153
|
+
id: string;
|
|
154
|
+
action: string;
|
|
155
|
+
args: unknown[];
|
|
156
|
+
runAt: number;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export type CronJobInfo = {
|
|
160
|
+
name: string;
|
|
161
|
+
action: string;
|
|
162
|
+
args: unknown[];
|
|
163
|
+
nextRunAt: number;
|
|
164
|
+
lastRunAt?: number;
|
|
165
|
+
maxHistory: number;
|
|
166
|
+
} & (
|
|
167
|
+
| { kind: "cron"; expression: string; timezone: string }
|
|
168
|
+
| { kind: "every"; interval: number }
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
export interface ScheduledFireInfo {
|
|
172
|
+
kind: "at" | "cron" | "every";
|
|
173
|
+
id: string;
|
|
174
|
+
name?: string;
|
|
175
|
+
scheduledAt: number;
|
|
176
|
+
firedAt: number;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export interface CronFire {
|
|
180
|
+
action: string;
|
|
181
|
+
scheduledAt: number;
|
|
182
|
+
firedAt: number;
|
|
183
|
+
finishedAt?: number;
|
|
184
|
+
result: "running" | "ok" | "error" | "skipped";
|
|
185
|
+
error?: {
|
|
186
|
+
group: string;
|
|
187
|
+
code: string;
|
|
188
|
+
message: string;
|
|
189
|
+
metadata?: unknown;
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
115
193
|
export type QueueMessageOf<Name extends string, Body> = {
|
|
116
194
|
id: number | bigint;
|
|
117
195
|
name: Name;
|
|
@@ -316,11 +394,14 @@ export interface ActorContext<
|
|
|
316
394
|
readonly kv: ActorKv;
|
|
317
395
|
readonly db: InferDatabaseClient<TDatabase>;
|
|
318
396
|
readonly schedule: ActorSchedule;
|
|
397
|
+
readonly cron: ActorCron;
|
|
319
398
|
readonly queue: ActorQueue<TQueues>;
|
|
320
399
|
readonly actorId: string;
|
|
321
400
|
readonly name: string;
|
|
322
401
|
readonly key: string[];
|
|
323
402
|
readonly region: string;
|
|
403
|
+
/** Provisions the experimental Actor Runtime Socket for this actor generation. */
|
|
404
|
+
actorRuntimeSocket(): Promise<{ path: string }>;
|
|
324
405
|
readonly conns: Map<
|
|
325
406
|
string,
|
|
326
407
|
Conn<
|
|
@@ -753,6 +834,7 @@ export const BUILTIN_INSPECTOR_TAB_IDS = [
|
|
|
753
834
|
"database",
|
|
754
835
|
"state",
|
|
755
836
|
"queue",
|
|
837
|
+
"schedules",
|
|
756
838
|
"connections",
|
|
757
839
|
"console",
|
|
758
840
|
] as const;
|
|
@@ -956,6 +1038,8 @@ const GlobalActorOptionsBaseSchema = z
|
|
|
956
1038
|
name: z.string().optional(),
|
|
957
1039
|
/** Icon for the actor in the Inspector UI. Can be an emoji or FontAwesome icon name. */
|
|
958
1040
|
icon: z.string().optional(),
|
|
1041
|
+
/** Enables the experimental Actor Runtime Socket for this actor. */
|
|
1042
|
+
enableActorRuntimeSocket: z.boolean().default(false),
|
|
959
1043
|
/**
|
|
960
1044
|
* Can hibernate WebSockets for onWebSocket.
|
|
961
1045
|
*
|
|
@@ -999,13 +1083,15 @@ const InstanceActorOptionsBaseSchema = z
|
|
|
999
1083
|
noSleep: z.boolean().default(false),
|
|
1000
1084
|
sleepTimeout: z.number().positive().default(30_000),
|
|
1001
1085
|
maxQueueSize: z.number().positive().default(1000),
|
|
1086
|
+
/** Maximum pending one-shot and recurring schedules. */
|
|
1087
|
+
maxSchedules: z.number().int().nonnegative().default(1000),
|
|
1002
1088
|
maxQueueMessageSize: z
|
|
1003
1089
|
.number()
|
|
1004
1090
|
.positive()
|
|
1005
1091
|
.default(64 * 1024),
|
|
1006
|
-
/**
|
|
1092
|
+
/** @deprecated Internal storage moved to SQLite and no longer uses KV preloading, so this option is ignored. Will be removed in 2.2.0. */
|
|
1007
1093
|
preloadMaxWorkflowBytes: z.number().nonnegative().optional(),
|
|
1008
|
-
/**
|
|
1094
|
+
/** @deprecated Internal storage moved to SQLite and no longer uses KV preloading, so this option is ignored. Will be removed in 2.2.0. */
|
|
1009
1095
|
preloadMaxConnectionsBytes: z.number().nonnegative().optional(),
|
|
1010
1096
|
})
|
|
1011
1097
|
.strict();
|
|
@@ -1867,6 +1953,12 @@ export const DocActorOptionsSchema = z
|
|
|
1867
1953
|
.describe(
|
|
1868
1954
|
"Icon for the actor in the Inspector UI. Can be an emoji (e.g., '🚀') or FontAwesome icon name (e.g., 'rocket').",
|
|
1869
1955
|
),
|
|
1956
|
+
enableActorRuntimeSocket: z
|
|
1957
|
+
.boolean()
|
|
1958
|
+
.optional()
|
|
1959
|
+
.describe(
|
|
1960
|
+
"Enables the experimental Actor Runtime Socket for this actor. Default: false",
|
|
1961
|
+
),
|
|
1870
1962
|
createVarsTimeout: z
|
|
1871
1963
|
.number()
|
|
1872
1964
|
.optional()
|
|
@@ -1949,6 +2041,14 @@ export const DocActorOptionsSchema = z
|
|
|
1949
2041
|
.describe(
|
|
1950
2042
|
"Maximum number of queue messages before rejecting new messages. Default: 1000",
|
|
1951
2043
|
),
|
|
2044
|
+
maxSchedules: z
|
|
2045
|
+
.number()
|
|
2046
|
+
.int()
|
|
2047
|
+
.nonnegative()
|
|
2048
|
+
.optional()
|
|
2049
|
+
.describe(
|
|
2050
|
+
"Maximum pending one-shot and recurring schedules before rejecting new schedules. Default: 1000",
|
|
2051
|
+
),
|
|
1952
2052
|
maxQueueMessageSize: z
|
|
1953
2053
|
.number()
|
|
1954
2054
|
.optional()
|
|
@@ -1961,18 +2061,6 @@ export const DocActorOptionsSchema = z
|
|
|
1961
2061
|
.describe(
|
|
1962
2062
|
"Whether WebSockets using onWebSocket can be hibernated. WebSockets using actions/events are hibernatable by default. Default: false",
|
|
1963
2063
|
),
|
|
1964
|
-
preloadMaxWorkflowBytes: z
|
|
1965
|
-
.number()
|
|
1966
|
-
.optional()
|
|
1967
|
-
.describe(
|
|
1968
|
-
"Override RivetKit's workflow preload budget for this actor. Set to 0 to disable workflow preloading.",
|
|
1969
|
-
),
|
|
1970
|
-
preloadMaxConnectionsBytes: z
|
|
1971
|
-
.number()
|
|
1972
|
-
.optional()
|
|
1973
|
-
.describe(
|
|
1974
|
-
"Override RivetKit's connections preload budget for this actor. Set to 0 to disable connections preloading.",
|
|
1975
|
-
),
|
|
1976
2064
|
})
|
|
1977
2065
|
.describe("Actor options for timeouts and behavior configuration.");
|
|
1978
2066
|
|
package/src/actor/definition.ts
CHANGED
|
@@ -9,16 +9,27 @@ import {
|
|
|
9
9
|
import { loggerWithoutContext } from "./log";
|
|
10
10
|
import type { EventSchemaConfig, QueueSchemaConfig } from "./schema";
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const warnedDeprecatedOptionKeys = new Set<string>();
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
const DEPRECATED_OPTION_MESSAGES: Record<string, string> = {
|
|
15
|
+
onDestroyTimeout:
|
|
16
|
+
"Configure `sleepGracePeriod` instead, which bounds the entire graceful shutdown window for both sleep and destroy.",
|
|
17
|
+
waitUntilTimeout:
|
|
18
|
+
"Configure `sleepGracePeriod` instead, which bounds the entire graceful shutdown window for both sleep and destroy.",
|
|
19
|
+
preloadMaxWorkflowBytes:
|
|
20
|
+
"Internal storage moved to SQLite and no longer uses KV preloading.",
|
|
21
|
+
preloadMaxConnectionsBytes:
|
|
22
|
+
"Internal storage moved to SQLite and no longer uses KV preloading.",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function warnDeprecatedOptionKeys(options: unknown) {
|
|
15
26
|
if (!options || typeof options !== "object") return;
|
|
16
27
|
const opts = options as Record<string, unknown>;
|
|
17
|
-
for (const key of
|
|
18
|
-
if (opts[key] !== undefined && !
|
|
19
|
-
|
|
28
|
+
for (const [key, detail] of Object.entries(DEPRECATED_OPTION_MESSAGES)) {
|
|
29
|
+
if (opts[key] !== undefined && !warnedDeprecatedOptionKeys.has(key)) {
|
|
30
|
+
warnedDeprecatedOptionKeys.add(key);
|
|
20
31
|
loggerWithoutContext().warn({
|
|
21
|
-
msg: `actor option \`${key}\` is deprecated and is now ignored.
|
|
32
|
+
msg: `actor option \`${key}\` is deprecated and is now ignored. ${detail} Will be removed in 2.2.0.`,
|
|
22
33
|
});
|
|
23
34
|
}
|
|
24
35
|
}
|
|
@@ -181,7 +192,7 @@ export function actor<
|
|
|
181
192
|
TQueues,
|
|
182
193
|
TActions
|
|
183
194
|
> {
|
|
184
|
-
|
|
195
|
+
warnDeprecatedOptionKeys(
|
|
185
196
|
(input as { options?: unknown } | undefined)?.options,
|
|
186
197
|
);
|
|
187
198
|
const config = ActorConfigSchema.parse(input) as ActorConfig<
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentOsOptions, MountConfig } from "@rivet-dev/agent-os-core";
|
|
2
2
|
import { AgentOs, createInMemoryFileSystem } from "@rivet-dev/agent-os-core";
|
|
3
|
-
import { actor, event
|
|
3
|
+
import { type ActorDefinition, actor, event } from "@/actor/mod";
|
|
4
4
|
import type { DatabaseProvider, RawAccess } from "@/common/database/config";
|
|
5
5
|
import { db } from "@/common/database/mod";
|
|
6
6
|
import {
|
|
@@ -80,7 +80,7 @@ function buildVmOptions(userOptions?: AgentOsOptions): AgentOsOptions {
|
|
|
80
80
|
return userOptions ?? {};
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
// TODO: Reimplement with persistent backend (
|
|
83
|
+
// TODO: Reimplement with persistent backend (SQLite-backed metadata and
|
|
84
84
|
// actor storage-backed blocks) so VM filesystem state survives sleep/wake.
|
|
85
85
|
const memMount: MountConfig = {
|
|
86
86
|
path: "/home/user",
|