@usehelical/workflows 0.0.1-alpha.16 → 0.0.1-alpha.18

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/README.md CHANGED
@@ -1,12 +1,80 @@
1
1
  # Helical Workflows
2
2
 
3
- Simple, typesafe durable workflows without bundler magic
4
-
5
3
  > [!WARNING]
6
4
  > This is a work in progress
7
5
 
8
- # Goals
6
+ Simple, typesafe durable workflows without bundler magic
7
+
8
+ ## Features
9
+
10
+ - Effortless setup
11
+ - Effortless deployment
12
+ - Automatic workflow recovery
13
+ - Messages
14
+ - State
15
+ - Queues
16
+
17
+ # Getting started
18
+
19
+ ## Installation
20
+
21
+ Install the hkit CLI and apply migrations to your Postgres database
22
+
23
+ ```sh
24
+ curl -sSfL https://releases.usehelical.com/install.sh | sh
25
+ ```
26
+
27
+ Apply migrations to your Postgres instance
28
+
29
+ ```sh
30
+ hkit migrate --databaseUrl postgresql://postgres:postgres@localhost:5432/postgres
31
+ ```
32
+
33
+ Install the @usehelical/workflows npm package to use it in your project
34
+
35
+ ```sh
36
+ pnpm add @usehelical/workflows
37
+ ```
38
+
39
+ ## Defining a workflow
40
+
41
+ Define a workflow by using the defineWorkflow function and execute steps by using the runStep function. It is important that the steps you run are idempotent to ensure correct and reliable execution of your workflow.
42
+
43
+ ```ts
44
+ import { defineWorkflow, runStep } from '@usehelical/workflows/api';
45
+
46
+ export const checkoutWorkflow = defineWorkflow('checkout', async (id: string) => {
47
+ await runStep(async () => {
48
+ await decrementInventory();
49
+ });
50
+
51
+ await runStep(async () => {
52
+ await createOrder(id);
53
+ });
54
+ });
55
+ ```
56
+
57
+ ## Creating a worker
58
+
59
+ Create a worker by using the createWorker function registering the workflows it can run. And connecting it to the previously setup Postgres database.
60
+
61
+ ```ts
62
+ import { createWorker } from '@usehelical/workflows';
63
+
64
+ export const worker = createWorker({
65
+ workflows: [checkoutWorkflow],
66
+ options: {
67
+ connectionString: process.env.DATABASE_URL,
68
+ },
69
+ });
70
+ ```
71
+
72
+ ## Starting a worker
73
+
74
+ Pass the workflow to the runWorkflow function and pass the arguments to the workflow as an array. The waitForResult function will await the workflow completion.
75
+
76
+ ```ts
77
+ const { id, getStatus, waitForResult } = await worker.runWorkflow(checkoutWorkflow, [id]);
9
78
 
10
- - simple & typesafe api
11
- - minimal deployment complexity (just postgres)
12
- - low latency (making it suitable for user-facing ai workflows)
79
+ const { success, data, error } = await waitForResult();
80
+ ```
package/dist/api.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as StateDefinition, M as MessageDefinition } from './state-DygxhGtl.js';
2
- export { Q as QueueDefinition, b as QueueOptions, c as QueueRateLimit, d as QueueSignature, R as RunStatus, T as TERMINAL_STATES, W as WorkflowDefinition, e as WorkflowFunction, a as WorkflowSignature, f as defineMessage, g as defineQueue, h as defineState, i as defineWorkflow } from './state-DygxhGtl.js';
1
+ import { S as StateDefinition, M as MessageDefinition } from './state-B6QkOxSb.js';
2
+ export { Q as QueueDefinition, a as QueueOptions, b as QueueRateLimit, R as RunStatus, T as TERMINAL_STATES, W as WorkflowDefinition, c as WorkflowFunction, d as defineMessage, e as defineQueue, f as defineState, g as defineWorkflow } from './state-B6QkOxSb.js';
3
3
 
4
4
  type RetryConfig = {
5
5
  maxRetries?: number;
package/dist/api.js CHANGED
@@ -1,5 +1,5 @@
1
- import { getExecutionContext, returnOrThrowOperationResult, executeAndRecordOperation, FatalError, MaxRetriesExceededError, sleep, withDbRetry, serialize, OperationTimedOutError, serializeError, deserialize, RunCancelledError } from './chunk-HRDI7EOY.js';
2
- export { TERMINAL_STATES, defineWorkflow } from './chunk-HRDI7EOY.js';
1
+ import { getExecutionContext, returnOrThrowOperationResult, executeAndRecordOperation, FatalError, MaxRetriesExceededError, sleep, withDbRetry, serialize, OperationTimedOutError, serializeError, deserialize, RunCancelledError } from './chunk-6L2Y7WUY.js';
2
+ export { TERMINAL_STATES, defineWorkflow } from './chunk-6L2Y7WUY.js';
3
3
  import { sql } from 'kysely';
4
4
  import crypto, { createHash } from 'crypto';
5
5
 
@@ -9,8 +9,8 @@ function defineMessage(name) {
9
9
  }
10
10
 
11
11
  // src/api/queue.ts
12
- function defineQueue(name, options = {}) {
13
- return { name, ...options };
12
+ function defineQueue(options = {}) {
13
+ return options;
14
14
  }
15
15
 
16
16
  // src/api/state.ts
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/message.ts","../src/api/queue.ts","../src/api/state.ts","../src/api/steps/run-step.ts","../src/internal/db/commands/insert-state.ts","../src/api/steps/set-state.ts","../src/internal/db/commands/read-and-delete-message.ts","../src/internal/with-durable-deadline.ts","../src/api/steps/receive-message.ts","../src/api/steps/helpers/get-step-id.ts","../src/api/steps/helpers/get-abort-signal.ts","../src/api/steps/helpers/get-run-id.ts","../src/api/steps/sleep.ts","../src/api/steps/random-uuid.ts","../src/api/steps/now.ts"],"names":["sleep"],"mappings":"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","file":"api.js","sourcesContent":["export type MessageDefinition<T> = {\n name: string;\n __data?: T;\n};\n\nexport function defineMessage<T>(name: string): MessageDefinition<T> {\n return { name } as MessageDefinition<T>;\n}\n","export type QueueRateLimit = {\n limitPerPeriod: number;\n period: number;\n};\n\nexport type QueueOptions = {\n workerConcurrency?: number;\n concurrency?: number;\n rateLimit?: QueueRateLimit;\n priorityEnabled?: boolean;\n partitioningEnabled?: boolean;\n};\n\nexport type QueueDefinition = QueueOptions & { name: string };\n\nexport type QueueSignature = {\n name: string;\n};\n\nexport function defineQueue(name: string, options: QueueOptions = {}): QueueDefinition {\n return { name, ...options };\n}\n","export interface StateDefinition<T> {\n name: string;\n data?: T;\n}\n\nexport function defineState<T>(name: string) {\n return {\n name,\n } as StateDefinition<T>;\n}\n","import { FatalError, MaxRetriesExceededError } from '@internal/errors';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { sleep } from '@internal/utils/sleep';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from '@internal/context/operation-manager';\n\nexport type RetryConfig = {\n maxRetries?: number;\n retryDelay?: number;\n backOffRate?: number;\n};\n\ntype RunStepOptions = RetryConfig & {\n name?: string;\n};\n\nexport async function runStep<TReturn>(\n stepFn: () => Promise<TReturn>,\n options: RunStepOptions = {},\n) {\n const { maxRetries, retryDelay, backOffRate } = options;\n const { operationManager } = getExecutionContext();\n const stepName = options.name || stepFn.name || '<unknown>';\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<TReturn>(op);\n }\n return await executeAndRecordOperation(operationManager, stepName, async () => {\n return await executeStepWithRetries(stepName, stepFn, { maxRetries, retryDelay, backOffRate });\n });\n}\n\nclass ErrorThatShouldNeverHappen extends Error {\n constructor() {\n super('This error should never happen');\n }\n}\n\nexport async function executeStepWithRetries<TReturn>(\n stepName: string,\n fn: () => Promise<TReturn>,\n retryConfig: RetryConfig,\n): Promise<TReturn> {\n const maxRetries = retryConfig.maxRetries ?? 0;\n const retryDelay = retryConfig.retryDelay ?? 0;\n const backOffRate = retryConfig.backOffRate ?? 1;\n\n const attemptErrors: Error[] = [];\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n attemptErrors.push(err);\n if (err instanceof FatalError) {\n throw err;\n }\n if (maxRetries === 0) {\n throw err;\n }\n if (attempt >= maxRetries) {\n throw new MaxRetriesExceededError(stepName, maxRetries, attemptErrors);\n }\n const delay = retryDelay * Math.pow(backOffRate, attempt);\n await sleep(delay);\n }\n }\n throw new ErrorThatShouldNeverHappen();\n}\n","import { Database, Transaction } from '../db';\n\ntype InsertStateOptions = {\n runId: string;\n key: string;\n value: string;\n sequenceId: number;\n};\n\nexport async function insertState(tx: Transaction | Database, options: InsertStateOptions) {\n await tx\n .insertInto('state')\n .values({\n run_id: options.runId,\n key: options.key,\n value: options.value,\n })\n .onConflict((oc) =>\n oc.column('run_id').column('key').doUpdateSet({\n value: options.value,\n }),\n )\n .execute();\n\n await tx\n .insertInto('state_history')\n .values({\n run_id: options.runId,\n sequence_id: options.sequenceId,\n key: options.key,\n value: options.value,\n })\n .execute();\n}\n","import { withDbRetry } from '@internal/db/retry';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { returnOrThrowOperationResult } from '@internal/context/operation-manager';\nimport { insertState } from '@internal/db/commands/insert-state';\nimport { serialize } from '@internal/utils/serialization';\nimport { StateDefinition } from '@api/state';\n\nconst SET_STATE_OPERATION_NAME = 'workflow::state::set';\n\nexport async function setState<T = unknown>(state: StateDefinition<T> | string, value: T) {\n const stateKey = typeof state === 'string' ? state : state.name;\n const { operationManager, runId, db } = getExecutionContext();\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<void>(op);\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n await insertState(tx, { runId, key: stateKey, value: serialize(value), sequenceId: seqId });\n await operationManager.recordResult(SET_STATE_OPERATION_NAME, seqId, null, tx);\n });\n });\n}\n","import { sql } from 'kysely';\nimport { Transaction } from '../db';\n\ntype Message = {\n id: string;\n payload?: string;\n type?: string;\n};\n\nexport async function readAndDeleteMessage(\n tx: Transaction,\n runId: string,\n messageType?: string,\n): Promise<Message | undefined> {\n const results = await sql<Message>`\n DELETE FROM messages\n WHERE id IN (\n SELECT id FROM messages\n WHERE destination_run_id = ${runId}\n ${messageType !== undefined ? sql`AND type = ${messageType}` : sql``}\n ORDER BY created_at_epoch_ms ASC\n LIMIT 1\n )\n RETURNING id, payload, type\n `.execute(tx);\n\n const result = results.rows[0];\n\n return result\n ? {\n id: result.id,\n payload: result.payload ?? undefined,\n type: result.type ?? undefined,\n }\n : undefined;\n}\n","import { getExecutionContext } from './context/execution-context';\nimport { executeAndRecordOperation } from './context/operation-manager';\n\nexport async function withDurableDeadline<T>(\n timeoutMs: number | undefined,\n operationName: string,\n fn: (deadlineMs: number | undefined) => Promise<T>,\n): Promise<T> {\n if (!timeoutMs) {\n return await fn(undefined);\n }\n\n const { operationManager } = getExecutionContext();\n\n let deadlineMs: number;\n const op = operationManager.getOperationResult();\n if (op) {\n deadlineMs = Number(op.result);\n } else {\n deadlineMs = Date.now() + timeoutMs;\n await executeAndRecordOperation(operationManager, operationName, async () => {\n return deadlineMs;\n });\n }\n\n return await fn(deadlineMs);\n}\n","import { withDbRetry } from '@internal/db/retry';\nimport { OperationTimedOutError } from '@internal/errors';\nimport { MessageEventBus } from '@internal/events/message-event-bus';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { returnOrThrowOperationResult } from '@internal/context/operation-manager';\nimport { readAndDeleteMessage } from '@internal/db/commands/read-and-delete-message';\nimport { deserialize, serialize, serializeError } from '@internal/utils/serialization';\nimport { withDurableDeadline } from '@internal/with-durable-deadline';\nimport { MessageDefinition } from '@api/message';\n\nconst RECEIVE_MESSAGE_OPERATION_NAME = 'receiveMessage';\n\nconst RECEIVE_MESSAGE_DURABLE_DEADLINE_OPERATION_NAME = 'receiveMessageDurableDeadline';\n\nclass MessageNotAvailableError extends Error {}\n\nexport type ReceiveMessageOptions = {\n timeout?: number;\n};\n\nexport async function receiveMessage<T>(\n message: MessageDefinition<T> | string,\n options?: ReceiveMessageOptions,\n): Promise<T> {\n const messageType = typeof message === 'string' ? message : message.name;\n return await withDurableDeadline(\n options?.timeout,\n RECEIVE_MESSAGE_DURABLE_DEADLINE_OPERATION_NAME,\n async (deadlineMs) => {\n return await receiveMessageWithDeadline(messageType, deadlineMs);\n },\n );\n}\n\nasync function receiveMessageWithDeadline<T>(\n messageType: string,\n deadlineMs: number | undefined,\n): Promise<T> {\n const { runId, operationManager, messageEventBus, db } = getExecutionContext();\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<T>(op) as T;\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n while (true) {\n // Check if timeout expired\n if (deadlineMs && Date.now() >= deadlineMs) {\n const error = new OperationTimedOutError('receiveMessage');\n await operationManager.recordError(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serializeError(error),\n );\n throw error;\n }\n\n try {\n return await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n const msg = await readAndDeleteMessage(tx, runId, messageType);\n if (!msg) {\n throw new MessageNotAvailableError();\n }\n await operationManager.recordResult(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serialize(msg.payload),\n tx,\n );\n return deserialize(msg.payload!) as T;\n });\n });\n } catch (error) {\n if (error instanceof MessageNotAvailableError) {\n const remainingMs = deadlineMs ? deadlineMs - Date.now() : undefined;\n await waitForMessageNotification(messageEventBus, runId, messageType, remainingMs);\n continue;\n }\n // Record and re-throw other errors\n await operationManager.recordError(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serializeError(error as Error),\n );\n throw error;\n }\n }\n}\n\nasync function waitForMessageNotification(\n messageEventBus: MessageEventBus,\n runId: string,\n messageType: string,\n timeoutMs?: number,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | undefined;\n\n if (timeoutMs !== undefined) {\n if (timeoutMs <= 0) {\n reject(new OperationTimedOutError('receiveMessageDurableDeadline'));\n return;\n }\n\n timeoutId = setTimeout(() => {\n unsubscribe();\n reject(new OperationTimedOutError('waitForMessageNotification'));\n }, timeoutMs);\n }\n\n const unsubscribe = messageEventBus.subscribe(runId, messageType, () => {\n if (timeoutId) clearTimeout(timeoutId);\n unsubscribe();\n resolve();\n });\n });\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\nimport { createHash } from 'node:crypto';\n\n/**\n * Generates a stable, unique step ID based on the current run ID and sequence ID.\n * This ID is deterministic and will remain the same across retries, making it\n * suitable for use as an idempotency key with third-party systems.\n *\n * The step ID is a SHA-256 hash of the run ID and sequence ID, formatted as a\n * hex string for easy use with external APIs.\n *\n * @returns A unique, stable identifier for the current step execution\n */\nexport function getStepId(): string {\n const ctx = getExecutionContext();\n const sequenceId = ctx.operationManager.getActiveSequenceId();\n\n if (sequenceId === null) {\n throw new Error('getStepId() can only be called from within a step function');\n }\n\n const hash = createHash('sha256');\n hash.update(`${ctx.runId}:${sequenceId}`);\n return hash.digest('hex');\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\n\nexport function getAbortSignal() {\n return getExecutionContext().abortSignal;\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\n\nexport function getRunId() {\n const { runId } = getExecutionContext();\n return runId;\n}\n","import { RunCancelledError } from '@internal/errors';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { withDurableDeadline } from '@internal/with-durable-deadline';\n\nconst SLEEP_OPERATION_NAME = '_helical::sleep';\n\nexport async function sleep(ms: number) {\n const { abortSignal } = getExecutionContext();\n return await withDurableDeadline(ms, SLEEP_OPERATION_NAME, async (deadlineMs) => {\n const remainingMs = deadlineMs! - Date.now();\n try {\n await cancellableSleep(remainingMs, abortSignal);\n } catch {\n throw new RunCancelledError();\n }\n });\n}\n\nexport function cancellableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Sleep aborted'));\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new Error('Sleep aborted'));\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n","import crypto from 'node:crypto';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { executeAndRecordOperation } from '@internal/context/operation-manager';\n\nexport async function randomUUID() {\n const { operationManager } = getExecutionContext();\n const existingResult = operationManager.getOperationResult();\n if (existingResult) {\n return existingResult.result as string;\n } else {\n return await executeAndRecordOperation(operationManager, 'randomUUID', async () => {\n return crypto.randomUUID();\n });\n }\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\nimport { executeAndRecordOperation } from '@internal/context/operation-manager';\n\nexport async function now() {\n const { operationManager } = getExecutionContext();\n const op = operationManager.getOperationResult();\n if (op) {\n return Number(op.result);\n } else {\n return await executeAndRecordOperation(operationManager, 'now', async () => {\n return Date.now();\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/api/message.ts","../src/api/queue.ts","../src/api/state.ts","../src/api/steps/run-step.ts","../src/internal/db/commands/insert-state.ts","../src/api/steps/set-state.ts","../src/internal/db/commands/read-and-delete-message.ts","../src/internal/with-durable-deadline.ts","../src/api/steps/receive-message.ts","../src/api/steps/helpers/get-step-id.ts","../src/api/steps/helpers/get-abort-signal.ts","../src/api/steps/helpers/get-run-id.ts","../src/api/steps/sleep.ts","../src/api/steps/random-uuid.ts","../src/api/steps/now.ts"],"names":["sleep"],"mappings":"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","file":"api.js","sourcesContent":["export type MessageDefinition<T> = {\n name: string;\n __data?: T;\n};\n\nexport function defineMessage<T>(name: string): MessageDefinition<T> {\n return { name } as MessageDefinition<T>;\n}\n","export type QueueRateLimit = {\n limitPerPeriod: number;\n period: number;\n};\n\nexport type QueueOptions = {\n workerConcurrency?: number;\n concurrency?: number;\n rateLimit?: QueueRateLimit;\n priorityEnabled?: boolean;\n partitioningEnabled?: boolean;\n};\n\nexport type QueueDefinition = QueueOptions;\n\nexport function defineQueue(options: QueueOptions = {}): QueueDefinition {\n return options;\n}\n","export interface StateDefinition<T> {\n name: string;\n data?: T;\n}\n\nexport function defineState<T>(name: string) {\n return {\n name,\n } as StateDefinition<T>;\n}\n","import { FatalError, MaxRetriesExceededError } from '@internal/errors';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { sleep } from '@internal/utils/sleep';\nimport {\n executeAndRecordOperation,\n returnOrThrowOperationResult,\n} from '@internal/context/operation-manager';\n\nexport type RetryConfig = {\n maxRetries?: number;\n retryDelay?: number;\n backOffRate?: number;\n};\n\ntype RunStepOptions = RetryConfig & {\n name?: string;\n};\n\nexport async function runStep<TReturn>(\n stepFn: () => Promise<TReturn>,\n options: RunStepOptions = {},\n) {\n const { maxRetries, retryDelay, backOffRate } = options;\n const { operationManager } = getExecutionContext();\n const stepName = options.name || stepFn.name || '<unknown>';\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<TReturn>(op);\n }\n return await executeAndRecordOperation(operationManager, stepName, async () => {\n return await executeStepWithRetries(stepName, stepFn, { maxRetries, retryDelay, backOffRate });\n });\n}\n\nclass ErrorThatShouldNeverHappen extends Error {\n constructor() {\n super('This error should never happen');\n }\n}\n\nexport async function executeStepWithRetries<TReturn>(\n stepName: string,\n fn: () => Promise<TReturn>,\n retryConfig: RetryConfig,\n): Promise<TReturn> {\n const maxRetries = retryConfig.maxRetries ?? 0;\n const retryDelay = retryConfig.retryDelay ?? 0;\n const backOffRate = retryConfig.backOffRate ?? 1;\n\n const attemptErrors: Error[] = [];\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n attemptErrors.push(err);\n if (err instanceof FatalError) {\n throw err;\n }\n if (maxRetries === 0) {\n throw err;\n }\n if (attempt >= maxRetries) {\n throw new MaxRetriesExceededError(stepName, maxRetries, attemptErrors);\n }\n const delay = retryDelay * Math.pow(backOffRate, attempt);\n await sleep(delay);\n }\n }\n throw new ErrorThatShouldNeverHappen();\n}\n","import { Database, Transaction } from '../db';\n\ntype InsertStateOptions = {\n runId: string;\n key: string;\n value: string;\n sequenceId: number;\n};\n\nexport async function insertState(tx: Transaction | Database, options: InsertStateOptions) {\n await tx\n .insertInto('state')\n .values({\n run_id: options.runId,\n key: options.key,\n value: options.value,\n })\n .onConflict((oc) =>\n oc.column('run_id').column('key').doUpdateSet({\n value: options.value,\n }),\n )\n .execute();\n\n await tx\n .insertInto('state_history')\n .values({\n run_id: options.runId,\n sequence_id: options.sequenceId,\n key: options.key,\n value: options.value,\n })\n .execute();\n}\n","import { withDbRetry } from '@internal/db/retry';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { returnOrThrowOperationResult } from '@internal/context/operation-manager';\nimport { insertState } from '@internal/db/commands/insert-state';\nimport { serialize } from '@internal/utils/serialization';\nimport { StateDefinition } from '@api/state';\n\nconst SET_STATE_OPERATION_NAME = 'workflow::state::set';\n\nexport async function setState<T = unknown>(state: StateDefinition<T> | string, value: T) {\n const stateKey = typeof state === 'string' ? state : state.name;\n const { operationManager, runId, db } = getExecutionContext();\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<void>(op);\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n await insertState(tx, { runId, key: stateKey, value: serialize(value), sequenceId: seqId });\n await operationManager.recordResult(SET_STATE_OPERATION_NAME, seqId, null, tx);\n });\n });\n}\n","import { sql } from 'kysely';\nimport { Transaction } from '../db';\n\ntype Message = {\n id: string;\n payload?: string;\n type?: string;\n};\n\nexport async function readAndDeleteMessage(\n tx: Transaction,\n runId: string,\n messageType?: string,\n): Promise<Message | undefined> {\n const results = await sql<Message>`\n DELETE FROM messages\n WHERE id IN (\n SELECT id FROM messages\n WHERE destination_run_id = ${runId}\n ${messageType !== undefined ? sql`AND type = ${messageType}` : sql``}\n ORDER BY created_at_epoch_ms ASC\n LIMIT 1\n )\n RETURNING id, payload, type\n `.execute(tx);\n\n const result = results.rows[0];\n\n return result\n ? {\n id: result.id,\n payload: result.payload ?? undefined,\n type: result.type ?? undefined,\n }\n : undefined;\n}\n","import { getExecutionContext } from './context/execution-context';\nimport { executeAndRecordOperation } from './context/operation-manager';\n\nexport async function withDurableDeadline<T>(\n timeoutMs: number | undefined,\n operationName: string,\n fn: (deadlineMs: number | undefined) => Promise<T>,\n): Promise<T> {\n if (!timeoutMs) {\n return await fn(undefined);\n }\n\n const { operationManager } = getExecutionContext();\n\n let deadlineMs: number;\n const op = operationManager.getOperationResult();\n if (op) {\n deadlineMs = Number(op.result);\n } else {\n deadlineMs = Date.now() + timeoutMs;\n await executeAndRecordOperation(operationManager, operationName, async () => {\n return deadlineMs;\n });\n }\n\n return await fn(deadlineMs);\n}\n","import { withDbRetry } from '@internal/db/retry';\nimport { OperationTimedOutError } from '@internal/errors';\nimport { MessageEventBus } from '@internal/events/message-event-bus';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { returnOrThrowOperationResult } from '@internal/context/operation-manager';\nimport { readAndDeleteMessage } from '@internal/db/commands/read-and-delete-message';\nimport { deserialize, serialize, serializeError } from '@internal/utils/serialization';\nimport { withDurableDeadline } from '@internal/with-durable-deadline';\nimport { MessageDefinition } from '@api/message';\n\nconst RECEIVE_MESSAGE_OPERATION_NAME = 'receiveMessage';\n\nconst RECEIVE_MESSAGE_DURABLE_DEADLINE_OPERATION_NAME = 'receiveMessageDurableDeadline';\n\nclass MessageNotAvailableError extends Error {}\n\nexport type ReceiveMessageOptions = {\n timeout?: number;\n};\n\nexport async function receiveMessage<T>(\n message: MessageDefinition<T> | string,\n options?: ReceiveMessageOptions,\n): Promise<T> {\n const messageType = typeof message === 'string' ? message : message.name;\n return await withDurableDeadline(\n options?.timeout,\n RECEIVE_MESSAGE_DURABLE_DEADLINE_OPERATION_NAME,\n async (deadlineMs) => {\n return await receiveMessageWithDeadline(messageType, deadlineMs);\n },\n );\n}\n\nasync function receiveMessageWithDeadline<T>(\n messageType: string,\n deadlineMs: number | undefined,\n): Promise<T> {\n const { runId, operationManager, messageEventBus, db } = getExecutionContext();\n\n const op = operationManager.getOperationResult();\n if (op) {\n return returnOrThrowOperationResult<T>(op) as T;\n }\n\n const seqId = operationManager.reserveSequenceId();\n\n while (true) {\n // Check if timeout expired\n if (deadlineMs && Date.now() >= deadlineMs) {\n const error = new OperationTimedOutError('receiveMessage');\n await operationManager.recordError(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serializeError(error),\n );\n throw error;\n }\n\n try {\n return await withDbRetry(async () => {\n return await db.transaction().execute(async (tx) => {\n const msg = await readAndDeleteMessage(tx, runId, messageType);\n if (!msg) {\n throw new MessageNotAvailableError();\n }\n await operationManager.recordResult(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serialize(msg.payload),\n tx,\n );\n return deserialize(msg.payload!) as T;\n });\n });\n } catch (error) {\n if (error instanceof MessageNotAvailableError) {\n const remainingMs = deadlineMs ? deadlineMs - Date.now() : undefined;\n await waitForMessageNotification(messageEventBus, runId, messageType, remainingMs);\n continue;\n }\n // Record and re-throw other errors\n await operationManager.recordError(\n RECEIVE_MESSAGE_OPERATION_NAME,\n seqId,\n serializeError(error as Error),\n );\n throw error;\n }\n }\n}\n\nasync function waitForMessageNotification(\n messageEventBus: MessageEventBus,\n runId: string,\n messageType: string,\n timeoutMs?: number,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | undefined;\n\n if (timeoutMs !== undefined) {\n if (timeoutMs <= 0) {\n reject(new OperationTimedOutError('receiveMessageDurableDeadline'));\n return;\n }\n\n timeoutId = setTimeout(() => {\n unsubscribe();\n reject(new OperationTimedOutError('waitForMessageNotification'));\n }, timeoutMs);\n }\n\n const unsubscribe = messageEventBus.subscribe(runId, messageType, () => {\n if (timeoutId) clearTimeout(timeoutId);\n unsubscribe();\n resolve();\n });\n });\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\nimport { createHash } from 'node:crypto';\n\n/**\n * Generates a stable, unique step ID based on the current run ID and sequence ID.\n * This ID is deterministic and will remain the same across retries, making it\n * suitable for use as an idempotency key with third-party systems.\n *\n * The step ID is a SHA-256 hash of the run ID and sequence ID, formatted as a\n * hex string for easy use with external APIs.\n *\n * @returns A unique, stable identifier for the current step execution\n */\nexport function getStepId(): string {\n const ctx = getExecutionContext();\n const sequenceId = ctx.operationManager.getActiveSequenceId();\n\n if (sequenceId === null) {\n throw new Error('getStepId() can only be called from within a step function');\n }\n\n const hash = createHash('sha256');\n hash.update(`${ctx.runId}:${sequenceId}`);\n return hash.digest('hex');\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\n\nexport function getAbortSignal() {\n return getExecutionContext().abortSignal;\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\n\nexport function getRunId() {\n const { runId } = getExecutionContext();\n return runId;\n}\n","import { RunCancelledError } from '@internal/errors';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { withDurableDeadline } from '@internal/with-durable-deadline';\n\nconst SLEEP_OPERATION_NAME = '_helical::sleep';\n\nexport async function sleep(ms: number) {\n const { abortSignal } = getExecutionContext();\n return await withDurableDeadline(ms, SLEEP_OPERATION_NAME, async (deadlineMs) => {\n const remainingMs = deadlineMs! - Date.now();\n try {\n await cancellableSleep(remainingMs, abortSignal);\n } catch {\n throw new RunCancelledError();\n }\n });\n}\n\nexport function cancellableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Sleep aborted'));\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new Error('Sleep aborted'));\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n","import crypto from 'node:crypto';\nimport { getExecutionContext } from '@internal/context/execution-context';\nimport { executeAndRecordOperation } from '@internal/context/operation-manager';\n\nexport async function randomUUID() {\n const { operationManager } = getExecutionContext();\n const existingResult = operationManager.getOperationResult();\n if (existingResult) {\n return existingResult.result as string;\n } else {\n return await executeAndRecordOperation(operationManager, 'randomUUID', async () => {\n return crypto.randomUUID();\n });\n }\n}\n","import { getExecutionContext } from '@internal/context/execution-context';\nimport { executeAndRecordOperation } from '@internal/context/operation-manager';\n\nexport async function now() {\n const { operationManager } = getExecutionContext();\n const op = operationManager.getOperationResult();\n if (op) {\n return Number(op.result);\n } else {\n return await executeAndRecordOperation(operationManager, 'now', async () => {\n return Date.now();\n });\n }\n}\n"]}
@@ -109,9 +109,8 @@ var TERMINAL_STATES = [
109
109
  "cancelled",
110
110
  "max_recovery_attempts_exceeded"
111
111
  ];
112
- function defineWorkflow(name, fn, options = {}) {
112
+ function defineWorkflow(fn, options = {}) {
113
113
  return {
114
- name,
115
114
  fn,
116
115
  maxRecoveryAttempts: options.maxRecoveryAttempts
117
116
  };
@@ -437,5 +436,5 @@ async function checkCancellation() {
437
436
  }
438
437
 
439
438
  export { BaseError, ErrorType, FatalError, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, OperationTimedOutError, RunCancelledError, RunDeadlineExceededError, RunNotFoundError, RunOutsideOfWorkflowError, RunTimedOutError, SerializationError, TERMINAL_STATES, UnknownError, WorkflowNotFoundError, createExecutionContext, defineWorkflow, deserialize, deserializeError, executeAndRecordOperation, getExecutionContext, getRun, returnOrThrowOperationResult, runWithExecutionContext, serialize, serializeError, sleep, withDbRetry };
440
- //# sourceMappingURL=chunk-HRDI7EOY.js.map
441
- //# sourceMappingURL=chunk-HRDI7EOY.js.map
439
+ //# sourceMappingURL=chunk-6L2Y7WUY.js.map
440
+ //# sourceMappingURL=chunk-6L2Y7WUY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/errors.ts","../src/api/workflow.ts","../src/internal/utils/sleep.ts","../src/internal/db/retry.ts","../src/internal/utils/serialization.ts","../src/internal/context/execution-context.ts","../src/internal/db/queries/get-run.ts","../src/internal/db/commands/insert-operation.ts","../src/internal/context/operation-manager.ts"],"names":["ErrorType","_serializeError","error","_deserializeError"],"mappings":"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","file":"chunk-6L2Y7WUY.js","sourcesContent":["export enum ErrorType {\n INVALID_WORKFLOW_TRANSITION = 'INVALID_WORKFLOW_TRANSITION',\n RUN_CANCELLED = 'RUN_CANCELLED',\n RUN_NOT_FOUND = 'RUN_NOT_FOUND',\n RUN_OUTSIDE_OF_WORKFLOW = 'RUN_OUTSIDE_OF_WORKFLOW',\n FATAL_ERROR = 'FATAL_ERROR',\n NO_MESSAGE_AVAILABLE = 'NO_MESSAGE_AVAILABLE',\n MAX_RETRIES_EXCEEDED = 'MAX_RETRIES_EXCEEDED',\n ERROR_THAT_SHOULD_NEVER_HAPPEN = 'ERROR_THAT_SHOULD_NEVER_HAPPEN',\n SERIALIZATION_ERROR = 'SERIALIZATION_ERROR',\n MAX_RECOVERY_ATTEMPTS_EXCEEDED = 'MAX_RECOVERY_ATTEMPTS_EXCEEDED',\n WORKFLOW_NOT_FOUND = 'WORKFLOW_NOT_FOUND',\n TIMEOUT = 'TIMEOUT',\n CANCEL = 'CANCEL',\n DEADLINE = 'DEADLINE',\n RUN_NOT_CANCELLABLE = 'RUN_NOT_CANCELLABLE',\n QUEUE_NOT_FOUND = 'QUEUE_NOT_FOUND',\n}\n\nexport type ErrorReason =\n | 'timeout'\n | 'deadline'\n | 'cancel'\n | 'unhandled'\n | 'max_recovery_attempts_exceeded'\n | 'workflow_not_found'\n | 'unknown'\n | 'run_not_found'\n | 'outside_workflow_context'\n | 'fatal_error'\n | 'max_retries_exceeded'\n | 'serialization_error';\n\nexport class BaseError extends Error {\n readonly reason: ErrorReason;\n\n constructor(message: string, reason: ErrorReason) {\n super(message);\n this.reason = reason;\n }\n}\n\nexport class RunTimedOutError extends BaseError {\n constructor() {\n super('This workflow run has timed out', 'timeout');\n }\n}\n\nexport class UnknownError extends BaseError {\n constructor(message?: string) {\n super(message || 'An unknown error occurred', 'unknown');\n }\n}\n\nexport class RunDeadlineExceededError extends BaseError {\n constructor() {\n super('This workflow run has exceeded its deadline', 'deadline');\n }\n}\n\nexport class RunCancelledError extends BaseError {\n constructor() {\n super('This workflow run has been cancelled', 'cancel');\n }\n}\n\nexport class MaxRecoveryAttemptsExceededError extends BaseError {\n constructor(runId: string, attempts: number) {\n super(\n `Max recovery attempts exceeded for run \"${runId}\" after ${attempts + 1} attempts`,\n 'max_recovery_attempts_exceeded',\n );\n }\n}\n\nexport class OperationTimedOutError extends BaseError {\n constructor(operationName: string) {\n super(`This operation \"${operationName}\" has timed out`, 'timeout');\n }\n}\n\nexport class RunNotFoundError extends BaseError {\n constructor(runId: string) {\n super(`Workflow run \"${runId}\" not found`, 'run_not_found');\n }\n}\n\nexport class RunOutsideOfWorkflowError extends BaseError {\n constructor() {\n super('This function must be called within a workflow', 'outside_workflow_context');\n }\n}\n\nexport class FatalError extends BaseError {\n constructor(message: string) {\n super(message, 'fatal_error');\n }\n}\n\nexport class MaxRetriesExceededError extends BaseError {\n readonly attemptErrors: Error[];\n readonly stepName: string;\n readonly maxAttempts: number;\n\n constructor(stepName: string, maxAttempts: number, errors: Error[]) {\n const formattedErrors = errors\n .map((error, index) => `Attempt ${index + 1}: ${error.message}`)\n .join('. ');\n\n super(\n `Step \"${stepName}\" failed after ${maxAttempts + 1} attempts. ${formattedErrors}`,\n 'max_retries_exceeded',\n );\n\n this.attemptErrors = errors;\n this.stepName = stepName;\n this.maxAttempts = maxAttempts;\n }\n}\n\nexport class SerializationError extends BaseError {\n constructor(message: string) {\n super(message, 'serialization_error');\n }\n}\n\nexport class WorkflowNotFoundError extends BaseError {\n constructor(workflowName: string) {\n super(`Workflow \"${workflowName}\" not found`, 'workflow_not_found');\n }\n}\n","export type RunStatus =\n | 'pending'\n | 'queued'\n | 'success'\n | 'error'\n | 'cancelled'\n | 'max_recovery_attempts_exceeded';\n\nexport const TERMINAL_STATES: RunStatus[] = [\n 'success',\n 'error',\n 'cancelled',\n 'max_recovery_attempts_exceeded',\n];\n\nexport type WorkflowFunction<Args extends unknown[], R> = (...args: Args) => Promise<R> | R;\n\nexport type WorkflowDefinition<TArgs extends unknown[] = unknown[], TReturn = unknown> = {\n fn: WorkflowFunction<TArgs, TReturn>;\n maxRecoveryAttempts?: number;\n};\n\nexport function defineWorkflow<TArgs extends unknown[], TReturn>(\n fn: WorkflowFunction<TArgs, TReturn>,\n options: {\n maxRecoveryAttempts?: number;\n } = {},\n): WorkflowDefinition<TArgs, TReturn> {\n return {\n fn,\n maxRecoveryAttempts: options.maxRecoveryAttempts,\n };\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { sleep } from '../utils/sleep';\n\n// Error detection helpers\ntype AnyErr = {\n code?: string;\n errno?: number;\n message?: string;\n stack?: string;\n cause?: unknown;\n};\n\n// PostgreSQL SQLSTATE error classes that are safe to retry\n// https://www.postgresql.org/docs/current/errcodes-appendix.html\nconst RETRY_SQLSTATE_PREFIXES = new Set([\n '08', // Connection Exception\n '40', // Transaction Rollback (deadlock_detected, serialization_failure)\n '53', // Insufficient Resources\n '55', // Object Not In Prerequisite State (lock_not_available)\n '57', // Operator Intervention (admin_shutdown, cannot_connect_now)\n]);\n\nconst RETRY_SQLSTATE_CODES = new Set([\n '40003', // statement_completion_unknown\n '40001', // serialization_failure\n '40P01', // deadlock_detected\n '55P03', // lock_not_available\n]);\n\n// Node.js transient network error codes\nconst RETRY_NODE_ERRNOS = new Set([\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EHOSTUNREACH',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNABORTED',\n 'EPIPE',\n]);\n\nfunction isPgDatabaseError(e: AnyErr): boolean {\n return !!e && typeof e === 'object' && typeof e.code === 'string' && e.code.length === 5;\n}\n\nfunction sqlStateLooksRetryable(sqlstate: string | undefined): boolean {\n if (!sqlstate) return false;\n if (RETRY_SQLSTATE_CODES.has(sqlstate)) return true;\n const prefix = sqlstate.toString().slice(0, 2);\n return RETRY_SQLSTATE_PREFIXES.has(prefix);\n}\n\nfunction nodeErrnoLooksRetryable(e: AnyErr): boolean {\n const code = e.code;\n return !!code && RETRY_NODE_ERRNOS.has(code);\n}\n\nfunction messageLooksRetryable(msg: string): boolean {\n const m = msg.toLowerCase();\n return (\n msg.includes('ECONNREFUSED') ||\n msg.includes('ECONNRESET') ||\n m.includes('connection timeout') ||\n m.includes('server closed the connection') ||\n m.includes('connection terminated unexpectedly') ||\n m.includes('client has encountered a connection error') ||\n m.includes('timeout exceeded when trying to connect') ||\n m.includes('could not connect to server') ||\n m.includes('connection pool exhausted') ||\n m.includes('too many clients')\n );\n}\n\nfunction* unwrapErrors(e: unknown): Generator<unknown, void, void> {\n const queue: unknown[] = [e];\n const seen = new Set<unknown>();\n\n while (queue.length) {\n const cur = queue.shift()!;\n if (cur && typeof cur === 'object') {\n if (seen.has(cur)) continue;\n seen.add(cur);\n\n // AggregateError\n const ae = cur as { errors?: unknown[] };\n if (Array.isArray(ae.errors)) queue.push(...ae.errors);\n\n // Error cause chain\n const withCause = cur as { cause?: unknown };\n if (withCause.cause) queue.push(withCause.cause);\n\n // Wrapped errors\n const wrapped = cur as { error?: unknown };\n if (wrapped.error) queue.push(wrapped.error);\n }\n yield cur;\n }\n}\n\nfunction isRetriableDBError(err: unknown): boolean {\n for (const e of unwrapErrors(err)) {\n const anyErr = e as AnyErr;\n\n // Check PostgreSQL SQLSTATE codes\n if (isPgDatabaseError(anyErr) && sqlStateLooksRetryable(anyErr.code)) {\n return true;\n }\n\n // Check Node.js system errors\n if (nodeErrnoLooksRetryable(anyErr)) {\n return true;\n }\n\n // Check error messages\n if (e instanceof Error) {\n if (e.stack && messageLooksRetryable(e.stack)) return true;\n if (e.message && messageLooksRetryable(e.message)) return true;\n }\n if (messageLooksRetryable(String(e))) return true;\n }\n return false;\n}\n\n/**\n * Retry a function if it throws a retriable database error.\n * @param fn - The function to retry.\n * @param options - The options for the retry.\n * @param options.initialBackoffMs - The initial backoff time in milliseconds. Defaults to 1000.\n * @param options.maxBackoffMs - The maximum backoff time in milliseconds. Defaults to 60000.\n * @param options.onRetry - The callback to call when a retry is needed.\n * @returns The result of the function.\n */\nexport async function withDbRetry<T>(\n fn: () => Promise<T>,\n options: {\n initialBackoffMs?: number;\n maxBackoffMs?: number;\n onRetry?: (error: unknown, attempt: number, delayMs: number) => void;\n } = {},\n): Promise<T> {\n const { initialBackoffMs = 1000, maxBackoffMs = 60000, onRetry } = options;\n\n let attempt = 0;\n let backoffMs = initialBackoffMs;\n\n while (true) {\n try {\n return await fn();\n } catch (error) {\n if (!isRetriableDBError(error)) {\n // Not a retriable error - throw immediately\n throw error;\n }\n\n attempt++;\n\n // Calculate backoff with jitter (0.5x to 1.5x)\n const jitter = 0.5 + Math.random();\n const delayMs = Math.min(backoffMs * jitter, maxBackoffMs);\n\n // Log/callback\n if (onRetry) {\n onRetry(error, attempt, delayMs);\n } else {\n console.warn(\n `Database connection failed: ${error instanceof Error ? error.message : String(error)}. ` +\n `Retrying in ${(delayMs / 1000).toFixed(2)}s (attempt ${attempt})`,\n );\n }\n\n // Wait before retrying\n await sleep(delayMs);\n\n // Increase backoff for next attempt (exponential)\n backoffMs = Math.min(backoffMs * 2, maxBackoffMs);\n }\n }\n}\n","import { SerializationError } from '../errors';\nimport {\n serializeError as _serializeError,\n deserializeError as _deserializeError,\n} from 'serialize-error';\n\n/**\n * Serializes a value into a JSON string.\n */\nexport function serialize<T>(value: T): string {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n\n/**\n * Deserializes a JSON string into a value.\n */\nexport function deserialize<T>(value: string): T {\n try {\n return JSON.parse(value);\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n\n/**\n * Serializes an error object, preserving stack trace, message, name, and custom properties\n */\nexport function serializeError(error: Error): string {\n try {\n return JSON.stringify(_serializeError(error));\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n\n/**\n * Deserializes an error object, reconstructing it with stack trace and properties\n */\nexport function deserializeError(serialized: string): Error {\n try {\n return _deserializeError(JSON.parse(serialized));\n } catch (error) {\n throw new SerializationError((error as Error).message);\n }\n}\n","import { MessageEventBus } from '../events/message-event-bus';\nimport { OperationManager, OperationResult } from './operation-manager';\nimport { StateEventBus } from '../events/state-event-bus';\nimport { RunOutsideOfWorkflowError } from '../errors';\nimport { Database } from '../db/db';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { RunEventBus } from '../events/run-event-bus';\nimport { RunRegistry } from './run-registry';\nimport { QueueDefinition } from '@api/queue';\nimport { WorkflowDefinition } from '@api/workflow';\nimport { RuntimeContext } from './runtime-context';\n\nexport interface ExecutionContext {\n type: 'execution';\n runId: string;\n runPath: string[];\n executorId: string;\n abortSignal: AbortSignal;\n parentWorkflow?: ExecutionContext;\n operationManager: OperationManager;\n messageEventBus: MessageEventBus;\n stateEventBus: StateEventBus;\n runEventBus: RunEventBus;\n runRegistry: RunRegistry;\n queueRegistry: Record<string, QueueDefinition>;\n workflowsMap: Record<string, WorkflowDefinition<unknown[], unknown>>;\n db: Database;\n}\n\nexport function getExecutionContext(): ExecutionContext {\n const store = asyncLocalStorage.getStore();\n if (!store) {\n throw new RunOutsideOfWorkflowError();\n }\n return store;\n}\n\nexport const asyncLocalStorage = new AsyncLocalStorage<ExecutionContext>();\n\nexport function runWithExecutionContext<TReturn>(\n store: ExecutionContext,\n callback: () => Promise<TReturn>,\n) {\n return asyncLocalStorage.run(store, callback);\n}\n\ntype CreateExecutionContextParams = {\n ctx: RuntimeContext | ExecutionContext;\n abortSignal: AbortSignal;\n runId: string;\n runPath: string[];\n operations?: OperationResult[];\n};\n\nexport function createExecutionContext({\n ctx,\n abortSignal,\n runId,\n runPath,\n operations,\n}: CreateExecutionContextParams): ExecutionContext {\n return {\n type: 'execution',\n runId: runId,\n runPath: runPath,\n executorId: ctx.executorId,\n abortSignal: abortSignal,\n operationManager: new OperationManager(ctx.db, runId, operations || []),\n messageEventBus: ctx.messageEventBus,\n stateEventBus: ctx.stateEventBus,\n workflowsMap: ctx.workflowsMap,\n runEventBus: ctx.runEventBus,\n runRegistry: ctx.runRegistry,\n queueRegistry: ctx.queueRegistry,\n db: ctx.db,\n };\n}\n","import { RunStatus } from '@api/workflow';\nimport { Database } from '../db';\n\ninterface WorkflowResult {\n id: string;\n input?: string;\n output?: string;\n error?: string;\n status: RunStatus;\n name: string;\n queueName?: string;\n changeId: number;\n recoveryAttempts: number;\n}\n\nexport async function getRun(db: Database, runId: string): Promise<WorkflowResult | undefined> {\n const result = await db\n .selectFrom('runs')\n .select([\n 'id',\n 'inputs',\n 'output',\n 'error',\n 'status',\n 'change_id',\n 'recovery_attempts',\n 'workflow_name',\n ])\n .where('id', '=', runId)\n .executeTakeFirst();\n\n if (!result) {\n return undefined;\n }\n\n return {\n id: result.id,\n input: result.inputs ?? undefined,\n name: result.workflow_name,\n output: result.output ?? undefined,\n error: result.error ?? undefined,\n status: result.status as RunStatus,\n changeId: result.change_id,\n recoveryAttempts: Number(result.recovery_attempts ?? 0),\n };\n}\n","import { Database, Transaction } from '../db';\n\nexport async function insertOperation(\n tx: Transaction | Database,\n runId: string,\n operationName: string,\n sequenceId: number,\n result?: string,\n error?: string,\n) {\n await tx\n .insertInto('operations')\n .values({\n run_id: runId,\n name: operationName,\n sequence_id: sequenceId,\n output: result,\n error: error,\n })\n .execute();\n}\n","import { withDbRetry } from '../db/retry';\nimport { deserialize, deserializeError, serialize, serializeError } from '../utils/serialization';\nimport { getExecutionContext } from './execution-context';\nimport { RunCancelledError } from '../errors';\nimport { getRun } from '../db/queries/get-run';\nimport { insertOperation } from '../db/commands/insert-operation';\nimport { Database, Transaction } from '../db/db';\n\nexport interface OperationResult {\n result?: string;\n error?: string;\n}\n\nexport class OperationManager {\n private sequenceId = 0;\n private lastReservedSequenceId: number | null = null;\n constructor(\n private readonly db: Database,\n private readonly runId: string,\n // operations are stored in reverse order so the most recent operation is at the beginning of the array\n private readonly operations: OperationResult[] = [],\n ) {}\n\n getOperationResult(): OperationResult | null {\n const operation = this.operations.pop() as OperationResult;\n if (operation) {\n this.sequenceId++;\n return operation;\n }\n return null;\n }\n\n reserveSequenceId() {\n const reserved = this.sequenceId++;\n this.lastReservedSequenceId = reserved;\n return reserved;\n }\n\n getCurrentSequenceId() {\n return this.sequenceId;\n }\n\n /**\n * Gets the sequence ID that was most recently reserved for the current operation.\n * This is the ID that will be (or was) recorded in the database for this operation.\n * Returns null if no sequence ID has been reserved yet.\n */\n getActiveSequenceId(): number | null {\n return this.lastReservedSequenceId;\n }\n\n async recordResult(\n operationName: string,\n sequenceId: number,\n result: string | null,\n tx?: Transaction,\n ) {\n if (tx) {\n await insertOperation(tx, this.runId, operationName, sequenceId, result ?? undefined);\n } else {\n await withDbRetry(async () => {\n await insertOperation(this.db, this.runId, operationName, sequenceId, result ?? undefined);\n });\n }\n }\n\n async recordError(\n operationName: string,\n sequenceId: number,\n error: string | null,\n tx?: Transaction,\n ) {\n if (tx) {\n await insertOperation(\n tx,\n this.runId,\n operationName,\n sequenceId,\n undefined,\n error ?? undefined,\n );\n } else {\n await withDbRetry(async () => {\n await insertOperation(\n this.db,\n this.runId,\n operationName,\n sequenceId,\n undefined,\n error ?? undefined,\n );\n });\n }\n }\n}\n\nexport function returnOrThrowOperationResult<T = void>(\n op: OperationResult,\n): T extends void ? void : T {\n if (op.error) {\n throw deserializeError(op.error);\n }\n\n if (op.result === null || op.result === undefined) {\n return undefined as T extends void ? void : T;\n }\n\n return deserialize(op.result) as T extends void ? void : T;\n}\n\nexport async function executeAndRecordOperation<T>(\n operationManager: OperationManager,\n operationName: string,\n callback: () => Promise<T>,\n): Promise<T> {\n const seqId = operationManager.reserveSequenceId();\n try {\n const result = await callback();\n const serializedResult = serialize(result);\n await checkCancellation();\n await operationManager.recordResult(operationName, seqId, serializedResult);\n return result;\n } catch (error) {\n if (error instanceof RunCancelledError) {\n throw error;\n }\n const err = error instanceof Error ? error : new Error(String(error));\n await operationManager.recordError(operationName, seqId, serializeError(err));\n throw error;\n }\n}\n\nasync function checkCancellation() {\n const { abortSignal, runId, db } = getExecutionContext();\n if (abortSignal.aborted) {\n throw new RunCancelledError();\n }\n const run = await withDbRetry(async () => getRun(db, runId));\n if (run?.status === 'cancelled') {\n throw new RunCancelledError();\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { R as RunStatus, W as WorkflowDefinition, Q as QueueDefinition, a as WorkflowSignature, M as MessageDefinition, S as StateDefinition } from './state-DygxhGtl.js';
1
+ import { R as RunStatus, W as WorkflowDefinition, Q as QueueDefinition, M as MessageDefinition, S as StateDefinition } from './state-B6QkOxSb.js';
2
2
 
3
3
  declare enum ErrorType {
4
4
  INVALID_WORKFLOW_TRANSITION = "INVALID_WORKFLOW_TRANSITION",
@@ -95,79 +95,39 @@ type CreateInstanceOptions = {
95
95
  instanceId?: string;
96
96
  connectionString: string;
97
97
  };
98
- type createExecutorParams<TWorkflows extends Array<WorkflowDefinition<unknown[], unknown>>, TQueues extends Array<QueueDefinition>> = {
98
+ type createWorkerParams<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>, TQueues extends Record<string, QueueDefinition>> = {
99
99
  workflows: TWorkflows;
100
100
  queues?: TQueues;
101
101
  options: CreateInstanceOptions;
102
102
  };
103
- type ExtractNames<T extends readonly {
104
- name: string;
105
- }[]> = T[number]['name'];
106
- interface WorkflowOperations<TWorkflows extends readonly WorkflowSignature<unknown[], unknown>[], TQueues extends readonly QueueDefinition[]> {
107
- queueWorkflow<TQueue extends Extract<TQueues[number], {
108
- name: ExtractNames<TQueues>;
109
- }> = Extract<TQueues[number], {
110
- name: ExtractNames<TQueues>;
111
- }>, TWorkflow extends Extract<TWorkflows[number], {
112
- name: ExtractNames<TWorkflows>;
113
- }> = Extract<TWorkflows[number], {
114
- name: ExtractNames<TWorkflows>;
115
- }>, TArgs extends unknown[] = TWorkflow extends WorkflowSignature<infer A extends unknown[], unknown> ? A : never, TReturn = TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>(queue: TQueue, wf: TWorkflow, args: TArgs, options?: QueueWorkflowOptions): Promise<Run<TReturn>>;
116
- queueWorkflow<QK extends ExtractNames<TQueues>, WK extends ExtractNames<TWorkflows>, TWorkflow extends Extract<TWorkflows[number], {
117
- name: WK;
118
- }> = Extract<TWorkflows[number], {
119
- name: WK;
120
- }>, TReturn = TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>(queue: QK, wf: WK, options: QueueWorkflowOptions): Promise<Run<TReturn>>;
121
- queueWorkflow<QK extends ExtractNames<TQueues>, WK extends ExtractNames<TWorkflows>, TWorkflow extends Extract<TWorkflows[number], {
122
- name: WK;
123
- }> = Extract<TWorkflows[number], {
124
- name: WK;
125
- }>, TReturn = TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>(queue: QK, wf: WK): Promise<Run<TReturn>>;
103
+ interface WorkflowOperations<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>, TQueues extends Record<string, QueueDefinition>> {
104
+ queueWorkflow<QName extends keyof TQueues, WName extends keyof TWorkflows, TArgs extends unknown[] = TWorkflows[WName] extends WorkflowDefinition<infer A extends unknown[], unknown> ? A : never, TReturn = TWorkflows[WName] extends WorkflowDefinition<unknown[], infer R> ? R : never>(queueName: QName, workflowName: WName, args: TArgs, options?: QueueWorkflowOptions): Promise<Run<TReturn>>;
105
+ queueWorkflow<QName extends keyof TQueues, WName extends keyof TWorkflows, TReturn = TWorkflows[WName] extends WorkflowDefinition<unknown[], infer R> ? R : never>(queueName: QName, workflowName: WName, options: QueueWorkflowOptions): Promise<Run<TReturn>>;
106
+ queueWorkflow<QName extends keyof TQueues, WName extends keyof TWorkflows, TReturn = TWorkflows[WName] extends WorkflowDefinition<unknown[], infer R> ? R : never>(queueName: QName, workflowName: WName): Promise<Run<TReturn>>;
126
107
  cancelRun(runId: string): Promise<void>;
127
108
  resumeRun(runId: string): Promise<void>;
128
- getRun<TWorkflow extends WorkflowSignature<unknown[], unknown>>(runId: string): Promise<Run<TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>>;
109
+ getRun<TWorkflow extends WorkflowDefinition<unknown[], unknown>>(runId: string): Promise<Run<TWorkflow extends WorkflowDefinition<unknown[], infer R> ? R : never>>;
129
110
  getRun<TReturn>(runId: string): Promise<Run<TReturn>>;
130
111
  getRunStatus(runId: string): Promise<string>;
131
- waitForRunResult<TWorkflow extends WorkflowSignature<unknown[], unknown>>(runId: string): Promise<RunResult<TWorkflow extends WorkflowSignature<unknown[], infer R> ? R : never>>;
112
+ waitForRunResult<TWorkflow extends WorkflowDefinition<unknown[], unknown>>(runId: string): Promise<RunResult<TWorkflow extends WorkflowDefinition<unknown[], infer R> ? R : never>>;
132
113
  waitForRunResult<TReturn>(runId: string): Promise<RunResult<TReturn>>;
133
114
  sendMessage<T>(target: Run | string, name: MessageDefinition<T>, data: T): Promise<void>;
134
115
  getState<T>(target: Run | string, key: StateDefinition<T> | string): Promise<T | undefined>;
135
116
  }
136
- interface Executor<TWorkflows extends Array<WorkflowDefinition<unknown[], unknown>>, TQueues extends Array<QueueDefinition>> extends WorkflowOperations<TWorkflows, TQueues> {
137
- runWorkflow<TWorkflow extends WorkflowDefinition<any[], any> & {
138
- name: ExtractNames<TWorkflows>;
139
- }, TReturn = TWorkflow extends WorkflowDefinition<any[], infer R> ? R : never>(wf: TWorkflow): Promise<Run<TReturn>>;
140
- runWorkflow<TWorkflow extends WorkflowDefinition<any[], any> & {
141
- name: ExtractNames<TWorkflows>;
142
- }, TReturn = TWorkflow extends WorkflowDefinition<any[], infer R> ? R : never>(wf: TWorkflow, options: RunWorkflowOptions): Promise<Run<TReturn>>;
143
- runWorkflow<TWorkflow extends WorkflowDefinition<any[], any> & {
144
- name: ExtractNames<TWorkflows>;
145
- }, TArgs extends any[] = TWorkflow extends WorkflowDefinition<infer A extends unknown[], unknown> ? A : never, TReturn = TWorkflow extends WorkflowDefinition<any[], infer R> ? R : never>(wf: TWorkflow, args: TArgs, options?: RunWorkflowOptions): Promise<Run<TReturn>>;
146
- }
147
- declare function createExecutor<TWorkflows extends Array<WorkflowDefinition<any[], any>>, TQueues extends Array<QueueDefinition>>(props: createExecutorParams<TWorkflows, TQueues>): Executor<TWorkflows, TQueues>;
148
- type Instance = ReturnType<typeof createExecutor>;
149
-
150
- type ExtractWorkflows<T> = T extends Executor<infer W, any> ? W : never;
151
- type ExtractQueues<T> = T extends Executor<any, infer Q> ? Q : never;
152
- type QueuesProxy<TQueues extends Record<string, QueueDefinition>> = {
153
- [K in keyof TQueues]: {
154
- name: K;
155
- definition: TQueues[K];
156
- };
157
- };
158
- type WorkflowsProxy<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>> = {
159
- [K in keyof TWorkflows]: {
160
- name: K;
161
- definition: TWorkflows[K];
162
- };
163
- };
164
- interface Client<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>, TQueues extends Record<string, QueueDefinition>> extends WorkflowOperations<ExtractWorkflows<TWorkflows>, ExtractQueues<TQueues>> {
165
- workflows: WorkflowsProxy<TWorkflows>;
166
- queues: QueuesProxy<TQueues>;
117
+ interface Worker<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>, TQueues extends Record<string, QueueDefinition>> extends WorkflowOperations<TWorkflows, TQueues> {
118
+ runWorkflow<WName extends keyof TWorkflows, TArgs extends unknown[] = TWorkflows[WName] extends WorkflowDefinition<infer A extends unknown[], unknown> ? A : never, TReturn = TWorkflows[WName] extends WorkflowDefinition<unknown[], infer R> ? R : never>(workflowName: WName, args: TArgs, options?: RunWorkflowOptions): Promise<Run<TReturn>>;
119
+ runWorkflow<WName extends keyof TWorkflows, TReturn = TWorkflows[WName] extends WorkflowDefinition<unknown[], infer R> ? R : never>(workflowName: WName, options: RunWorkflowOptions): Promise<Run<TReturn>>;
120
+ runWorkflow<WName extends keyof TWorkflows, TReturn = TWorkflows[WName] extends WorkflowDefinition<unknown[], infer R> ? R : never>(workflowName: WName): Promise<Run<TReturn>>;
167
121
  }
122
+ declare function createWorker<TWorkflows extends Record<string, WorkflowDefinition<any[], any>>, TQueues extends Record<string, QueueDefinition>>(props: createWorkerParams<TWorkflows, TQueues>): Worker<TWorkflows, TQueues>;
123
+ type Instance = ReturnType<typeof createWorker>;
124
+
125
+ type ExtractWorkflows<T> = T extends Worker<infer W, any> ? W : never;
126
+ type ExtractQueues<T> = T extends Worker<any, infer Q> ? Q : never;
127
+ type Client<TWorkflows extends Record<string, WorkflowDefinition<unknown[], unknown>>, TQueues extends Record<string, QueueDefinition>> = WorkflowOperations<TWorkflows, TQueues>;
168
128
  type ClientOptions = {
169
129
  connectionString: string;
170
130
  };
171
- declare function createClient<TExecutor extends Executor<any, any>>(options: ClientOptions): Client<ExtractWorkflows<TExecutor>, ExtractQueues<TExecutor>>;
131
+ declare function createClient<TExecutor extends Worker<any, any>>(options: ClientOptions): Client<ExtractWorkflows<TExecutor>, ExtractQueues<TExecutor>>;
172
132
 
173
- export { BaseError, type ErrorReason, ErrorType, type Executor, FatalError, type Instance, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, OperationTimedOutError, RunCancelledError, RunDeadlineExceededError, RunNotFoundError, RunOutsideOfWorkflowError, RunTimedOutError, SerializationError, UnknownError, WorkflowNotFoundError, type WorkflowOperations, createClient, createExecutor, type createExecutorParams };
133
+ export { BaseError, type ErrorReason, ErrorType, FatalError, type Instance, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, OperationTimedOutError, RunCancelledError, RunDeadlineExceededError, RunNotFoundError, RunOutsideOfWorkflowError, RunTimedOutError, SerializationError, UnknownError, type Worker, WorkflowNotFoundError, type WorkflowOperations, createClient, createWorker, type createWorkerParams };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { withDbRetry, getRun, deserialize, returnOrThrowOperationResult, executeAndRecordOperation, serialize, deserializeError, WorkflowNotFoundError, createExecutionContext, runWithExecutionContext, RunCancelledError, serializeError, MaxRecoveryAttemptsExceededError, RunNotFoundError, TERMINAL_STATES, UnknownError, getExecutionContext, RunTimedOutError, RunDeadlineExceededError } from './chunk-HRDI7EOY.js';
2
- export { BaseError, ErrorType, FatalError, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, OperationTimedOutError, RunCancelledError, RunDeadlineExceededError, RunNotFoundError, RunOutsideOfWorkflowError, RunTimedOutError, SerializationError, UnknownError, WorkflowNotFoundError } from './chunk-HRDI7EOY.js';
1
+ import { withDbRetry, getRun, deserialize, returnOrThrowOperationResult, executeAndRecordOperation, serialize, deserializeError, WorkflowNotFoundError, createExecutionContext, runWithExecutionContext, RunCancelledError, serializeError, MaxRecoveryAttemptsExceededError, RunNotFoundError, TERMINAL_STATES, UnknownError, getExecutionContext, RunTimedOutError, RunDeadlineExceededError } from './chunk-6L2Y7WUY.js';
2
+ export { BaseError, ErrorType, FatalError, MaxRecoveryAttemptsExceededError, MaxRetriesExceededError, OperationTimedOutError, RunCancelledError, RunDeadlineExceededError, RunNotFoundError, RunOutsideOfWorkflowError, RunTimedOutError, SerializationError, UnknownError, WorkflowNotFoundError } from './chunk-6L2Y7WUY.js';
3
3
  import crypto from 'crypto';
4
4
  import { Kysely, PostgresDialect, sql } from 'kysely';
5
5
  import { Pool } from 'pg';
@@ -557,11 +557,11 @@ async function insertPendingRun(db, options) {
557
557
  }
558
558
 
559
559
  // src/internal/run-workflow.ts
560
- async function runWorkflow(ctx, wf, args = [], options = {}) {
560
+ async function runWorkflow(ctx, workflowName, args = [], options = {}) {
561
561
  const { db, executorId, workflowsMap, type } = ctx;
562
- const workflow = workflowsMap[wf];
562
+ const workflow = workflowsMap[workflowName];
563
563
  if (!workflow) {
564
- throw new WorkflowNotFoundError(wf);
564
+ throw new WorkflowNotFoundError(workflowName);
565
565
  }
566
566
  const newRunId = options.id ?? crypto.randomUUID();
567
567
  let newRunPath = [];
@@ -579,7 +579,7 @@ async function runWorkflow(ctx, wf, args = [], options = {}) {
579
579
  const newRun2 = {
580
580
  runId: newRunId,
581
581
  runPath: [...runPath, newRunId],
582
- workflowName: workflow.name
582
+ workflowName
583
583
  };
584
584
  withDbRetry(async () => {
585
585
  return await insertPendingRun(db, {
@@ -599,14 +599,13 @@ async function runWorkflow(ctx, wf, args = [], options = {}) {
599
599
  path: [newRunId],
600
600
  inputs: serialize(args),
601
601
  executorId,
602
- workflowName: workflow.name
602
+ workflowName
603
603
  });
604
604
  newRunPath = path;
605
605
  }
606
606
  await executeWorkflow(ctx, {
607
607
  runId: newRunId,
608
608
  runPath: newRunPath,
609
- workflowName: workflow.name,
610
609
  fn: workflow.fn,
611
610
  args,
612
611
  options
@@ -1092,13 +1091,13 @@ var QueueManager = class {
1092
1091
  constructor(ctx) {
1093
1092
  this.ctx = ctx;
1094
1093
  this.pollingLoop = new PollingLoop(POLLING_INTERVAL_MS, this.handlePoll.bind(this));
1095
- this.queues = this.ctx.queueRegistry;
1094
+ this.queues = ctx.queueRegistry;
1096
1095
  }
1097
1096
  pollingLoop;
1098
1097
  queues;
1099
1098
  async handlePoll() {
1100
- for (const queue of this.queues) {
1101
- await this.dispatch(queue.name, queue);
1099
+ for (const [queueName, queue] of Object.entries(this.queues)) {
1100
+ await this.dispatch(queueName, queue);
1102
1101
  }
1103
1102
  }
1104
1103
  async dispatch(queueName, queue) {
@@ -1329,15 +1328,15 @@ async function waitForStateNotification(stateEventBus, runId, key) {
1329
1328
  });
1330
1329
  }
1331
1330
 
1332
- // src/main/executor/executor.ts
1333
- function createExecutor(props) {
1331
+ // src/main/worker/worker.ts
1332
+ function createWorker(props) {
1334
1333
  const { db, client } = createPgDriver({ connectionString: props.options.connectionString });
1335
1334
  const messageEventBus = new MessageEventBus(db);
1336
1335
  const stateEventBus = new StateEventBus(db);
1337
1336
  const executorId = props.options.instanceId || crypto.randomUUID();
1338
1337
  const runRegistry = new RunRegistry();
1339
1338
  const runEventBus = new RunEventBus(db);
1340
- const workflowsMap = Object.fromEntries(props.workflows.map((w) => [w.name, w]));
1339
+ const workflowsMap = props.workflows;
1341
1340
  const runtimeContext = {
1342
1341
  type: "runtime",
1343
1342
  db,
@@ -1346,7 +1345,7 @@ function createExecutor(props) {
1346
1345
  stateEventBus,
1347
1346
  runRegistry,
1348
1347
  workflowsMap,
1349
- queueRegistry: props.queues || [],
1348
+ queueRegistry: props.queues || {},
1350
1349
  runEventBus
1351
1350
  };
1352
1351
  const notifySetupPromise = setupPostgresNotify(client, {
@@ -1358,7 +1357,7 @@ function createExecutor(props) {
1358
1357
  queueManager.start();
1359
1358
  recoverPendingRuns(runtimeContext);
1360
1359
  return {
1361
- runWorkflow: async (wf, argsOrOptions, options) => {
1360
+ runWorkflow: async (workflowName, argsOrOptions, options) => {
1362
1361
  await notifySetupPromise;
1363
1362
  let args, opts;
1364
1363
  if (argsOrOptions !== void 0) {
@@ -1369,9 +1368,9 @@ function createExecutor(props) {
1369
1368
  opts = argsOrOptions;
1370
1369
  }
1371
1370
  }
1372
- return runWorkflow(runtimeContext, wf.name, args, opts);
1371
+ return runWorkflow(runtimeContext, workflowName, args, opts);
1373
1372
  },
1374
- queueWorkflow: async (queue, wf, argsOrOptions, options) => {
1373
+ queueWorkflow: async (queueName, workflowName, argsOrOptions, options) => {
1375
1374
  await notifySetupPromise;
1376
1375
  let args, opts;
1377
1376
  if (argsOrOptions !== void 0) {
@@ -1382,7 +1381,7 @@ function createExecutor(props) {
1382
1381
  opts = argsOrOptions;
1383
1382
  }
1384
1383
  }
1385
- return queueWorkflow(runtimeContext, queue.name, wf.name, args, opts);
1384
+ return queueWorkflow(runtimeContext, queueName, workflowName, args, opts);
1386
1385
  },
1387
1386
  getRun: async (runId) => {
1388
1387
  await notifySetupPromise;
@@ -1424,28 +1423,19 @@ function createClient(options) {
1424
1423
  state: stateEventBus.handleNotify.bind(stateEventBus),
1425
1424
  messages: messageEventBus.handleNotify.bind(messageEventBus)
1426
1425
  });
1427
- const workflows = new Proxy({}, {
1428
- get(_target, prop) {
1429
- return {
1430
- name: prop
1431
- // Could include type metadata if needed
1432
- };
1433
- }
1434
- });
1435
- const queues = new Proxy({}, {
1436
- get(_target, prop) {
1437
- return {
1438
- name: prop
1439
- // Could include type metadata if needed
1440
- };
1441
- }
1442
- });
1443
1426
  return {
1444
- workflows,
1445
- queues,
1446
- queueWorkflow: async (queue, wf, args, options2) => {
1427
+ queueWorkflow: async (queueName, workflowName, argsOrOptions, options2) => {
1447
1428
  await notifySetupPromise;
1448
- return queueWorkflow(clientContext, queue.name, wf.name, args, options2);
1429
+ let args, opts;
1430
+ if (argsOrOptions !== void 0) {
1431
+ if (Array.isArray(argsOrOptions)) {
1432
+ args = argsOrOptions;
1433
+ opts = options2;
1434
+ } else {
1435
+ opts = argsOrOptions;
1436
+ }
1437
+ }
1438
+ return queueWorkflow(clientContext, queueName, workflowName, args, opts);
1449
1439
  },
1450
1440
  cancelRun: async (runId) => cancelRun2(clientContext, runId),
1451
1441
  resumeRun: async (runId) => resumeRun2(clientContext, runId),
@@ -1466,6 +1456,6 @@ function createClient(options) {
1466
1456
  };
1467
1457
  }
1468
1458
 
1469
- export { createClient, createExecutor };
1459
+ export { createClient, createWorker };
1470
1460
  //# sourceMappingURL=index.js.map
1471
1461
  //# sourceMappingURL=index.js.map