pg-workflows 0.13.0 → 0.13.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/index.cjs CHANGED
@@ -1129,6 +1129,7 @@ class WorkflowEngine {
1129
1129
  for (const workflow2 of this.unregisteredWorkflows.values()) {
1130
1130
  await this.registerWorkflow(workflow2);
1131
1131
  }
1132
+ this.unregisteredWorkflows.clear();
1132
1133
  }
1133
1134
  const mainQueueOptions = {
1134
1135
  retryLimit: 0,
@@ -2452,5 +2453,5 @@ function otelPlugin(options = {}) {
2452
2453
  };
2453
2454
  }
2454
2455
 
2455
- //# debugId=12905C6BC12C3A1664756E2164756E21
2456
+ //# debugId=5C1D7E8675006E9B64756E2164756E21
2456
2457
  //# sourceMappingURL=index.js.map
package/dist/index.js CHANGED
@@ -243,6 +243,7 @@ class WorkflowEngine {
243
243
  for (const workflow2 of this.unregisteredWorkflows.values()) {
244
244
  await this.registerWorkflow(workflow2);
245
245
  }
246
+ this.unregisteredWorkflows.clear();
246
247
  }
247
248
  const mainQueueOptions = {
248
249
  retryLimit: 0,
@@ -1580,5 +1581,5 @@ export {
1580
1581
  WorkflowClient
1581
1582
  };
1582
1583
 
1583
- //# debugId=5BC543336A07527964756E2164756E21
1584
+ //# debugId=C2CB4B181900270764756E2164756E21
1584
1585
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -9,13 +9,13 @@
9
9
  "import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { MAX_RESOURCE_ID_LENGTH, MAX_WORKFLOW_ID_LENGTH } from './constants';\n\nexport function validateWorkflowId(workflowId: string): void {\n if (workflowId.length > MAX_WORKFLOW_ID_LENGTH) {\n throw new WorkflowEngineError(\n `workflowId exceeds maximum length of ${MAX_WORKFLOW_ID_LENGTH} characters (got ${workflowId.length})`,\n workflowId,\n );\n }\n}\n\nexport function validateResourceId(resourceId: string | undefined | null): void {\n if (resourceId != null && resourceId.length > MAX_RESOURCE_ID_LENGTH) {\n throw new WorkflowEngineError(\n `resourceId exceeds maximum length of ${MAX_RESOURCE_ID_LENGTH} characters (got ${resourceId.length})`,\n );\n }\n}\n\nexport class WorkflowEngineError extends Error {\n constructor(\n message: string,\n public readonly workflowId?: string,\n public readonly runId?: string,\n public override readonly cause: Error | undefined = undefined,\n public readonly issues?: StandardSchemaV1.FailureResult['issues'] | undefined,\n ) {\n super(message);\n this.name = 'WorkflowEngineError';\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WorkflowEngineError);\n }\n }\n}\n\nexport class WorkflowRunNotFoundError extends WorkflowEngineError {\n constructor(runId?: string, workflowId?: string) {\n super('Workflow run not found', workflowId, runId);\n this.name = 'WorkflowRunNotFoundError';\n }\n}\n",
10
10
  "import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { WorkflowRun } from './db/types';\nimport type { Duration } from './duration';\nimport type { Schedule } from './schedule';\n\nexport enum WorkflowStatus {\n PENDING = 'pending',\n RUNNING = 'running',\n PAUSED = 'paused',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n}\n\nexport enum StepType {\n PAUSE = 'pause',\n RUN = 'run',\n WAIT_FOR = 'waitFor',\n WAIT_UNTIL = 'waitUntil',\n DELAY = 'delay',\n POLL = 'poll',\n INVOKE_CHILD_WORKFLOW = 'invokeChildWorkflow',\n}\n\nexport type InputParameters = StandardSchemaV1;\nexport type InferInputParameters<P extends InputParameters> = StandardSchemaV1.InferOutput<P>;\n\nexport type StartWorkflowOptions = {\n resourceId?: string;\n timeout?: number;\n retries?: number;\n expireInSeconds?: number;\n idempotencyKey?: string;\n};\n\nexport type WorkflowOptions<I extends InputParameters> = {\n timeout?: number;\n retries?: number;\n inputSchema?: I;\n /**\n * Recurring schedule. Accepts a cron expression (`'0 9 * * 1-5'`),\n * a duration string (`'5m'`, `'1 hour'`), or a `DurationObject`.\n */\n schedule?: Schedule;\n /** IANA timezone for cron expressions. Defaults to UTC. Ignored for duration-based schedules. */\n timezone?: string;\n};\n\n/** Metadata about a scheduled fire, exposed on `ctx.schedule` for runs triggered by a schedule. */\nexport type ScheduleContext = {\n /** Time the schedule fired this run. */\n timestamp: Date;\n};\n\nexport type StepBaseContext = {\n run: <T>(stepId: string, handler: () => Promise<T>) => Promise<T>;\n waitFor: {\n <T extends InputParameters>(\n stepId: string,\n options: { eventName: string; schema?: T },\n ): Promise<InferInputParameters<T>>;\n <T extends InputParameters>(\n stepId: string,\n options: { eventName: string; timeout: number; schema?: T },\n ): Promise<InferInputParameters<T> | undefined>;\n };\n waitUntil: {\n (stepId: string, date: Date): Promise<void>;\n (stepId: string, dateString: string): Promise<void>;\n (stepId: string, options: { date: Date | string }): Promise<void>;\n };\n /** Delay execution for a duration (sugar over waitUntil). Alias: sleep. */\n delay: (stepId: string, duration: Duration) => Promise<void>;\n /** Alias for delay. */\n sleep: (stepId: string, duration: Duration) => Promise<void>;\n pause: (stepId: string) => Promise<void>;\n poll: <T>(\n stepId: string,\n conditionFn: () => Promise<T | false>,\n options?: { interval?: Duration; timeout?: Duration },\n ) => Promise<{ timedOut: false; data: T } | { timedOut: true }>;\n /**\n * Invoke a child workflow from inside the current workflow and pause until\n * the child run reaches a terminal state.\n */\n invokeChildWorkflow: {\n <TInput extends InputParameters, TOutput = unknown>(\n stepId: string,\n ref: WorkflowRef<TInput, TOutput>,\n input: InferInputParameters<TInput>,\n options?: StartWorkflowOptions,\n ): Promise<TOutput>;\n <TOutput = unknown>(\n stepId: string,\n params: {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n ): Promise<TOutput>;\n };\n};\n\n/**\n * Plugin that extends the workflow step API with extra methods.\n * @template TStepBase - The step type this plugin receives (base + previous plugins).\n * @template TStepExt - The extra methods this plugin adds to step.\n */\nexport interface WorkflowPlugin<TStepBase = StepBaseContext, TStepExt = object> {\n name: string;\n methods: (step: TStepBase, context: WorkflowContext) => TStepExt;\n /**\n * Optional middleware around the workflow handler call. Composes in\n * registration order — the first plugin passed to `.use()` wraps everything\n * inside. Implementations MUST call `next()` exactly once.\n */\n wrap?: (context: WorkflowContext, next: () => Promise<unknown>) => Promise<unknown>;\n}\n\nexport type WorkflowContext<\n TInput extends InputParameters = InputParameters,\n TStep extends StepBaseContext = StepBaseContext,\n> = {\n input: InferInputParameters<TInput>;\n step: TStep;\n workflowId: string;\n runId: string;\n /** Tenant/scope identifier set when the run was started, if any. */\n resourceId?: string;\n /** Zero-based retry attempt number (= `run.retryCount`). */\n attempt: number;\n timeline: Record<string, unknown>;\n logger: WorkflowLogger;\n /** Set only for runs triggered by a recurring schedule. */\n schedule?: ScheduleContext;\n};\n\nexport type WorkflowDefinition<TInput extends InputParameters = InputParameters> = {\n id: string;\n /** Widest context avoids contravariance when collecting definitions; `workflow()` still types the handler narrowly. */\n handler: (context: WorkflowContext<InputParameters, StepBaseContext>) => Promise<unknown>;\n inputSchema?: TInput;\n timeout?: number; // milliseconds\n retries?: number;\n schedule?: Schedule;\n timezone?: string;\n plugins?: WorkflowPlugin[];\n};\n\nexport type StepInternalDefinition = {\n id: string;\n type: StepType;\n conditional: boolean;\n loop: boolean;\n isDynamic: boolean;\n};\n\nexport type WorkflowInternalDefinition<TInput extends InputParameters = InputParameters> =\n WorkflowDefinition<TInput> & {\n steps: StepInternalDefinition[];\n };\n\n/**\n * Chainable workflow factory: call as (id, handler, options) and/or use .use(plugin).\n * TStepExt is the accumulated step extension from all plugins (step = StepContext & TStepExt).\n */\nexport interface WorkflowFactory<TStepExt = object> {\n <I extends InputParameters = InputParameters>(\n id: string,\n handler: (context: WorkflowContext<I, StepBaseContext & TStepExt>) => Promise<unknown>,\n options?: WorkflowOptions<I>,\n ): WorkflowDefinition<I>;\n use<TNewExt>(\n plugin: WorkflowPlugin<StepBaseContext & TStepExt, TNewExt>,\n ): WorkflowFactory<TStepExt & TNewExt>;\n ref<TInput extends InputParameters = InputParameters, TOutput = unknown>(\n id: string,\n options?: { inputSchema?: TInput },\n ): WorkflowRef<TInput, TOutput>;\n}\n\n/**\n * Lightweight workflow reference - carries the workflow ID and input type\n * but no handler code. Safe to import in API services without pulling in\n * heavy worker dependencies.\n *\n * Callable: pass a handler to create a full WorkflowDefinition.\n */\nexport interface WorkflowRef<\n TInput extends InputParameters = InputParameters,\n // biome-ignore lint/correctness/noUnusedVariables: phantom type carried for typed return inference\n TOutput = unknown,\n> {\n (\n handler: (context: WorkflowContext<TInput, StepBaseContext>) => Promise<unknown>,\n options?: Omit<WorkflowOptions<TInput>, 'inputSchema'>,\n ): WorkflowDefinition<TInput>;\n readonly id: string;\n readonly inputSchema?: TInput;\n}\n\nexport type WorkflowRunProgress = WorkflowRun & {\n completionPercentage: number;\n totalSteps: number;\n completedSteps: number;\n};\n\nexport interface WorkflowLogger {\n log(message: string): void;\n error(message: string, ...args: unknown[]): void;\n}\n\nexport type WorkflowInternalLoggerContext = {\n runId?: string;\n workflowId?: string;\n};\nexport interface WorkflowInternalLogger {\n log(message: string, context?: WorkflowInternalLoggerContext): void;\n error(message: string, error: Error, context?: WorkflowInternalLoggerContext): void;\n}\n",
11
11
  "import type {\n InputParameters,\n StepBaseContext,\n WorkflowContext,\n WorkflowDefinition,\n WorkflowFactory,\n WorkflowOptions,\n WorkflowPlugin,\n WorkflowRef,\n} from './types';\n\n/**\n * Create a lightweight workflow reference.\n * Safe to import from `pg-workflows/client` - no engine or handler code.\n */\nexport function createWorkflowRef<\n TOutput = unknown,\n TInput extends InputParameters = InputParameters,\n>(id: string, options?: { inputSchema?: TInput }): WorkflowRef<TInput, TOutput> {\n const ref = ((\n handler: (context: WorkflowContext<TInput, StepBaseContext>) => Promise<unknown>,\n defineOptions?: Omit<WorkflowOptions<TInput>, 'inputSchema'>,\n ): WorkflowDefinition<TInput> => ({\n id,\n handler: handler as (\n context: WorkflowContext<InputParameters, StepBaseContext>,\n ) => Promise<unknown>,\n inputSchema: options?.inputSchema,\n timeout: defineOptions?.timeout,\n retries: defineOptions?.retries,\n schedule: defineOptions?.schedule,\n timezone: defineOptions?.timezone,\n })) as WorkflowRef<TInput, TOutput>;\n\n Object.defineProperty(ref, 'id', { value: id, enumerable: true });\n Object.defineProperty(ref, 'inputSchema', {\n value: options?.inputSchema,\n enumerable: true,\n });\n\n return ref;\n}\n\nfunction createWorkflowFactory<TStepExt extends object = object>(\n plugins: Array<WorkflowPlugin<unknown, object>> = [],\n): WorkflowFactory<TStepExt> {\n const factory = (<I extends InputParameters>(\n id: string,\n handler: (context: WorkflowContext<I, StepBaseContext & TStepExt>) => Promise<unknown>,\n { inputSchema, timeout, retries, schedule, timezone }: WorkflowOptions<I> = {},\n ): WorkflowDefinition<I> => ({\n id,\n handler: handler as (\n context: WorkflowContext<InputParameters, StepBaseContext>,\n ) => Promise<unknown>,\n inputSchema,\n timeout,\n retries,\n schedule,\n timezone,\n plugins: plugins.length > 0 ? (plugins as WorkflowPlugin[]) : undefined,\n })) as WorkflowFactory<TStepExt>;\n\n factory.use = <TNewExt>(\n plugin: WorkflowPlugin<StepBaseContext & TStepExt, TNewExt>,\n ): WorkflowFactory<TStepExt & TNewExt> =>\n createWorkflowFactory<TStepExt & TNewExt>([\n ...plugins,\n plugin as WorkflowPlugin<unknown, object>,\n ]);\n\n factory.ref = createWorkflowRef;\n\n return factory;\n}\n\nexport const workflow: WorkflowFactory = createWorkflowFactory();\n",
12
- "import { merge } from 'es-toolkit';\nimport pg from 'pg';\nimport { type Db, type JobWithMetadata, PgBoss } from 'pg-boss';\nimport { parseWorkflowHandler } from './ast-parser';\nimport {\n DEFAULT_PGBOSS_SCHEMA,\n invokeChildWorkflowTimelineKey,\n isInvokeChildWorkflowTimelineEntry,\n PAUSE_EVENT_NAME,\n scheduleQueueNameFor,\n WORKFLOW_RUN_DLQ_QUEUE_NAME,\n WORKFLOW_RUN_QUEUE_NAME,\n waitForTimelineKey,\n} from './constants';\nimport { runMigrations } from './db/migration';\nimport {\n getWorkflowLastRun,\n getWorkflowRun,\n getWorkflowRuns,\n insertWorkflowRun,\n updateWorkflowRun,\n withPostgresTransaction,\n} from './db/queries';\nimport type { WorkflowRun } from './db/types';\nimport type { Duration } from './duration';\nimport { parseDuration } from './duration';\nimport {\n validateResourceId,\n validateWorkflowId,\n WorkflowEngineError,\n WorkflowRunNotFoundError,\n} from './error';\nimport { resolveSchedule } from './schedule';\nimport {\n type InferInputParameters,\n type InputParameters,\n type StartWorkflowOptions,\n StepType,\n type WorkflowContext,\n type WorkflowDefinition,\n type WorkflowInternalDefinition,\n type WorkflowInternalLogger,\n type WorkflowInternalLoggerContext,\n type WorkflowLogger,\n type WorkflowRef,\n type WorkflowRunProgress,\n WorkflowStatus,\n} from './types';\n\nconst LOG_PREFIX = '[WorkflowEngine]';\n\ntype ResolvedWorkflowRunParameters<TOptions extends StartWorkflowOptions = StartWorkflowOptions> = {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: TOptions;\n};\n\nexport type WorkflowEngineOptions = {\n workflows?: WorkflowDefinition[];\n logger?: WorkflowLogger;\n boss?: PgBoss;\n} & ({ pool: pg.Pool; connectionString?: never } | { connectionString: string; pool?: never });\n\nconst StepTypeToIcon = {\n [StepType.RUN]: 'λ',\n [StepType.WAIT_FOR]: '○',\n [StepType.PAUSE]: '⏸',\n [StepType.WAIT_UNTIL]: '⏲',\n [StepType.DELAY]: '⏱',\n [StepType.POLL]: '↻',\n [StepType.INVOKE_CHILD_WORKFLOW]: '↪',\n};\n\n// Timeline entry types\ntype TimelineStepEntry = {\n output?: unknown;\n timedOut?: true;\n timestamp: Date;\n};\n\ntype TimelineWaitForEntry = {\n waitFor: {\n eventName?: string;\n timeoutEvent?: string;\n skipOutput?: true;\n };\n timestamp: Date;\n};\n\ntype TimelineInvokeChildWorkflowEntry = {\n invokeChildWorkflow: {\n childRunId: string;\n childWorkflowId: string;\n childResourceId?: string | null;\n };\n timestamp: Date;\n};\n\ntype WorkflowRunJobParameters = {\n runId: string;\n resourceId?: string;\n workflowId: string;\n input: unknown;\n event?: {\n name: string;\n data?: unknown;\n };\n};\n\nconst defaultLogger: WorkflowLogger = {\n log: (_message: string) => console.warn(_message),\n error: (message: string, error: Error) => console.error(message, error),\n};\n\nconst defaultExpireInSeconds = process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS\n ? Number.parseInt(process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS, 10)\n : 5 * 60; // 5 minutes\n\n// retryDelay is the base for pg-boss's exponential backoff:\n// `retryDelay * 2^retryCount` seconds (with up to ±50% jitter), so a base\n// of 1 second yields ~1s, ~2s, ~4s, ~8s, … between attempts.\nconst retrySendOptions = (maxRetries: number) => ({\n retryLimit: maxRetries,\n retryBackoff: true,\n retryDelay: 1,\n});\n\nconst getInvokeChildWorkflowEventName = (childRunId: string) =>\n `__invoke_child_workflow_completed:${childRunId}`;\n\n// pg-boss workers auto-touch heartbeat_on every heartbeatSeconds / 2 seconds\n// while the process is alive. If the worker dies, heartbeats stop and pg-boss's\n// monitor (~60s ticks) routes the job to the dead-letter queue. Minimum is 10.\nconst defaultHeartbeatSeconds = process.env.WORKFLOW_RUN_HEARTBEAT_SECONDS\n ? Number.parseInt(process.env.WORKFLOW_RUN_HEARTBEAT_SECONDS, 10)\n : 30;\n\nexport class WorkflowEngine {\n private boss: PgBoss;\n private db: Db;\n private pool: pg.Pool;\n private _ownsPool = false;\n private unregisteredWorkflows = new Map<string, WorkflowDefinition>();\n private _started = false;\n\n public workflows: Map<string, WorkflowInternalDefinition> = new Map<\n string,\n WorkflowInternalDefinition\n >();\n private logger: WorkflowInternalLogger;\n\n constructor({ workflows, logger, boss, ...connectionOptions }: WorkflowEngineOptions) {\n this.logger = this.buildLogger(logger ?? defaultLogger);\n\n if ('pool' in connectionOptions && connectionOptions.pool) {\n this.pool = connectionOptions.pool;\n } else if ('connectionString' in connectionOptions && connectionOptions.connectionString) {\n this.pool = new pg.Pool({ connectionString: connectionOptions.connectionString });\n this._ownsPool = true;\n } else {\n throw new WorkflowEngineError('Either pool or connectionString must be provided');\n }\n\n if (workflows) {\n this.unregisteredWorkflows = new Map(workflows.map((workflow) => [workflow.id, workflow]));\n }\n\n const db: Db = {\n executeSql: (text: string, values?: unknown[]) =>\n this.pool.query(text, values) as Promise<{ rows: unknown[] }>,\n };\n\n if (boss) {\n this.boss = boss;\n } else {\n this.boss = new PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });\n }\n this.db = this.boss.getDb();\n }\n\n async start(\n asEngine = true,\n {\n batchSize = 1,\n heartbeatSeconds = defaultHeartbeatSeconds,\n }: { batchSize?: number; heartbeatSeconds?: number } = {},\n ): Promise<void> {\n if (this._started) {\n return;\n }\n\n // Start boss first to get the database connection\n await this.boss.start();\n\n await runMigrations(this.boss.getDb());\n\n if (this.unregisteredWorkflows.size > 0) {\n for (const workflow of this.unregisteredWorkflows.values()) {\n await this.registerWorkflow(workflow);\n }\n }\n\n // pg-boss handles retries: every send sets retryLimit + retryBackoff\n // per-job from the workflow's `retries` option. Failures (thrown error,\n // expired job, missed heartbeats) re-enqueue automatically; once a job's\n // retries are exhausted, pg-boss routes it to the DLQ where\n // handleWorkflowRunDlq marks the run FAILED. heartbeatSeconds lets\n // pg-boss detect dead workers in ~heartbeatSeconds + monitorInterval\n // (≈60s) instead of waiting for the full expireInSeconds.\n const mainQueueOptions = {\n retryLimit: 0,\n deadLetter: WORKFLOW_RUN_DLQ_QUEUE_NAME,\n heartbeatSeconds,\n };\n await this.boss.createQueue(WORKFLOW_RUN_DLQ_QUEUE_NAME, { retryLimit: 0 });\n await this.boss.createQueue(WORKFLOW_RUN_QUEUE_NAME, mainQueueOptions);\n // createQueue is a no-op for existing queues; updateQueue ensures\n // installations that predate the DLQ adopt these settings on next start.\n await this.boss.updateQueue(WORKFLOW_RUN_QUEUE_NAME, mainQueueOptions);\n\n const numWorkers: number = +(process.env.WORKFLOW_RUN_WORKERS ?? 3);\n\n if (asEngine) {\n // includeMetadata exposes job.retryCount so we can mirror pg-boss's\n // attempt counter into workflow_runs.retryCount.\n await Promise.all(\n Array.from({ length: numWorkers }, (_, i) =>\n this.boss\n .work<WorkflowRunJobParameters>(\n WORKFLOW_RUN_QUEUE_NAME,\n { pollingIntervalSeconds: 0.5, batchSize, includeMetadata: true },\n (jobs) => this.handleWorkflowRun(jobs),\n )\n .then(() => {\n this.logger.log(\n `Worker ${i + 1}/${numWorkers} started for queue ${WORKFLOW_RUN_QUEUE_NAME}`,\n );\n }),\n ),\n );\n\n await this.boss.work<WorkflowRunJobParameters>(\n WORKFLOW_RUN_DLQ_QUEUE_NAME,\n { pollingIntervalSeconds: 0.5, batchSize: 1 },\n (jobs) => this.handleWorkflowRunDlq(jobs),\n );\n this.logger.log(`Worker started for queue ${WORKFLOW_RUN_DLQ_QUEUE_NAME}`);\n }\n\n if (asEngine) {\n const scheduled = Array.from(this.workflows.values()).flatMap((wf) =>\n wf.schedule == null\n ? []\n : [{ id: wf.id, resolved: resolveSchedule(wf.schedule, wf.timezone) }],\n );\n await Promise.allSettled(\n scheduled.map(({ id, resolved }) =>\n this.registerWorkflowSchedule(id, resolved).catch((error: unknown) => {\n this.logger.error(\n `Failed to register schedule for \"${id}\", skipping`,\n error instanceof Error ? error : new Error(String(error)),\n { workflowId: id },\n );\n }),\n ),\n );\n }\n\n this._started = true;\n\n this.logger.log('Workflow engine started!');\n }\n\n private async registerWorkflowSchedule(\n workflowId: string,\n resolvedSchedule: { cron: string; timezone: string },\n ): Promise<void> {\n const scheduleQueueName = scheduleQueueNameFor(workflowId);\n await this.boss.createQueue(scheduleQueueName);\n await this.boss.schedule(scheduleQueueName, resolvedSchedule.cron, null, {\n tz: resolvedSchedule.timezone,\n });\n await this.boss.work<unknown>(\n scheduleQueueName,\n { batchSize: 1, includeMetadata: true },\n async (jobs: JobWithMetadata<unknown>[]) => {\n const scheduledAt = jobs[0]?.startAfter ?? new Date();\n try {\n await this.createWorkflowRun({ workflowId, input: {}, scheduledAt });\n } catch (error) {\n this.logger.error(\n `Schedule fire failed to start a run for workflow \"${workflowId}\"`,\n error instanceof Error ? error : new Error(String(error)),\n { workflowId },\n );\n throw error;\n }\n },\n );\n this.logger.log(\n `Schedule registered for workflow \"${workflowId}\": ${resolvedSchedule.cron} (${resolvedSchedule.timezone})`,\n { workflowId },\n );\n }\n\n private async unscheduleWorkflow(workflowId: string): Promise<void> {\n try {\n await this.boss.unschedule(scheduleQueueNameFor(workflowId));\n } catch (error) {\n this.logger.error(\n `Failed to unschedule \"${workflowId}\"`,\n error instanceof Error ? error : new Error(String(error)),\n { workflowId },\n );\n }\n }\n\n async stop(): Promise<void> {\n await Promise.allSettled(\n Array.from(this.workflows.values())\n .filter((wf) => wf.schedule != null)\n .map((wf) => this.unscheduleWorkflow(wf.id)),\n );\n\n await this.boss.stop();\n\n if (this._ownsPool) {\n await this.pool.end();\n }\n\n this._started = false;\n\n this.logger.log('Workflow engine stopped');\n }\n\n async registerWorkflow(definition: WorkflowDefinition<InputParameters>): Promise<WorkflowEngine> {\n if (this.workflows.has(definition.id)) {\n throw new WorkflowEngineError(\n `Workflow ${definition.id} is already registered`,\n definition.id,\n );\n }\n\n const { steps } = parseWorkflowHandler(\n definition.handler as (context: WorkflowContext) => Promise<unknown>,\n );\n\n // Validate eagerly so authors get a clear error at registration time.\n const resolvedSchedule = definition.schedule\n ? resolveSchedule(definition.schedule, definition.timezone)\n : undefined;\n\n this.workflows.set(definition.id, {\n ...definition,\n steps,\n } as WorkflowInternalDefinition);\n\n if (this._started && resolvedSchedule) {\n await this.registerWorkflowSchedule(definition.id, resolvedSchedule);\n }\n\n this.logger.log(`Registered workflow \"${definition.id}\" with steps:`);\n for (const step of steps.values()) {\n const tags = [];\n if (step.conditional) tags.push('[conditional]');\n if (step.loop) tags.push('[loop]');\n if (step.isDynamic) tags.push('[dynamic]');\n this.logger.log(` └─ (${StepTypeToIcon[step.type]}) ${step.id} ${tags.join(' ')}`);\n }\n\n return this;\n }\n\n async unregisterWorkflow(workflowId: string): Promise<WorkflowEngine> {\n const existing = this.workflows.get(workflowId);\n if (existing?.schedule != null && this._started) {\n await this.unscheduleWorkflow(workflowId);\n }\n this.workflows.delete(workflowId);\n return this;\n }\n\n async unregisterAllWorkflows(): Promise<WorkflowEngine> {\n if (this._started) {\n await Promise.allSettled(\n Array.from(this.workflows.values())\n .filter((wf) => wf.schedule != null)\n .map((wf) => this.unscheduleWorkflow(wf.id)),\n );\n }\n this.workflows.clear();\n return this;\n }\n\n private resolveWorkflowRunParameters<\n TInput extends InputParameters,\n TOptions extends StartWorkflowOptions,\n >(\n refOrParams:\n | WorkflowRef<TInput, unknown>\n | {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: TOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: TOptions,\n ): ResolvedWorkflowRunParameters<TOptions> {\n if (typeof refOrParams === 'function' && 'id' in refOrParams) {\n return {\n workflowId: refOrParams.id,\n input: inputArg,\n options: optionsArg,\n resourceId: optionsArg?.resourceId,\n idempotencyKey: optionsArg?.idempotencyKey,\n };\n }\n\n const params = refOrParams as {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: TOptions;\n };\n\n return {\n workflowId: params.workflowId,\n input: params.input,\n resourceId: params.resourceId ?? params.options?.resourceId,\n idempotencyKey: params.idempotencyKey ?? params.options?.idempotencyKey,\n options: params.options,\n };\n }\n\n async startWorkflow<TInput extends InputParameters>(\n ref: WorkflowRef<TInput>,\n input: InferInputParameters<TInput>,\n options?: StartWorkflowOptions,\n ): Promise<WorkflowRun>;\n\n async startWorkflow(params: {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n }): Promise<WorkflowRun>;\n\n async startWorkflow<TInput extends InputParameters>(\n refOrParams:\n | WorkflowRef<TInput>\n | {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: StartWorkflowOptions,\n ): Promise<WorkflowRun> {\n const { workflowId, input, resourceId, idempotencyKey, options } =\n this.resolveWorkflowRunParameters(refOrParams, inputArg, optionsArg);\n\n if (!this._started) {\n await this.start(false);\n }\n\n const { run } = await this.createWorkflowRun({\n workflowId,\n input,\n resourceId,\n idempotencyKey,\n options,\n });\n\n this.logger.log('Started workflow run', {\n runId: run.id,\n workflowId,\n });\n\n return run;\n }\n\n private async createWorkflowRun({\n workflowId,\n input,\n resourceId,\n idempotencyKey,\n options,\n parentRunId,\n parentStepId,\n parentResourceId,\n scheduledAt,\n enqueue = true,\n db,\n }: {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n parentRunId?: string;\n parentStepId?: string;\n parentResourceId?: string;\n scheduledAt?: Date;\n enqueue?: boolean;\n db?: Db;\n }): Promise<{ run: WorkflowRun; created: boolean }> {\n validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new WorkflowEngineError(`Unknown workflow ${workflowId}`);\n }\n\n const hasSteps = workflow.steps.length > 0 && workflow.steps[0];\n const hasPlugins = (workflow.plugins?.length ?? 0) > 0;\n if (!hasSteps && !hasPlugins) {\n throw new WorkflowEngineError(`Workflow ${workflowId} has no steps`, workflowId);\n }\n if (workflow.inputSchema) {\n const result = await workflow.inputSchema['~standard'].validate(input);\n if (result.issues) {\n throw new WorkflowEngineError(\n JSON.stringify(result.issues),\n workflowId,\n undefined,\n undefined,\n result.issues,\n );\n }\n }\n\n const initialStepId = workflow.steps[0]?.id ?? '__start__';\n const timeoutAt = options?.timeout\n ? new Date(Date.now() + options.timeout)\n : workflow.timeout\n ? new Date(Date.now() + workflow.timeout)\n : null;\n\n const insertRun = async (targetDb: Db) =>\n await insertWorkflowRun(\n {\n resourceId,\n workflowId,\n currentStepId: initialStepId,\n status: WorkflowStatus.RUNNING,\n input,\n maxRetries: options?.retries ?? workflow.retries ?? 0,\n timeoutAt,\n idempotencyKey,\n parentRunId,\n parentStepId,\n parentResourceId,\n scheduledAt,\n },\n targetDb,\n );\n\n // Pipe the same transaction connection through pg-boss so the\n // INSERT into workflow_runs and the INSERT into pgboss.job\n // commit (or roll back) together. If `boss.send` throws, the\n // workflow_runs row is rolled back too, so we never end up with\n // an orphan run that has no job, or a job that points at no run.\n const insertAndEnqueue = async (targetDb: Db) => {\n const result = await insertRun(targetDb);\n if (enqueue && result.created) {\n await this.enqueueWorkflowRun(result.run, options, targetDb);\n }\n return result;\n };\n\n const { run, created } = db\n ? await insertAndEnqueue(db)\n : await withPostgresTransaction(this.boss.getDb(), insertAndEnqueue, this.pool);\n\n return { run, created };\n }\n\n private async enqueueWorkflowRun(\n run: WorkflowRun,\n options?: { expireInSeconds?: number },\n db?: Db,\n ) {\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: new Date(),\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n ...(db ? { db } : {}),\n });\n }\n\n private async notifyParentOfChildTerminalRun(childRun: WorkflowRun) {\n if (!childRun.parentRunId || !childRun.parentStepId) {\n return;\n }\n\n const parentRun = await getWorkflowRun(\n {\n runId: childRun.parentRunId,\n resourceId: childRun.parentResourceId ?? undefined,\n },\n { db: this.db },\n );\n if (\n !parentRun ||\n parentRun.status === WorkflowStatus.COMPLETED ||\n parentRun.status === WorkflowStatus.FAILED ||\n parentRun.status === WorkflowStatus.CANCELLED\n ) {\n return;\n }\n\n await this.triggerEvent({\n runId: parentRun.id,\n resourceId: parentRun.resourceId ?? undefined,\n eventName: getInvokeChildWorkflowEventName(childRun.id),\n });\n }\n\n async pauseWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n // TODO: Pause all running steps immediately\n const run = await this.updateRun({\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.PAUSED,\n pausedAt: new Date(),\n },\n expectedStatuses: [WorkflowStatus.RUNNING, WorkflowStatus.PENDING],\n });\n\n this.logger.log('Paused workflow run', {\n runId,\n workflowId: run.workflowId,\n });\n\n return run;\n }\n\n async resumeWorkflow({\n runId,\n resourceId,\n options,\n }: {\n runId: string;\n resourceId?: string;\n options?: { expireInSeconds?: number };\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const current = await this.getRun({ runId, resourceId });\n if (current.status !== WorkflowStatus.PAUSED) {\n throw new WorkflowEngineError(\n `Cannot resume workflow run in '${current.status}' status, must be 'paused'`,\n current.workflowId,\n runId,\n );\n }\n\n if (this.getInvokeChildWorkflowStepEntry(current.timeline, current.currentStepId)) {\n return current;\n }\n\n return this.triggerEvent({\n runId,\n resourceId,\n eventName: PAUSE_EVENT_NAME,\n data: {},\n options,\n });\n }\n\n async fastForwardWorkflow({\n runId,\n resourceId,\n data,\n }: {\n runId: string;\n resourceId?: string;\n data?: Record<string, unknown>;\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n if (run.status !== WorkflowStatus.PAUSED) {\n return run;\n }\n\n const stepId = run.currentStepId;\n if (this.getInvokeChildWorkflowStepEntry(run.timeline, stepId)) {\n return run;\n }\n\n const waitForStep = this.getWaitForStepEntry(run.timeline, stepId);\n\n if (!waitForStep) {\n return run;\n }\n\n const { eventName, timeoutEvent, skipOutput } = waitForStep.waitFor;\n\n // step.pause() - delegate to resumeWorkflow\n if (eventName === PAUSE_EVENT_NAME) {\n return this.resumeWorkflow({ runId, resourceId });\n }\n\n // step.poll() - write output to timeline first, then trigger resume\n if (skipOutput && timeoutEvent) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun({ runId, resourceId }, { exclusiveLock: true, db });\n return this.updateRun(\n {\n runId,\n resourceId,\n data: {\n timeline: merge(freshRun.timeline, {\n [stepId]: {\n output: data ?? {},\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent });\n }\n\n // waitFor steps - trigger the event with data\n if (eventName) {\n return this.triggerEvent({ runId, resourceId, eventName, data: data ?? {} });\n }\n\n // delay/waitUntil steps - trigger the timeout event\n if (timeoutEvent) {\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent, data: data ?? {} });\n }\n\n return run;\n }\n\n async cancelWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const run = await this.updateRun({\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.CANCELLED,\n },\n expectedStatuses: [WorkflowStatus.PENDING, WorkflowStatus.RUNNING, WorkflowStatus.PAUSED],\n });\n\n this.logger.log(`cancelled workflow run with id ${runId}`);\n\n await this.notifyParentOfChildTerminalRun(run);\n\n return run;\n }\n\n async triggerEvent({\n runId,\n resourceId,\n eventName,\n data,\n options,\n }: {\n runId: string;\n resourceId?: string;\n eventName: string;\n data?: Record<string, unknown>;\n options?: {\n expireInSeconds?: number;\n };\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n const jobResourceId = resourceId ?? run.resourceId ?? undefined;\n\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: jobResourceId,\n workflowId: run.workflowId,\n input: run.input,\n event: {\n name: eventName,\n data,\n },\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n });\n\n this.logger.log(`event ${eventName} sent for workflow run with id ${runId}`);\n return run;\n }\n\n async getRun(\n { runId, resourceId }: { runId: string; resourceId?: string },\n { exclusiveLock = false, db }: { exclusiveLock?: boolean; db?: Db } = {},\n ): Promise<WorkflowRun> {\n const run = await getWorkflowRun({ runId, resourceId }, { exclusiveLock, db: db ?? this.db });\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return run;\n }\n\n /**\n * Fetch the most recently created run for a workflow, optionally scoped to a\n * `resourceId`. Useful for cron-style incremental syncs where the next run\n * needs the previous run's completion timestamp as a cursor.\n */\n async getWorkflowLastRun({\n workflowId,\n resourceId,\n }: {\n workflowId: string;\n resourceId?: string;\n }): Promise<WorkflowRun | null> {\n validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n return getWorkflowLastRun({ workflowId, resourceId }, this.db);\n }\n\n async updateRun(\n {\n runId,\n resourceId,\n data,\n expectedStatuses,\n }: {\n runId: string;\n resourceId?: string;\n data: Partial<WorkflowRun>;\n expectedStatuses?: string[];\n },\n { db }: { db?: Db } = {},\n ): Promise<WorkflowRun> {\n const run = await updateWorkflowRun(\n { runId, resourceId, data, expectedStatuses },\n db ?? this.db,\n );\n\n if (!run) {\n if (expectedStatuses) {\n const current = await getWorkflowRun({ runId, resourceId }, { db: db ?? this.db });\n if (current) {\n throw new WorkflowEngineError(\n `Cannot update workflow run in '${current.status}' status, expected: ${expectedStatuses.join(', ')}`,\n current.workflowId,\n runId,\n );\n }\n }\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return run;\n }\n\n async checkProgress({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRunProgress> {\n const run = await this.getRun({ runId, resourceId });\n const workflow = this.workflows.get(run.workflowId);\n\n if (!workflow) {\n throw new WorkflowEngineError(`Workflow ${run.workflowId} not found`, run.workflowId, runId);\n }\n const steps = workflow?.steps ?? [];\n\n let completionPercentage = 0;\n let completedSteps = 0;\n\n if (steps.length > 0) {\n completedSteps = Object.values(run.timeline).filter(\n (step): step is TimelineStepEntry =>\n typeof step === 'object' &&\n step !== null &&\n 'output' in step &&\n step.output !== undefined,\n ).length;\n\n if (run.status === WorkflowStatus.COMPLETED) {\n completionPercentage = 100;\n } else if (run.status === WorkflowStatus.FAILED || run.status === WorkflowStatus.CANCELLED) {\n completionPercentage = Math.min((completedSteps / steps.length) * 100, 100);\n } else {\n const currentStepIndex = steps.findIndex((step) => step.id === run.currentStepId);\n if (currentStepIndex >= 0) {\n completionPercentage = (currentStepIndex / steps.length) * 100;\n } else {\n const completedSteps = Object.keys(run.timeline).length;\n\n completionPercentage = Math.min((completedSteps / steps.length) * 100, 100);\n }\n }\n }\n\n return {\n ...run,\n completedSteps,\n completionPercentage: Math.round(completionPercentage * 100) / 100, // Round to 2 decimal places\n totalSteps: steps.length,\n };\n }\n\n /**\n * Resolves the resource id used for scoped DB access (getRun/updateRun).\n * When the job omits resourceId, the run's stored resourceId is used.\n * When the job includes resourceId, it must match the run's resourceId if the run is scoped;\n * unscoped runs reject a job-supplied resourceId (authorization).\n */\n private resolveScopedResourceId(\n jobResourceId: string | undefined,\n run: WorkflowRun,\n ): string | undefined {\n const jobResourceProvided =\n jobResourceId !== undefined && jobResourceId !== null && jobResourceId !== '';\n\n if (jobResourceProvided) {\n if (run.resourceId === null) {\n throw new WorkflowRunNotFoundError(run.id);\n }\n if (run.resourceId !== jobResourceId) {\n throw new WorkflowRunNotFoundError(run.id);\n }\n return jobResourceId;\n }\n\n return run.resourceId ?? undefined;\n }\n\n private async handleWorkflowRun([job]: JobWithMetadata<WorkflowRunJobParameters>[]) {\n const { runId = '', resourceId, workflowId = '', event } = job?.data ?? {};\n\n let run: WorkflowRun | undefined;\n let scopedResourceId: string | undefined;\n\n try {\n if (!runId) {\n throw new WorkflowEngineError('Invalid workflow run job, missing runId', workflowId);\n }\n\n if (!workflowId) {\n throw new WorkflowEngineError(\n 'Invalid workflow run job, missing workflowId',\n undefined,\n runId,\n );\n }\n\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new WorkflowEngineError(`Workflow ${workflowId} not found`, workflowId, runId);\n }\n\n this.logger.log('Processing workflow run...', {\n runId,\n workflowId,\n });\n\n run = await this.getRun({ runId });\n\n if (run.workflowId !== workflowId) {\n throw new WorkflowEngineError(\n `Workflow run ${runId} does not match job workflowId ${workflowId}`,\n workflowId,\n runId,\n );\n }\n\n scopedResourceId = this.resolveScopedResourceId(resourceId, run);\n\n // Mirror pg-boss's attempt counter so workflow_runs.retryCount stays\n // observable to API consumers across retries.\n if (job?.retryCount !== undefined && run.retryCount !== job.retryCount) {\n await this.updateRun({\n runId,\n resourceId: scopedResourceId,\n data: { retryCount: job.retryCount },\n });\n run = { ...run, retryCount: job.retryCount };\n }\n\n if (run.status === WorkflowStatus.CANCELLED) {\n this.logger.log(`Workflow run ${runId} is cancelled, skipping`);\n return;\n }\n\n if (!run.currentStepId) {\n throw new WorkflowEngineError('Missing current step id', workflowId, runId);\n }\n\n if (run.status === WorkflowStatus.PAUSED) {\n run = await withPostgresTransaction(\n this.db,\n async (db) => {\n const lockedRun = await this.getRun(\n { runId, resourceId: scopedResourceId },\n { exclusiveLock: true, db },\n );\n if (lockedRun.status !== WorkflowStatus.PAUSED) {\n return lockedRun;\n }\n\n const waitForStep = this.getWaitForStepEntry(\n lockedRun.timeline,\n lockedRun.currentStepId,\n );\n const currentStep = this.getCachedStepEntry(\n lockedRun.timeline,\n lockedRun.currentStepId,\n );\n const waitFor = waitForStep?.waitFor;\n const hasCurrentStepOutput = currentStep?.output !== undefined;\n\n const eventMatches =\n waitFor &&\n event?.name &&\n (event.name === waitFor.eventName || event.name === waitFor.timeoutEvent) &&\n !hasCurrentStepOutput;\n\n if (eventMatches) {\n const isTimeout = event?.name === waitFor?.timeoutEvent;\n const skipOutput = waitFor?.skipOutput;\n return this.updateRun(\n {\n runId,\n resourceId: scopedResourceId,\n data: {\n status: WorkflowStatus.RUNNING,\n pausedAt: null,\n resumedAt: new Date(),\n jobId: job?.id,\n ...(skipOutput\n ? {}\n : {\n timeline: merge(lockedRun.timeline, {\n [lockedRun.currentStepId]: {\n output: event?.data ?? {},\n ...(isTimeout ? { timedOut: true as const } : {}),\n timestamp: new Date(),\n },\n }),\n }),\n },\n },\n { db },\n );\n }\n\n return this.updateRun(\n {\n runId,\n resourceId: scopedResourceId,\n data: {\n status: WorkflowStatus.RUNNING,\n pausedAt: null,\n resumedAt: new Date(),\n jobId: job?.id,\n },\n },\n { db },\n );\n },\n this.pool,\n );\n }\n\n const baseStep = {\n run: async <T>(stepId: string, handler: () => Promise<T>) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n return this.runStep({ stepId, run, handler }) as Promise<T>;\n },\n waitFor: async <T extends InputParameters>(\n stepId: string,\n { eventName, timeout }: { eventName: string; timeout?: number; schema?: T },\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n const timeoutDate = timeout ? new Date(Date.now() + timeout) : undefined;\n return this.waitStep({ run, stepId, eventName, timeoutDate }) as Promise<\n InferInputParameters<T> | undefined\n >;\n },\n waitUntil: async (\n stepId: string,\n dateOrOptions: Date | string | { date: Date | string },\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n const date =\n dateOrOptions instanceof Date\n ? dateOrOptions\n : typeof dateOrOptions === 'string'\n ? new Date(dateOrOptions)\n : dateOrOptions.date instanceof Date\n ? dateOrOptions.date\n : new Date(dateOrOptions.date);\n await this.waitStep({ run, stepId, timeoutDate: date });\n },\n pause: async (stepId: string) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n await this.waitStep({ run, stepId, eventName: PAUSE_EVENT_NAME });\n },\n delay: async (stepId: string, duration: Duration) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n await this.waitStep({\n run,\n stepId,\n timeoutDate: new Date(Date.now() + parseDuration(duration)),\n });\n },\n get sleep() {\n return this.delay;\n },\n poll: async <T>(\n stepId: string,\n conditionFn: () => Promise<T | false>,\n options?: { interval?: Duration; timeout?: Duration },\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n const intervalMs = parseDuration(options?.interval ?? '30s');\n if (intervalMs < 30_000) {\n throw new WorkflowEngineError(\n `step.poll interval must be at least 30s (got ${intervalMs}ms)`,\n workflowId,\n runId,\n );\n }\n const timeoutMs = options?.timeout ? parseDuration(options.timeout) : undefined;\n return this.pollStep({ run, stepId, conditionFn, intervalMs, timeoutMs }) as Promise<\n { timedOut: false; data: T } | { timedOut: true }\n >;\n },\n invokeChildWorkflow: async <TInput extends InputParameters, TOutput = unknown>(\n stepId: string,\n refOrParams:\n | WorkflowRef<TInput, TOutput>\n | {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: StartWorkflowOptions,\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n\n // Resolve overload input (typed ref or params object) into one shape\n // before handing off to the durable child-invocation implementation.\n const resolvedChildCall = this.resolveWorkflowRunParameters(\n refOrParams,\n inputArg,\n optionsArg,\n );\n const childWorkflowInvocation = {\n run,\n stepId,\n workflowId: resolvedChildCall.workflowId,\n input: resolvedChildCall.input,\n options: resolvedChildCall.options,\n resourceId: resolvedChildCall.resourceId,\n idempotencyKey: resolvedChildCall.idempotencyKey,\n };\n return this.invokeChildWorkflowStep(childWorkflowInvocation) as Promise<TOutput>;\n },\n };\n\n let step = { ...baseStep };\n const plugins = workflow.plugins ?? [];\n\n const context: WorkflowContext = {\n input: run.input as InferInputParameters<InputParameters>,\n workflowId: run.workflowId,\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n attempt: run.retryCount,\n get timeline() {\n // Read through to the live run so callers see entries written by\n // previously completed steps within the same handler invocation.\n return run?.timeline ?? {};\n },\n logger: this.logger,\n step,\n schedule: run.scheduledAt ? { timestamp: run.scheduledAt } : undefined,\n };\n\n for (const plugin of plugins) {\n const extra = plugin.methods(step, context);\n step = { ...step, ...extra };\n context.step = step;\n }\n\n let next: () => Promise<unknown> = () => workflow.handler(context);\n for (const plugin of [...plugins].reverse()) {\n if (plugin.wrap) {\n const inner = next;\n const wrap = plugin.wrap;\n next = () => wrap(context, inner);\n }\n }\n\n const result = await next();\n\n run = await this.getRun({ runId, resourceId: scopedResourceId });\n\n const isLastParsedStep = run.currentStepId === workflow.steps[workflow.steps.length - 1]?.id;\n const hasPluginSteps = (workflow.plugins?.length ?? 0) > 0;\n const noParsedSteps = workflow.steps.length === 0;\n const shouldComplete =\n run.status === WorkflowStatus.RUNNING &&\n (noParsedSteps || isLastParsedStep || (hasPluginSteps && result !== undefined));\n if (shouldComplete) {\n const normalizedResult = result === undefined ? {} : result;\n const completedRun = await this.updateRun({\n runId,\n resourceId: scopedResourceId,\n data: {\n status: WorkflowStatus.COMPLETED,\n output: normalizedResult,\n completedAt: new Date(),\n jobId: job?.id,\n },\n });\n await this.notifyParentOfChildTerminalRun(completedRun);\n\n this.logger.log('Workflow run completed.', {\n runId,\n workflowId,\n });\n }\n } catch (error) {\n // Persist the error so the DLQ handler can surface it after retries\n // are exhausted. pg-boss handles the retry-vs-DLQ decision based on\n // the per-job retryLimit set when the job was enqueued.\n if (runId) {\n const updatedRun = await this.updateRun({\n runId,\n resourceId: scopedResourceId,\n data: {\n error: error instanceof Error ? error.message : String(error),\n jobId: job?.id,\n },\n });\n if (\n updatedRun.status === WorkflowStatus.COMPLETED ||\n updatedRun.status === WorkflowStatus.FAILED ||\n updatedRun.status === WorkflowStatus.CANCELLED\n ) {\n await this.notifyParentOfChildTerminalRun(updatedRun);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Reconciles workflow runs whose retries pg-boss has exhausted (handler\n * threw on the final attempt, or worker died and missed the heartbeat\n * past the retry budget). The DLQ entry tells us the run is unrecoverable;\n * we mark it FAILED with whatever error message the catch block last\n * persisted, falling back to a worker-death message.\n */\n private async handleWorkflowRunDlq([job]: { data?: WorkflowRunJobParameters }[]) {\n const { runId } = job?.data ?? {};\n if (!runId) return;\n\n const run = await getWorkflowRun({ runId }, { db: this.db });\n if (!run || run.status !== WorkflowStatus.RUNNING) return;\n\n const failedRun = await this.updateRun({\n runId,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.FAILED,\n error: run.error ?? 'Workflow run worker died or job expired before completion',\n },\n });\n await this.notifyParentOfChildTerminalRun(failedRun);\n\n this.logger.log('Marked stuck workflow run as failed', {\n runId,\n workflowId: run.workflowId,\n });\n }\n\n private getCachedStepEntry(\n timeline: Record<string, unknown>,\n stepId: string,\n ): TimelineStepEntry | null {\n const stepEntry = timeline[stepId];\n return stepEntry && typeof stepEntry === 'object' && 'output' in stepEntry\n ? (stepEntry as TimelineStepEntry)\n : null;\n }\n\n private getWaitForStepEntry(\n timeline: Record<string, unknown>,\n stepId: string,\n ): TimelineWaitForEntry | null {\n const entry = timeline[waitForTimelineKey(stepId)];\n return entry && typeof entry === 'object' && 'waitFor' in entry\n ? (entry as TimelineWaitForEntry)\n : null;\n }\n\n private getInvokeChildWorkflowStepEntry(\n timeline: Record<string, unknown>,\n stepId: string,\n ): TimelineInvokeChildWorkflowEntry | null {\n const entry = timeline[invokeChildWorkflowTimelineKey(stepId)];\n return isInvokeChildWorkflowTimelineEntry(entry)\n ? (entry as TimelineInvokeChildWorkflowEntry)\n : null;\n }\n\n /**\n * Returns the cached output for a COMPLETED child run. Treats `undefined`\n * outputs as `{}` so the parent timeline always has a defined value.\n * Caller must ensure `childRun.status === COMPLETED` before calling.\n */\n private getCompletedChildOutput(childRun: WorkflowRun): unknown {\n return childRun.output === undefined ? {} : childRun.output;\n }\n\n /**\n * Throws a `WorkflowEngineError` describing why an invoked child run did not\n * produce output (it FAILED or was CANCELLED). The throw aborts the parent\n * step, which is then caught by `handleWorkflowRun` and marks the parent\n * FAILED with the same message — no fake sentinel value is ever written to\n * the parent timeline.\n */\n private throwForNonCompletedChild(childRun: WorkflowRun): never {\n throw new WorkflowEngineError(\n `Child workflow ${childRun.workflowId} ${childRun.status}${childRun.error ? `: ${childRun.error}` : ''}`,\n childRun.workflowId,\n childRun.id,\n );\n }\n\n private assertInvokeChildWorkflowStepOwnership({\n childRun,\n parentRun,\n stepId,\n workflowId,\n }: {\n childRun: WorkflowRun;\n parentRun: WorkflowRun;\n stepId: string;\n workflowId: string;\n }) {\n const expectedParentResourceId = parentRun.resourceId ?? null;\n const matches =\n childRun.workflowId === workflowId &&\n childRun.parentRunId === parentRun.id &&\n childRun.parentStepId === stepId &&\n childRun.parentResourceId === expectedParentResourceId;\n\n if (!matches) {\n throw new WorkflowEngineError(\n `Idempotency key resolved to workflow run ${childRun.id}, which does not belong to invokeChildWorkflow step '${stepId}'`,\n workflowId,\n parentRun.id,\n );\n }\n }\n\n // The whole step runs inside a single SELECT … FOR UPDATE transaction so that\n // every state transition (cache hit, terminal-child cache, fresh child create,\n // re-pause for a still-running existing child) sees a consistent parent row\n // and can never overwrite a status another worker just wrote (e.g. a\n // concurrent invoke-completion event flipping the parent to COMPLETED).\n //\n // The child run insert AND its pgboss.job enqueue both join this same\n // transaction. The parent pause, child run row, and child job all commit (or\n // roll back) together, so a worker crashing between \"parent paused\" and\n // \"child enqueued\" is impossible — there is no such interleaving window.\n private async invokeChildWorkflowStep({\n run,\n stepId,\n workflowId,\n input,\n resourceId,\n idempotencyKey,\n options,\n }: {\n run: WorkflowRun;\n stepId: string;\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n }): Promise<unknown> {\n let invokeOutput: unknown;\n let hasInvokeOutput = false;\n const childResourceId = resourceId ?? run.resourceId ?? undefined;\n const childIdempotencyKey = idempotencyKey;\n\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const lockedRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n\n // If the parent isn't RUNNING, fall through and return `undefined`. The\n // worker's outer loop won't act on it: subsequent `step.run` calls\n // short-circuit the same way (see `runStep`), and the post-handler\n // `shouldComplete` check requires `status === RUNNING` so no terminal\n // state is written. Matches the pattern used by the other step kinds.\n if (\n lockedRun.status === WorkflowStatus.CANCELLED ||\n lockedRun.status === WorkflowStatus.PAUSED ||\n lockedRun.status === WorkflowStatus.FAILED\n ) {\n return;\n }\n\n const lockedCached = this.getCachedStepEntry(lockedRun.timeline, stepId);\n if (lockedCached?.output !== undefined) {\n invokeOutput = lockedCached.output;\n hasInvokeOutput = true;\n return;\n }\n\n const lockedInvoke = this.getInvokeChildWorkflowStepEntry(lockedRun.timeline, stepId);\n if (lockedInvoke) {\n const existingChildResourceId =\n 'childResourceId' in lockedInvoke.invokeChildWorkflow\n ? (lockedInvoke.invokeChildWorkflow.childResourceId ?? undefined)\n : childResourceId;\n const existingChildRun = await this.getRun({\n runId: lockedInvoke.invokeChildWorkflow.childRunId,\n resourceId: existingChildResourceId,\n });\n if (existingChildRun.status === WorkflowStatus.COMPLETED) {\n invokeOutput = this.getCompletedChildOutput(existingChildRun);\n hasInvokeOutput = true;\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n timeline: merge(lockedRun.timeline, {\n [stepId]: {\n output: invokeOutput,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n return;\n }\n if (\n existingChildRun.status === WorkflowStatus.FAILED ||\n existingChildRun.status === WorkflowStatus.CANCELLED\n ) {\n // No timeline write — let the throw roll back the txn (a no-op\n // here since we only did SELECTs) and bubble up so the parent\n // is marked FAILED by the worker's catch handler.\n this.throwForNonCompletedChild(existingChildRun);\n }\n\n // Child is still RUNNING/PAUSED. The original enqueue committed\n // with the prior parent-pause txn, so pg-boss already owns the\n // child job — re-pause the parent and wait for the next terminal\n // event without re-enqueueing.\n await this.pauseRunForWait({\n run: lockedRun,\n stepId,\n eventName: getInvokeChildWorkflowEventName(existingChildRun.id),\n skipOutput: true,\n db,\n });\n return;\n }\n\n const result = await this.createWorkflowRun({\n workflowId,\n input,\n resourceId: childResourceId,\n idempotencyKey: childIdempotencyKey,\n options,\n parentRunId: run.id,\n parentStepId: stepId,\n parentResourceId: run.resourceId ?? undefined,\n enqueue: true,\n db,\n });\n const childRun = result.run;\n\n if (!result.created) {\n this.assertInvokeChildWorkflowStepOwnership({\n childRun,\n parentRun: lockedRun,\n stepId,\n workflowId,\n });\n\n if (childRun.status === WorkflowStatus.COMPLETED) {\n invokeOutput = this.getCompletedChildOutput(childRun);\n hasInvokeOutput = true;\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n timeline: merge(lockedRun.timeline, {\n [invokeChildWorkflowTimelineKey(stepId)]: {\n invokeChildWorkflow: {\n childRunId: childRun.id,\n childWorkflowId: childRun.workflowId,\n childResourceId: childRun.resourceId,\n },\n timestamp: new Date(),\n },\n [stepId]: {\n output: invokeOutput,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n return;\n }\n if (\n childRun.status === WorkflowStatus.FAILED ||\n childRun.status === WorkflowStatus.CANCELLED\n ) {\n // Same throw-and-rollback contract as the existing-child branch:\n // we deliberately do NOT record the parent timeline binding for\n // a child we matched-by-idempotency-key but never owned the\n // creation of. The throw propagates and the parent fails.\n this.throwForNonCompletedChild(childRun);\n }\n }\n\n await this.pauseRunForWait({\n run: lockedRun,\n stepId,\n eventName: getInvokeChildWorkflowEventName(childRun.id),\n skipOutput: true,\n db,\n timeline: merge(lockedRun.timeline, {\n [invokeChildWorkflowTimelineKey(stepId)]: {\n invokeChildWorkflow: {\n childRunId: childRun.id,\n childWorkflowId: childRun.workflowId,\n childResourceId: childRun.resourceId,\n },\n timestamp: new Date(),\n },\n }),\n });\n },\n this.pool,\n );\n\n if (hasInvokeOutput) {\n return invokeOutput;\n }\n }\n\n private async pauseRunForWait({\n run,\n stepId,\n eventName,\n timeoutEvent,\n skipOutput,\n db,\n timeline,\n }: {\n run: WorkflowRun;\n stepId: string;\n eventName?: string;\n timeoutEvent?: string;\n skipOutput?: true;\n db?: Db;\n timeline?: Record<string, unknown>;\n }) {\n const baseTimeline = timeline ?? run.timeline;\n const waitFor: TimelineWaitForEntry['waitFor'] = {};\n if (eventName) waitFor.eventName = eventName;\n if (timeoutEvent) waitFor.timeoutEvent = timeoutEvent;\n if (skipOutput) waitFor.skipOutput = true;\n\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.PAUSED,\n currentStepId: stepId,\n pausedAt: new Date(),\n timeline: merge(baseTimeline, {\n [waitForTimelineKey(stepId)]: {\n waitFor,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n }\n\n private async runStep({\n stepId,\n run,\n handler,\n }: {\n stepId: string;\n run: WorkflowRun;\n handler: () => Promise<unknown>;\n }) {\n return withPostgresTransaction(\n this.db,\n async (db) => {\n const persistedRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n {\n exclusiveLock: true,\n db,\n },\n );\n\n if (\n persistedRun.status === WorkflowStatus.CANCELLED ||\n persistedRun.status === WorkflowStatus.PAUSED ||\n persistedRun.status === WorkflowStatus.FAILED\n ) {\n this.logger.log(`Step ${stepId} skipped, workflow run is ${persistedRun.status}`, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n return;\n }\n\n try {\n const cached = this.getCachedStepEntry(persistedRun.timeline, stepId);\n if (cached?.output !== undefined) {\n return cached.output;\n }\n\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n },\n },\n { db },\n );\n\n this.logger.log(`Running step ${stepId}...`, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n let output = await handler();\n\n if (output === undefined) {\n output = {};\n }\n\n const updated = await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n timeline: merge(persistedRun.timeline, {\n [stepId]: {\n output,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n // Mutate in place so handleWorkflowRun's `run` (same reference)\n // — and the context.timeline getter that reads through it —\n // observes the new step entry.\n Object.assign(run, updated);\n\n return output;\n } catch (error) {\n this.logger.error(`Step ${stepId} failed:`, error as Error, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.FAILED,\n error: error instanceof Error ? `${error.message}\\n${error.stack}` : String(error),\n },\n },\n { db },\n );\n\n throw error;\n }\n },\n this.pool,\n );\n }\n\n private async waitStep({\n run,\n stepId,\n eventName,\n timeoutDate,\n }: {\n run: WorkflowRun;\n stepId: string;\n eventName?: string;\n timeoutDate?: Date;\n }): Promise<unknown> {\n const persistedRun = await this.getRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n });\n\n if (\n persistedRun.status === WorkflowStatus.CANCELLED ||\n persistedRun.status === WorkflowStatus.PAUSED ||\n persistedRun.status === WorkflowStatus.FAILED\n ) {\n return;\n }\n\n const cached = this.getCachedStepEntry(persistedRun.timeline, stepId);\n if (cached?.output !== undefined) {\n return cached.timedOut ? undefined : cached.output;\n }\n\n const timeoutEvent = timeoutDate ? `__timeout_${stepId}` : undefined;\n\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.pauseRunForWait({ run: freshRun, stepId, eventName, timeoutEvent, db });\n },\n this.pool,\n );\n\n if (timeoutDate && timeoutEvent) {\n try {\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n event: { name: timeoutEvent, data: { date: timeoutDate.toISOString() } },\n };\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: timeoutDate.getTime() <= Date.now() ? new Date() : timeoutDate,\n expireInSeconds: defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n });\n } catch (error) {\n // Revert PAUSED status so the workflow can retry this step\n await this.updateRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: { status: WorkflowStatus.RUNNING, pausedAt: null },\n });\n throw error;\n }\n }\n\n this.logger.log(\n `Step ${stepId} waiting${eventName ? ` for event \"${eventName}\"` : ''}${timeoutDate ? ` until ${timeoutDate.toISOString()}` : ''}`,\n { runId: run.id, workflowId: run.workflowId },\n );\n }\n\n private async pollStep<T>({\n run,\n stepId,\n conditionFn,\n intervalMs,\n timeoutMs,\n }: {\n run: WorkflowRun;\n stepId: string;\n conditionFn: () => Promise<T | false>;\n intervalMs: number;\n timeoutMs?: number;\n }): Promise<{ timedOut: false; data: T } | { timedOut: true } | undefined> {\n const persistedRun = await this.getRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n });\n\n if (\n persistedRun.status === WorkflowStatus.CANCELLED ||\n persistedRun.status === WorkflowStatus.PAUSED ||\n persistedRun.status === WorkflowStatus.FAILED\n ) {\n return { timedOut: true };\n }\n\n const cached = this.getCachedStepEntry(persistedRun.timeline, stepId);\n if (cached?.output !== undefined) {\n return cached.timedOut ? { timedOut: true } : { timedOut: false, data: cached.output as T };\n }\n\n const pollStateEntry = persistedRun.timeline[`${stepId}-poll`];\n const startedAt =\n pollStateEntry && typeof pollStateEntry === 'object' && 'startedAt' in pollStateEntry\n ? new Date((pollStateEntry as { startedAt: string }).startedAt)\n : new Date();\n\n if (timeoutMs !== undefined && Date.now() >= startedAt.getTime() + timeoutMs) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n timeline: merge(freshRun.timeline, {\n [stepId]: { output: {}, timedOut: true as const, timestamp: new Date() },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n return { timedOut: true };\n }\n\n let result: T | false;\n try {\n result = await conditionFn();\n } catch (error) {\n this.logger.error(\n `Poll conditionFn for step ${stepId} threw an error, treating as non-match and continuing to poll`,\n error as Error,\n { runId: run.id, workflowId: run.workflowId },\n );\n\n // If the poll has timed out, respect the timeout even though conditionFn threw\n if (timeoutMs !== undefined && Date.now() >= startedAt.getTime() + timeoutMs) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n timeline: merge(freshRun.timeline, {\n [stepId]: { output: {}, timedOut: true as const, timestamp: new Date() },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n return { timedOut: true };\n }\n\n result = false;\n }\n\n if (result !== false) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n timeline: merge(freshRun.timeline, {\n [stepId]: { output: result, timestamp: new Date() },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n return { timedOut: false, data: result };\n }\n\n const pollEvent = `__poll_${stepId}`;\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.PAUSED,\n currentStepId: stepId,\n pausedAt: new Date(),\n timeline: merge(freshRun.timeline, {\n [`${stepId}-poll`]: { startedAt: startedAt.toISOString() },\n [waitForTimelineKey(stepId)]: {\n waitFor: { timeoutEvent: pollEvent, skipOutput: true },\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n\n try {\n await this.boss.send(\n WORKFLOW_RUN_QUEUE_NAME,\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n event: { name: pollEvent, data: {} },\n },\n {\n startAfter: new Date(Date.now() + intervalMs),\n expireInSeconds: defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n },\n );\n } catch (error) {\n // Revert PAUSED status so the workflow can retry this step\n await this.updateRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: { status: WorkflowStatus.RUNNING, pausedAt: null },\n });\n throw error;\n }\n\n this.logger.log(`Step ${stepId} polling every ${intervalMs}ms...`, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n return { timedOut: false, data: undefined as T };\n }\n\n private async checkIfHasStarted(): Promise<void> {\n if (!this._started) {\n throw new WorkflowEngineError('Workflow engine not started');\n }\n }\n\n private buildLogger(logger: WorkflowLogger): WorkflowInternalLogger {\n return {\n log: (message: string, context?: WorkflowInternalLoggerContext) => {\n const { runId, workflowId } = context ?? {};\n const parts = [LOG_PREFIX, workflowId, runId].filter(Boolean).join(' ');\n logger.log(`${parts}: ${message}`);\n },\n error: (message: string, error: Error, context?: WorkflowInternalLoggerContext) => {\n const { runId, workflowId } = context ?? {};\n const parts = [LOG_PREFIX, workflowId, runId].filter(Boolean).join(' ');\n logger.error(`${parts}: ${message}`, error);\n },\n };\n }\n\n async getRuns({\n resourceId,\n startingAfter,\n endingBefore,\n limit = 20,\n statuses,\n workflowId,\n }: {\n resourceId?: string;\n startingAfter?: string | null;\n endingBefore?: string | null;\n limit?: number;\n statuses?: WorkflowStatus[];\n workflowId?: string;\n }): Promise<{\n items: WorkflowRun[];\n nextCursor: string | null;\n prevCursor: string | null;\n hasMore: boolean;\n hasPrev: boolean;\n }> {\n if (workflowId) validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n return getWorkflowRuns(\n {\n resourceId,\n startingAfter,\n endingBefore,\n limit,\n statuses,\n workflowId,\n },\n this.db,\n );\n }\n}\n",
12
+ "import { merge } from 'es-toolkit';\nimport pg from 'pg';\nimport { type Db, type JobWithMetadata, PgBoss } from 'pg-boss';\nimport { parseWorkflowHandler } from './ast-parser';\nimport {\n DEFAULT_PGBOSS_SCHEMA,\n invokeChildWorkflowTimelineKey,\n isInvokeChildWorkflowTimelineEntry,\n PAUSE_EVENT_NAME,\n scheduleQueueNameFor,\n WORKFLOW_RUN_DLQ_QUEUE_NAME,\n WORKFLOW_RUN_QUEUE_NAME,\n waitForTimelineKey,\n} from './constants';\nimport { runMigrations } from './db/migration';\nimport {\n getWorkflowLastRun,\n getWorkflowRun,\n getWorkflowRuns,\n insertWorkflowRun,\n updateWorkflowRun,\n withPostgresTransaction,\n} from './db/queries';\nimport type { WorkflowRun } from './db/types';\nimport type { Duration } from './duration';\nimport { parseDuration } from './duration';\nimport {\n validateResourceId,\n validateWorkflowId,\n WorkflowEngineError,\n WorkflowRunNotFoundError,\n} from './error';\nimport { resolveSchedule } from './schedule';\nimport {\n type InferInputParameters,\n type InputParameters,\n type StartWorkflowOptions,\n StepType,\n type WorkflowContext,\n type WorkflowDefinition,\n type WorkflowInternalDefinition,\n type WorkflowInternalLogger,\n type WorkflowInternalLoggerContext,\n type WorkflowLogger,\n type WorkflowRef,\n type WorkflowRunProgress,\n WorkflowStatus,\n} from './types';\n\nconst LOG_PREFIX = '[WorkflowEngine]';\n\ntype ResolvedWorkflowRunParameters<TOptions extends StartWorkflowOptions = StartWorkflowOptions> = {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: TOptions;\n};\n\nexport type WorkflowEngineOptions = {\n workflows?: WorkflowDefinition[];\n logger?: WorkflowLogger;\n boss?: PgBoss;\n} & ({ pool: pg.Pool; connectionString?: never } | { connectionString: string; pool?: never });\n\nconst StepTypeToIcon = {\n [StepType.RUN]: 'λ',\n [StepType.WAIT_FOR]: '○',\n [StepType.PAUSE]: '⏸',\n [StepType.WAIT_UNTIL]: '⏲',\n [StepType.DELAY]: '⏱',\n [StepType.POLL]: '↻',\n [StepType.INVOKE_CHILD_WORKFLOW]: '↪',\n};\n\n// Timeline entry types\ntype TimelineStepEntry = {\n output?: unknown;\n timedOut?: true;\n timestamp: Date;\n};\n\ntype TimelineWaitForEntry = {\n waitFor: {\n eventName?: string;\n timeoutEvent?: string;\n skipOutput?: true;\n };\n timestamp: Date;\n};\n\ntype TimelineInvokeChildWorkflowEntry = {\n invokeChildWorkflow: {\n childRunId: string;\n childWorkflowId: string;\n childResourceId?: string | null;\n };\n timestamp: Date;\n};\n\ntype WorkflowRunJobParameters = {\n runId: string;\n resourceId?: string;\n workflowId: string;\n input: unknown;\n event?: {\n name: string;\n data?: unknown;\n };\n};\n\nconst defaultLogger: WorkflowLogger = {\n log: (_message: string) => console.warn(_message),\n error: (message: string, error: Error) => console.error(message, error),\n};\n\nconst defaultExpireInSeconds = process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS\n ? Number.parseInt(process.env.WORKFLOW_RUN_EXPIRE_IN_SECONDS, 10)\n : 5 * 60; // 5 minutes\n\n// retryDelay is the base for pg-boss's exponential backoff:\n// `retryDelay * 2^retryCount` seconds (with up to ±50% jitter), so a base\n// of 1 second yields ~1s, ~2s, ~4s, ~8s, … between attempts.\nconst retrySendOptions = (maxRetries: number) => ({\n retryLimit: maxRetries,\n retryBackoff: true,\n retryDelay: 1,\n});\n\nconst getInvokeChildWorkflowEventName = (childRunId: string) =>\n `__invoke_child_workflow_completed:${childRunId}`;\n\n// pg-boss workers auto-touch heartbeat_on every heartbeatSeconds / 2 seconds\n// while the process is alive. If the worker dies, heartbeats stop and pg-boss's\n// monitor (~60s ticks) routes the job to the dead-letter queue. Minimum is 10.\nconst defaultHeartbeatSeconds = process.env.WORKFLOW_RUN_HEARTBEAT_SECONDS\n ? Number.parseInt(process.env.WORKFLOW_RUN_HEARTBEAT_SECONDS, 10)\n : 30;\n\nexport class WorkflowEngine {\n private boss: PgBoss;\n private db: Db;\n private pool: pg.Pool;\n private _ownsPool = false;\n private unregisteredWorkflows = new Map<string, WorkflowDefinition>();\n private _started = false;\n\n public workflows: Map<string, WorkflowInternalDefinition> = new Map<\n string,\n WorkflowInternalDefinition\n >();\n private logger: WorkflowInternalLogger;\n\n constructor({ workflows, logger, boss, ...connectionOptions }: WorkflowEngineOptions) {\n this.logger = this.buildLogger(logger ?? defaultLogger);\n\n if ('pool' in connectionOptions && connectionOptions.pool) {\n this.pool = connectionOptions.pool;\n } else if ('connectionString' in connectionOptions && connectionOptions.connectionString) {\n this.pool = new pg.Pool({ connectionString: connectionOptions.connectionString });\n this._ownsPool = true;\n } else {\n throw new WorkflowEngineError('Either pool or connectionString must be provided');\n }\n\n if (workflows) {\n this.unregisteredWorkflows = new Map(workflows.map((workflow) => [workflow.id, workflow]));\n }\n\n const db: Db = {\n executeSql: (text: string, values?: unknown[]) =>\n this.pool.query(text, values) as Promise<{ rows: unknown[] }>,\n };\n\n if (boss) {\n this.boss = boss;\n } else {\n this.boss = new PgBoss({ db, schema: DEFAULT_PGBOSS_SCHEMA });\n }\n this.db = this.boss.getDb();\n }\n\n async start(\n asEngine = true,\n {\n batchSize = 1,\n heartbeatSeconds = defaultHeartbeatSeconds,\n }: { batchSize?: number; heartbeatSeconds?: number } = {},\n ): Promise<void> {\n if (this._started) {\n return;\n }\n\n // Start boss first to get the database connection\n await this.boss.start();\n\n await runMigrations(this.boss.getDb());\n\n if (this.unregisteredWorkflows.size > 0) {\n for (const workflow of this.unregisteredWorkflows.values()) {\n await this.registerWorkflow(workflow);\n }\n\n this.unregisteredWorkflows.clear();\n }\n\n // pg-boss handles retries: every send sets retryLimit + retryBackoff\n // per-job from the workflow's `retries` option. Failures (thrown error,\n // expired job, missed heartbeats) re-enqueue automatically; once a job's\n // retries are exhausted, pg-boss routes it to the DLQ where\n // handleWorkflowRunDlq marks the run FAILED. heartbeatSeconds lets\n // pg-boss detect dead workers in ~heartbeatSeconds + monitorInterval\n // (≈60s) instead of waiting for the full expireInSeconds.\n const mainQueueOptions = {\n retryLimit: 0,\n deadLetter: WORKFLOW_RUN_DLQ_QUEUE_NAME,\n heartbeatSeconds,\n };\n await this.boss.createQueue(WORKFLOW_RUN_DLQ_QUEUE_NAME, { retryLimit: 0 });\n await this.boss.createQueue(WORKFLOW_RUN_QUEUE_NAME, mainQueueOptions);\n // createQueue is a no-op for existing queues; updateQueue ensures\n // installations that predate the DLQ adopt these settings on next start.\n await this.boss.updateQueue(WORKFLOW_RUN_QUEUE_NAME, mainQueueOptions);\n\n const numWorkers: number = +(process.env.WORKFLOW_RUN_WORKERS ?? 3);\n\n if (asEngine) {\n // includeMetadata exposes job.retryCount so we can mirror pg-boss's\n // attempt counter into workflow_runs.retryCount.\n await Promise.all(\n Array.from({ length: numWorkers }, (_, i) =>\n this.boss\n .work<WorkflowRunJobParameters>(\n WORKFLOW_RUN_QUEUE_NAME,\n { pollingIntervalSeconds: 0.5, batchSize, includeMetadata: true },\n (jobs) => this.handleWorkflowRun(jobs),\n )\n .then(() => {\n this.logger.log(\n `Worker ${i + 1}/${numWorkers} started for queue ${WORKFLOW_RUN_QUEUE_NAME}`,\n );\n }),\n ),\n );\n\n await this.boss.work<WorkflowRunJobParameters>(\n WORKFLOW_RUN_DLQ_QUEUE_NAME,\n { pollingIntervalSeconds: 0.5, batchSize: 1 },\n (jobs) => this.handleWorkflowRunDlq(jobs),\n );\n this.logger.log(`Worker started for queue ${WORKFLOW_RUN_DLQ_QUEUE_NAME}`);\n }\n\n if (asEngine) {\n const scheduled = Array.from(this.workflows.values()).flatMap((wf) =>\n wf.schedule == null\n ? []\n : [{ id: wf.id, resolved: resolveSchedule(wf.schedule, wf.timezone) }],\n );\n await Promise.allSettled(\n scheduled.map(({ id, resolved }) =>\n this.registerWorkflowSchedule(id, resolved).catch((error: unknown) => {\n this.logger.error(\n `Failed to register schedule for \"${id}\", skipping`,\n error instanceof Error ? error : new Error(String(error)),\n { workflowId: id },\n );\n }),\n ),\n );\n }\n\n this._started = true;\n\n this.logger.log('Workflow engine started!');\n }\n\n private async registerWorkflowSchedule(\n workflowId: string,\n resolvedSchedule: { cron: string; timezone: string },\n ): Promise<void> {\n const scheduleQueueName = scheduleQueueNameFor(workflowId);\n await this.boss.createQueue(scheduleQueueName);\n await this.boss.schedule(scheduleQueueName, resolvedSchedule.cron, null, {\n tz: resolvedSchedule.timezone,\n });\n await this.boss.work<unknown>(\n scheduleQueueName,\n { batchSize: 1, includeMetadata: true },\n async (jobs: JobWithMetadata<unknown>[]) => {\n const scheduledAt = jobs[0]?.startAfter ?? new Date();\n try {\n await this.createWorkflowRun({ workflowId, input: {}, scheduledAt });\n } catch (error) {\n this.logger.error(\n `Schedule fire failed to start a run for workflow \"${workflowId}\"`,\n error instanceof Error ? error : new Error(String(error)),\n { workflowId },\n );\n throw error;\n }\n },\n );\n this.logger.log(\n `Schedule registered for workflow \"${workflowId}\": ${resolvedSchedule.cron} (${resolvedSchedule.timezone})`,\n { workflowId },\n );\n }\n\n private async unscheduleWorkflow(workflowId: string): Promise<void> {\n try {\n await this.boss.unschedule(scheduleQueueNameFor(workflowId));\n } catch (error) {\n this.logger.error(\n `Failed to unschedule \"${workflowId}\"`,\n error instanceof Error ? error : new Error(String(error)),\n { workflowId },\n );\n }\n }\n\n async stop(): Promise<void> {\n await Promise.allSettled(\n Array.from(this.workflows.values())\n .filter((wf) => wf.schedule != null)\n .map((wf) => this.unscheduleWorkflow(wf.id)),\n );\n\n await this.boss.stop();\n\n if (this._ownsPool) {\n await this.pool.end();\n }\n\n this._started = false;\n\n this.logger.log('Workflow engine stopped');\n }\n\n async registerWorkflow(definition: WorkflowDefinition<InputParameters>): Promise<WorkflowEngine> {\n if (this.workflows.has(definition.id)) {\n throw new WorkflowEngineError(\n `Workflow ${definition.id} is already registered`,\n definition.id,\n );\n }\n\n const { steps } = parseWorkflowHandler(\n definition.handler as (context: WorkflowContext) => Promise<unknown>,\n );\n\n // Validate eagerly so authors get a clear error at registration time.\n const resolvedSchedule = definition.schedule\n ? resolveSchedule(definition.schedule, definition.timezone)\n : undefined;\n\n this.workflows.set(definition.id, {\n ...definition,\n steps,\n } as WorkflowInternalDefinition);\n\n if (this._started && resolvedSchedule) {\n await this.registerWorkflowSchedule(definition.id, resolvedSchedule);\n }\n\n this.logger.log(`Registered workflow \"${definition.id}\" with steps:`);\n for (const step of steps.values()) {\n const tags = [];\n if (step.conditional) tags.push('[conditional]');\n if (step.loop) tags.push('[loop]');\n if (step.isDynamic) tags.push('[dynamic]');\n this.logger.log(` └─ (${StepTypeToIcon[step.type]}) ${step.id} ${tags.join(' ')}`);\n }\n\n return this;\n }\n\n async unregisterWorkflow(workflowId: string): Promise<WorkflowEngine> {\n const existing = this.workflows.get(workflowId);\n if (existing?.schedule != null && this._started) {\n await this.unscheduleWorkflow(workflowId);\n }\n this.workflows.delete(workflowId);\n return this;\n }\n\n async unregisterAllWorkflows(): Promise<WorkflowEngine> {\n if (this._started) {\n await Promise.allSettled(\n Array.from(this.workflows.values())\n .filter((wf) => wf.schedule != null)\n .map((wf) => this.unscheduleWorkflow(wf.id)),\n );\n }\n this.workflows.clear();\n return this;\n }\n\n private resolveWorkflowRunParameters<\n TInput extends InputParameters,\n TOptions extends StartWorkflowOptions,\n >(\n refOrParams:\n | WorkflowRef<TInput, unknown>\n | {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: TOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: TOptions,\n ): ResolvedWorkflowRunParameters<TOptions> {\n if (typeof refOrParams === 'function' && 'id' in refOrParams) {\n return {\n workflowId: refOrParams.id,\n input: inputArg,\n options: optionsArg,\n resourceId: optionsArg?.resourceId,\n idempotencyKey: optionsArg?.idempotencyKey,\n };\n }\n\n const params = refOrParams as {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: TOptions;\n };\n\n return {\n workflowId: params.workflowId,\n input: params.input,\n resourceId: params.resourceId ?? params.options?.resourceId,\n idempotencyKey: params.idempotencyKey ?? params.options?.idempotencyKey,\n options: params.options,\n };\n }\n\n async startWorkflow<TInput extends InputParameters>(\n ref: WorkflowRef<TInput>,\n input: InferInputParameters<TInput>,\n options?: StartWorkflowOptions,\n ): Promise<WorkflowRun>;\n\n async startWorkflow(params: {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n }): Promise<WorkflowRun>;\n\n async startWorkflow<TInput extends InputParameters>(\n refOrParams:\n | WorkflowRef<TInput>\n | {\n resourceId?: string;\n workflowId: string;\n input: unknown;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: StartWorkflowOptions,\n ): Promise<WorkflowRun> {\n const { workflowId, input, resourceId, idempotencyKey, options } =\n this.resolveWorkflowRunParameters(refOrParams, inputArg, optionsArg);\n\n if (!this._started) {\n await this.start(false);\n }\n\n const { run } = await this.createWorkflowRun({\n workflowId,\n input,\n resourceId,\n idempotencyKey,\n options,\n });\n\n this.logger.log('Started workflow run', {\n runId: run.id,\n workflowId,\n });\n\n return run;\n }\n\n private async createWorkflowRun({\n workflowId,\n input,\n resourceId,\n idempotencyKey,\n options,\n parentRunId,\n parentStepId,\n parentResourceId,\n scheduledAt,\n enqueue = true,\n db,\n }: {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n parentRunId?: string;\n parentStepId?: string;\n parentResourceId?: string;\n scheduledAt?: Date;\n enqueue?: boolean;\n db?: Db;\n }): Promise<{ run: WorkflowRun; created: boolean }> {\n validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new WorkflowEngineError(`Unknown workflow ${workflowId}`);\n }\n\n const hasSteps = workflow.steps.length > 0 && workflow.steps[0];\n const hasPlugins = (workflow.plugins?.length ?? 0) > 0;\n if (!hasSteps && !hasPlugins) {\n throw new WorkflowEngineError(`Workflow ${workflowId} has no steps`, workflowId);\n }\n if (workflow.inputSchema) {\n const result = await workflow.inputSchema['~standard'].validate(input);\n if (result.issues) {\n throw new WorkflowEngineError(\n JSON.stringify(result.issues),\n workflowId,\n undefined,\n undefined,\n result.issues,\n );\n }\n }\n\n const initialStepId = workflow.steps[0]?.id ?? '__start__';\n const timeoutAt = options?.timeout\n ? new Date(Date.now() + options.timeout)\n : workflow.timeout\n ? new Date(Date.now() + workflow.timeout)\n : null;\n\n const insertRun = async (targetDb: Db) =>\n await insertWorkflowRun(\n {\n resourceId,\n workflowId,\n currentStepId: initialStepId,\n status: WorkflowStatus.RUNNING,\n input,\n maxRetries: options?.retries ?? workflow.retries ?? 0,\n timeoutAt,\n idempotencyKey,\n parentRunId,\n parentStepId,\n parentResourceId,\n scheduledAt,\n },\n targetDb,\n );\n\n // Pipe the same transaction connection through pg-boss so the\n // INSERT into workflow_runs and the INSERT into pgboss.job\n // commit (or roll back) together. If `boss.send` throws, the\n // workflow_runs row is rolled back too, so we never end up with\n // an orphan run that has no job, or a job that points at no run.\n const insertAndEnqueue = async (targetDb: Db) => {\n const result = await insertRun(targetDb);\n if (enqueue && result.created) {\n await this.enqueueWorkflowRun(result.run, options, targetDb);\n }\n return result;\n };\n\n const { run, created } = db\n ? await insertAndEnqueue(db)\n : await withPostgresTransaction(this.boss.getDb(), insertAndEnqueue, this.pool);\n\n return { run, created };\n }\n\n private async enqueueWorkflowRun(\n run: WorkflowRun,\n options?: { expireInSeconds?: number },\n db?: Db,\n ) {\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: new Date(),\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n ...(db ? { db } : {}),\n });\n }\n\n private async notifyParentOfChildTerminalRun(childRun: WorkflowRun) {\n if (!childRun.parentRunId || !childRun.parentStepId) {\n return;\n }\n\n const parentRun = await getWorkflowRun(\n {\n runId: childRun.parentRunId,\n resourceId: childRun.parentResourceId ?? undefined,\n },\n { db: this.db },\n );\n if (\n !parentRun ||\n parentRun.status === WorkflowStatus.COMPLETED ||\n parentRun.status === WorkflowStatus.FAILED ||\n parentRun.status === WorkflowStatus.CANCELLED\n ) {\n return;\n }\n\n await this.triggerEvent({\n runId: parentRun.id,\n resourceId: parentRun.resourceId ?? undefined,\n eventName: getInvokeChildWorkflowEventName(childRun.id),\n });\n }\n\n async pauseWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n // TODO: Pause all running steps immediately\n const run = await this.updateRun({\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.PAUSED,\n pausedAt: new Date(),\n },\n expectedStatuses: [WorkflowStatus.RUNNING, WorkflowStatus.PENDING],\n });\n\n this.logger.log('Paused workflow run', {\n runId,\n workflowId: run.workflowId,\n });\n\n return run;\n }\n\n async resumeWorkflow({\n runId,\n resourceId,\n options,\n }: {\n runId: string;\n resourceId?: string;\n options?: { expireInSeconds?: number };\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const current = await this.getRun({ runId, resourceId });\n if (current.status !== WorkflowStatus.PAUSED) {\n throw new WorkflowEngineError(\n `Cannot resume workflow run in '${current.status}' status, must be 'paused'`,\n current.workflowId,\n runId,\n );\n }\n\n if (this.getInvokeChildWorkflowStepEntry(current.timeline, current.currentStepId)) {\n return current;\n }\n\n return this.triggerEvent({\n runId,\n resourceId,\n eventName: PAUSE_EVENT_NAME,\n data: {},\n options,\n });\n }\n\n async fastForwardWorkflow({\n runId,\n resourceId,\n data,\n }: {\n runId: string;\n resourceId?: string;\n data?: Record<string, unknown>;\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n if (run.status !== WorkflowStatus.PAUSED) {\n return run;\n }\n\n const stepId = run.currentStepId;\n if (this.getInvokeChildWorkflowStepEntry(run.timeline, stepId)) {\n return run;\n }\n\n const waitForStep = this.getWaitForStepEntry(run.timeline, stepId);\n\n if (!waitForStep) {\n return run;\n }\n\n const { eventName, timeoutEvent, skipOutput } = waitForStep.waitFor;\n\n // step.pause() - delegate to resumeWorkflow\n if (eventName === PAUSE_EVENT_NAME) {\n return this.resumeWorkflow({ runId, resourceId });\n }\n\n // step.poll() - write output to timeline first, then trigger resume\n if (skipOutput && timeoutEvent) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun({ runId, resourceId }, { exclusiveLock: true, db });\n return this.updateRun(\n {\n runId,\n resourceId,\n data: {\n timeline: merge(freshRun.timeline, {\n [stepId]: {\n output: data ?? {},\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent });\n }\n\n // waitFor steps - trigger the event with data\n if (eventName) {\n return this.triggerEvent({ runId, resourceId, eventName, data: data ?? {} });\n }\n\n // delay/waitUntil steps - trigger the timeout event\n if (timeoutEvent) {\n return this.triggerEvent({ runId, resourceId, eventName: timeoutEvent, data: data ?? {} });\n }\n\n return run;\n }\n\n async cancelWorkflow({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const run = await this.updateRun({\n runId,\n resourceId,\n data: {\n status: WorkflowStatus.CANCELLED,\n },\n expectedStatuses: [WorkflowStatus.PENDING, WorkflowStatus.RUNNING, WorkflowStatus.PAUSED],\n });\n\n this.logger.log(`cancelled workflow run with id ${runId}`);\n\n await this.notifyParentOfChildTerminalRun(run);\n\n return run;\n }\n\n async triggerEvent({\n runId,\n resourceId,\n eventName,\n data,\n options,\n }: {\n runId: string;\n resourceId?: string;\n eventName: string;\n data?: Record<string, unknown>;\n options?: {\n expireInSeconds?: number;\n };\n }): Promise<WorkflowRun> {\n await this.checkIfHasStarted();\n\n const run = await this.getRun({ runId, resourceId });\n\n const jobResourceId = resourceId ?? run.resourceId ?? undefined;\n\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: jobResourceId,\n workflowId: run.workflowId,\n input: run.input,\n event: {\n name: eventName,\n data,\n },\n };\n\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n expireInSeconds: options?.expireInSeconds ?? defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n });\n\n this.logger.log(`event ${eventName} sent for workflow run with id ${runId}`);\n return run;\n }\n\n async getRun(\n { runId, resourceId }: { runId: string; resourceId?: string },\n { exclusiveLock = false, db }: { exclusiveLock?: boolean; db?: Db } = {},\n ): Promise<WorkflowRun> {\n const run = await getWorkflowRun({ runId, resourceId }, { exclusiveLock, db: db ?? this.db });\n\n if (!run) {\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return run;\n }\n\n /**\n * Fetch the most recently created run for a workflow, optionally scoped to a\n * `resourceId`. Useful for cron-style incremental syncs where the next run\n * needs the previous run's completion timestamp as a cursor.\n */\n async getWorkflowLastRun({\n workflowId,\n resourceId,\n }: {\n workflowId: string;\n resourceId?: string;\n }): Promise<WorkflowRun | null> {\n validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n return getWorkflowLastRun({ workflowId, resourceId }, this.db);\n }\n\n async updateRun(\n {\n runId,\n resourceId,\n data,\n expectedStatuses,\n }: {\n runId: string;\n resourceId?: string;\n data: Partial<WorkflowRun>;\n expectedStatuses?: string[];\n },\n { db }: { db?: Db } = {},\n ): Promise<WorkflowRun> {\n const run = await updateWorkflowRun(\n { runId, resourceId, data, expectedStatuses },\n db ?? this.db,\n );\n\n if (!run) {\n if (expectedStatuses) {\n const current = await getWorkflowRun({ runId, resourceId }, { db: db ?? this.db });\n if (current) {\n throw new WorkflowEngineError(\n `Cannot update workflow run in '${current.status}' status, expected: ${expectedStatuses.join(', ')}`,\n current.workflowId,\n runId,\n );\n }\n }\n throw new WorkflowRunNotFoundError(runId);\n }\n\n return run;\n }\n\n async checkProgress({\n runId,\n resourceId,\n }: {\n runId: string;\n resourceId?: string;\n }): Promise<WorkflowRunProgress> {\n const run = await this.getRun({ runId, resourceId });\n const workflow = this.workflows.get(run.workflowId);\n\n if (!workflow) {\n throw new WorkflowEngineError(`Workflow ${run.workflowId} not found`, run.workflowId, runId);\n }\n const steps = workflow?.steps ?? [];\n\n let completionPercentage = 0;\n let completedSteps = 0;\n\n if (steps.length > 0) {\n completedSteps = Object.values(run.timeline).filter(\n (step): step is TimelineStepEntry =>\n typeof step === 'object' &&\n step !== null &&\n 'output' in step &&\n step.output !== undefined,\n ).length;\n\n if (run.status === WorkflowStatus.COMPLETED) {\n completionPercentage = 100;\n } else if (run.status === WorkflowStatus.FAILED || run.status === WorkflowStatus.CANCELLED) {\n completionPercentage = Math.min((completedSteps / steps.length) * 100, 100);\n } else {\n const currentStepIndex = steps.findIndex((step) => step.id === run.currentStepId);\n if (currentStepIndex >= 0) {\n completionPercentage = (currentStepIndex / steps.length) * 100;\n } else {\n const completedSteps = Object.keys(run.timeline).length;\n\n completionPercentage = Math.min((completedSteps / steps.length) * 100, 100);\n }\n }\n }\n\n return {\n ...run,\n completedSteps,\n completionPercentage: Math.round(completionPercentage * 100) / 100, // Round to 2 decimal places\n totalSteps: steps.length,\n };\n }\n\n /**\n * Resolves the resource id used for scoped DB access (getRun/updateRun).\n * When the job omits resourceId, the run's stored resourceId is used.\n * When the job includes resourceId, it must match the run's resourceId if the run is scoped;\n * unscoped runs reject a job-supplied resourceId (authorization).\n */\n private resolveScopedResourceId(\n jobResourceId: string | undefined,\n run: WorkflowRun,\n ): string | undefined {\n const jobResourceProvided =\n jobResourceId !== undefined && jobResourceId !== null && jobResourceId !== '';\n\n if (jobResourceProvided) {\n if (run.resourceId === null) {\n throw new WorkflowRunNotFoundError(run.id);\n }\n if (run.resourceId !== jobResourceId) {\n throw new WorkflowRunNotFoundError(run.id);\n }\n return jobResourceId;\n }\n\n return run.resourceId ?? undefined;\n }\n\n private async handleWorkflowRun([job]: JobWithMetadata<WorkflowRunJobParameters>[]) {\n const { runId = '', resourceId, workflowId = '', event } = job?.data ?? {};\n\n let run: WorkflowRun | undefined;\n let scopedResourceId: string | undefined;\n\n try {\n if (!runId) {\n throw new WorkflowEngineError('Invalid workflow run job, missing runId', workflowId);\n }\n\n if (!workflowId) {\n throw new WorkflowEngineError(\n 'Invalid workflow run job, missing workflowId',\n undefined,\n runId,\n );\n }\n\n const workflow = this.workflows.get(workflowId);\n if (!workflow) {\n throw new WorkflowEngineError(`Workflow ${workflowId} not found`, workflowId, runId);\n }\n\n this.logger.log('Processing workflow run...', {\n runId,\n workflowId,\n });\n\n run = await this.getRun({ runId });\n\n if (run.workflowId !== workflowId) {\n throw new WorkflowEngineError(\n `Workflow run ${runId} does not match job workflowId ${workflowId}`,\n workflowId,\n runId,\n );\n }\n\n scopedResourceId = this.resolveScopedResourceId(resourceId, run);\n\n // Mirror pg-boss's attempt counter so workflow_runs.retryCount stays\n // observable to API consumers across retries.\n if (job?.retryCount !== undefined && run.retryCount !== job.retryCount) {\n await this.updateRun({\n runId,\n resourceId: scopedResourceId,\n data: { retryCount: job.retryCount },\n });\n run = { ...run, retryCount: job.retryCount };\n }\n\n if (run.status === WorkflowStatus.CANCELLED) {\n this.logger.log(`Workflow run ${runId} is cancelled, skipping`);\n return;\n }\n\n if (!run.currentStepId) {\n throw new WorkflowEngineError('Missing current step id', workflowId, runId);\n }\n\n if (run.status === WorkflowStatus.PAUSED) {\n run = await withPostgresTransaction(\n this.db,\n async (db) => {\n const lockedRun = await this.getRun(\n { runId, resourceId: scopedResourceId },\n { exclusiveLock: true, db },\n );\n if (lockedRun.status !== WorkflowStatus.PAUSED) {\n return lockedRun;\n }\n\n const waitForStep = this.getWaitForStepEntry(\n lockedRun.timeline,\n lockedRun.currentStepId,\n );\n const currentStep = this.getCachedStepEntry(\n lockedRun.timeline,\n lockedRun.currentStepId,\n );\n const waitFor = waitForStep?.waitFor;\n const hasCurrentStepOutput = currentStep?.output !== undefined;\n\n const eventMatches =\n waitFor &&\n event?.name &&\n (event.name === waitFor.eventName || event.name === waitFor.timeoutEvent) &&\n !hasCurrentStepOutput;\n\n if (eventMatches) {\n const isTimeout = event?.name === waitFor?.timeoutEvent;\n const skipOutput = waitFor?.skipOutput;\n return this.updateRun(\n {\n runId,\n resourceId: scopedResourceId,\n data: {\n status: WorkflowStatus.RUNNING,\n pausedAt: null,\n resumedAt: new Date(),\n jobId: job?.id,\n ...(skipOutput\n ? {}\n : {\n timeline: merge(lockedRun.timeline, {\n [lockedRun.currentStepId]: {\n output: event?.data ?? {},\n ...(isTimeout ? { timedOut: true as const } : {}),\n timestamp: new Date(),\n },\n }),\n }),\n },\n },\n { db },\n );\n }\n\n return this.updateRun(\n {\n runId,\n resourceId: scopedResourceId,\n data: {\n status: WorkflowStatus.RUNNING,\n pausedAt: null,\n resumedAt: new Date(),\n jobId: job?.id,\n },\n },\n { db },\n );\n },\n this.pool,\n );\n }\n\n const baseStep = {\n run: async <T>(stepId: string, handler: () => Promise<T>) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n return this.runStep({ stepId, run, handler }) as Promise<T>;\n },\n waitFor: async <T extends InputParameters>(\n stepId: string,\n { eventName, timeout }: { eventName: string; timeout?: number; schema?: T },\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n const timeoutDate = timeout ? new Date(Date.now() + timeout) : undefined;\n return this.waitStep({ run, stepId, eventName, timeoutDate }) as Promise<\n InferInputParameters<T> | undefined\n >;\n },\n waitUntil: async (\n stepId: string,\n dateOrOptions: Date | string | { date: Date | string },\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n const date =\n dateOrOptions instanceof Date\n ? dateOrOptions\n : typeof dateOrOptions === 'string'\n ? new Date(dateOrOptions)\n : dateOrOptions.date instanceof Date\n ? dateOrOptions.date\n : new Date(dateOrOptions.date);\n await this.waitStep({ run, stepId, timeoutDate: date });\n },\n pause: async (stepId: string) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n await this.waitStep({ run, stepId, eventName: PAUSE_EVENT_NAME });\n },\n delay: async (stepId: string, duration: Duration) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n await this.waitStep({\n run,\n stepId,\n timeoutDate: new Date(Date.now() + parseDuration(duration)),\n });\n },\n get sleep() {\n return this.delay;\n },\n poll: async <T>(\n stepId: string,\n conditionFn: () => Promise<T | false>,\n options?: { interval?: Duration; timeout?: Duration },\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n const intervalMs = parseDuration(options?.interval ?? '30s');\n if (intervalMs < 30_000) {\n throw new WorkflowEngineError(\n `step.poll interval must be at least 30s (got ${intervalMs}ms)`,\n workflowId,\n runId,\n );\n }\n const timeoutMs = options?.timeout ? parseDuration(options.timeout) : undefined;\n return this.pollStep({ run, stepId, conditionFn, intervalMs, timeoutMs }) as Promise<\n { timedOut: false; data: T } | { timedOut: true }\n >;\n },\n invokeChildWorkflow: async <TInput extends InputParameters, TOutput = unknown>(\n stepId: string,\n refOrParams:\n | WorkflowRef<TInput, TOutput>\n | {\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n },\n inputArg?: InferInputParameters<TInput>,\n optionsArg?: StartWorkflowOptions,\n ) => {\n if (!run) {\n throw new WorkflowEngineError('Missing workflow run', workflowId, runId);\n }\n\n // Resolve overload input (typed ref or params object) into one shape\n // before handing off to the durable child-invocation implementation.\n const resolvedChildCall = this.resolveWorkflowRunParameters(\n refOrParams,\n inputArg,\n optionsArg,\n );\n const childWorkflowInvocation = {\n run,\n stepId,\n workflowId: resolvedChildCall.workflowId,\n input: resolvedChildCall.input,\n options: resolvedChildCall.options,\n resourceId: resolvedChildCall.resourceId,\n idempotencyKey: resolvedChildCall.idempotencyKey,\n };\n return this.invokeChildWorkflowStep(childWorkflowInvocation) as Promise<TOutput>;\n },\n };\n\n let step = { ...baseStep };\n const plugins = workflow.plugins ?? [];\n\n const context: WorkflowContext = {\n input: run.input as InferInputParameters<InputParameters>,\n workflowId: run.workflowId,\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n attempt: run.retryCount,\n get timeline() {\n // Read through to the live run so callers see entries written by\n // previously completed steps within the same handler invocation.\n return run?.timeline ?? {};\n },\n logger: this.logger,\n step,\n schedule: run.scheduledAt ? { timestamp: run.scheduledAt } : undefined,\n };\n\n for (const plugin of plugins) {\n const extra = plugin.methods(step, context);\n step = { ...step, ...extra };\n context.step = step;\n }\n\n let next: () => Promise<unknown> = () => workflow.handler(context);\n for (const plugin of [...plugins].reverse()) {\n if (plugin.wrap) {\n const inner = next;\n const wrap = plugin.wrap;\n next = () => wrap(context, inner);\n }\n }\n\n const result = await next();\n\n run = await this.getRun({ runId, resourceId: scopedResourceId });\n\n const isLastParsedStep = run.currentStepId === workflow.steps[workflow.steps.length - 1]?.id;\n const hasPluginSteps = (workflow.plugins?.length ?? 0) > 0;\n const noParsedSteps = workflow.steps.length === 0;\n const shouldComplete =\n run.status === WorkflowStatus.RUNNING &&\n (noParsedSteps || isLastParsedStep || (hasPluginSteps && result !== undefined));\n if (shouldComplete) {\n const normalizedResult = result === undefined ? {} : result;\n const completedRun = await this.updateRun({\n runId,\n resourceId: scopedResourceId,\n data: {\n status: WorkflowStatus.COMPLETED,\n output: normalizedResult,\n completedAt: new Date(),\n jobId: job?.id,\n },\n });\n await this.notifyParentOfChildTerminalRun(completedRun);\n\n this.logger.log('Workflow run completed.', {\n runId,\n workflowId,\n });\n }\n } catch (error) {\n // Persist the error so the DLQ handler can surface it after retries\n // are exhausted. pg-boss handles the retry-vs-DLQ decision based on\n // the per-job retryLimit set when the job was enqueued.\n if (runId) {\n const updatedRun = await this.updateRun({\n runId,\n resourceId: scopedResourceId,\n data: {\n error: error instanceof Error ? error.message : String(error),\n jobId: job?.id,\n },\n });\n if (\n updatedRun.status === WorkflowStatus.COMPLETED ||\n updatedRun.status === WorkflowStatus.FAILED ||\n updatedRun.status === WorkflowStatus.CANCELLED\n ) {\n await this.notifyParentOfChildTerminalRun(updatedRun);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Reconciles workflow runs whose retries pg-boss has exhausted (handler\n * threw on the final attempt, or worker died and missed the heartbeat\n * past the retry budget). The DLQ entry tells us the run is unrecoverable;\n * we mark it FAILED with whatever error message the catch block last\n * persisted, falling back to a worker-death message.\n */\n private async handleWorkflowRunDlq([job]: { data?: WorkflowRunJobParameters }[]) {\n const { runId } = job?.data ?? {};\n if (!runId) return;\n\n const run = await getWorkflowRun({ runId }, { db: this.db });\n if (!run || run.status !== WorkflowStatus.RUNNING) return;\n\n const failedRun = await this.updateRun({\n runId,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.FAILED,\n error: run.error ?? 'Workflow run worker died or job expired before completion',\n },\n });\n await this.notifyParentOfChildTerminalRun(failedRun);\n\n this.logger.log('Marked stuck workflow run as failed', {\n runId,\n workflowId: run.workflowId,\n });\n }\n\n private getCachedStepEntry(\n timeline: Record<string, unknown>,\n stepId: string,\n ): TimelineStepEntry | null {\n const stepEntry = timeline[stepId];\n return stepEntry && typeof stepEntry === 'object' && 'output' in stepEntry\n ? (stepEntry as TimelineStepEntry)\n : null;\n }\n\n private getWaitForStepEntry(\n timeline: Record<string, unknown>,\n stepId: string,\n ): TimelineWaitForEntry | null {\n const entry = timeline[waitForTimelineKey(stepId)];\n return entry && typeof entry === 'object' && 'waitFor' in entry\n ? (entry as TimelineWaitForEntry)\n : null;\n }\n\n private getInvokeChildWorkflowStepEntry(\n timeline: Record<string, unknown>,\n stepId: string,\n ): TimelineInvokeChildWorkflowEntry | null {\n const entry = timeline[invokeChildWorkflowTimelineKey(stepId)];\n return isInvokeChildWorkflowTimelineEntry(entry)\n ? (entry as TimelineInvokeChildWorkflowEntry)\n : null;\n }\n\n /**\n * Returns the cached output for a COMPLETED child run. Treats `undefined`\n * outputs as `{}` so the parent timeline always has a defined value.\n * Caller must ensure `childRun.status === COMPLETED` before calling.\n */\n private getCompletedChildOutput(childRun: WorkflowRun): unknown {\n return childRun.output === undefined ? {} : childRun.output;\n }\n\n /**\n * Throws a `WorkflowEngineError` describing why an invoked child run did not\n * produce output (it FAILED or was CANCELLED). The throw aborts the parent\n * step, which is then caught by `handleWorkflowRun` and marks the parent\n * FAILED with the same message — no fake sentinel value is ever written to\n * the parent timeline.\n */\n private throwForNonCompletedChild(childRun: WorkflowRun): never {\n throw new WorkflowEngineError(\n `Child workflow ${childRun.workflowId} ${childRun.status}${childRun.error ? `: ${childRun.error}` : ''}`,\n childRun.workflowId,\n childRun.id,\n );\n }\n\n private assertInvokeChildWorkflowStepOwnership({\n childRun,\n parentRun,\n stepId,\n workflowId,\n }: {\n childRun: WorkflowRun;\n parentRun: WorkflowRun;\n stepId: string;\n workflowId: string;\n }) {\n const expectedParentResourceId = parentRun.resourceId ?? null;\n const matches =\n childRun.workflowId === workflowId &&\n childRun.parentRunId === parentRun.id &&\n childRun.parentStepId === stepId &&\n childRun.parentResourceId === expectedParentResourceId;\n\n if (!matches) {\n throw new WorkflowEngineError(\n `Idempotency key resolved to workflow run ${childRun.id}, which does not belong to invokeChildWorkflow step '${stepId}'`,\n workflowId,\n parentRun.id,\n );\n }\n }\n\n // The whole step runs inside a single SELECT … FOR UPDATE transaction so that\n // every state transition (cache hit, terminal-child cache, fresh child create,\n // re-pause for a still-running existing child) sees a consistent parent row\n // and can never overwrite a status another worker just wrote (e.g. a\n // concurrent invoke-completion event flipping the parent to COMPLETED).\n //\n // The child run insert AND its pgboss.job enqueue both join this same\n // transaction. The parent pause, child run row, and child job all commit (or\n // roll back) together, so a worker crashing between \"parent paused\" and\n // \"child enqueued\" is impossible — there is no such interleaving window.\n private async invokeChildWorkflowStep({\n run,\n stepId,\n workflowId,\n input,\n resourceId,\n idempotencyKey,\n options,\n }: {\n run: WorkflowRun;\n stepId: string;\n workflowId: string;\n input: unknown;\n resourceId?: string;\n idempotencyKey?: string;\n options?: StartWorkflowOptions;\n }): Promise<unknown> {\n let invokeOutput: unknown;\n let hasInvokeOutput = false;\n const childResourceId = resourceId ?? run.resourceId ?? undefined;\n const childIdempotencyKey = idempotencyKey;\n\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const lockedRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n\n // If the parent isn't RUNNING, fall through and return `undefined`. The\n // worker's outer loop won't act on it: subsequent `step.run` calls\n // short-circuit the same way (see `runStep`), and the post-handler\n // `shouldComplete` check requires `status === RUNNING` so no terminal\n // state is written. Matches the pattern used by the other step kinds.\n if (\n lockedRun.status === WorkflowStatus.CANCELLED ||\n lockedRun.status === WorkflowStatus.PAUSED ||\n lockedRun.status === WorkflowStatus.FAILED\n ) {\n return;\n }\n\n const lockedCached = this.getCachedStepEntry(lockedRun.timeline, stepId);\n if (lockedCached?.output !== undefined) {\n invokeOutput = lockedCached.output;\n hasInvokeOutput = true;\n return;\n }\n\n const lockedInvoke = this.getInvokeChildWorkflowStepEntry(lockedRun.timeline, stepId);\n if (lockedInvoke) {\n const existingChildResourceId =\n 'childResourceId' in lockedInvoke.invokeChildWorkflow\n ? (lockedInvoke.invokeChildWorkflow.childResourceId ?? undefined)\n : childResourceId;\n const existingChildRun = await this.getRun({\n runId: lockedInvoke.invokeChildWorkflow.childRunId,\n resourceId: existingChildResourceId,\n });\n if (existingChildRun.status === WorkflowStatus.COMPLETED) {\n invokeOutput = this.getCompletedChildOutput(existingChildRun);\n hasInvokeOutput = true;\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n timeline: merge(lockedRun.timeline, {\n [stepId]: {\n output: invokeOutput,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n return;\n }\n if (\n existingChildRun.status === WorkflowStatus.FAILED ||\n existingChildRun.status === WorkflowStatus.CANCELLED\n ) {\n // No timeline write — let the throw roll back the txn (a no-op\n // here since we only did SELECTs) and bubble up so the parent\n // is marked FAILED by the worker's catch handler.\n this.throwForNonCompletedChild(existingChildRun);\n }\n\n // Child is still RUNNING/PAUSED. The original enqueue committed\n // with the prior parent-pause txn, so pg-boss already owns the\n // child job — re-pause the parent and wait for the next terminal\n // event without re-enqueueing.\n await this.pauseRunForWait({\n run: lockedRun,\n stepId,\n eventName: getInvokeChildWorkflowEventName(existingChildRun.id),\n skipOutput: true,\n db,\n });\n return;\n }\n\n const result = await this.createWorkflowRun({\n workflowId,\n input,\n resourceId: childResourceId,\n idempotencyKey: childIdempotencyKey,\n options,\n parentRunId: run.id,\n parentStepId: stepId,\n parentResourceId: run.resourceId ?? undefined,\n enqueue: true,\n db,\n });\n const childRun = result.run;\n\n if (!result.created) {\n this.assertInvokeChildWorkflowStepOwnership({\n childRun,\n parentRun: lockedRun,\n stepId,\n workflowId,\n });\n\n if (childRun.status === WorkflowStatus.COMPLETED) {\n invokeOutput = this.getCompletedChildOutput(childRun);\n hasInvokeOutput = true;\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n timeline: merge(lockedRun.timeline, {\n [invokeChildWorkflowTimelineKey(stepId)]: {\n invokeChildWorkflow: {\n childRunId: childRun.id,\n childWorkflowId: childRun.workflowId,\n childResourceId: childRun.resourceId,\n },\n timestamp: new Date(),\n },\n [stepId]: {\n output: invokeOutput,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n return;\n }\n if (\n childRun.status === WorkflowStatus.FAILED ||\n childRun.status === WorkflowStatus.CANCELLED\n ) {\n // Same throw-and-rollback contract as the existing-child branch:\n // we deliberately do NOT record the parent timeline binding for\n // a child we matched-by-idempotency-key but never owned the\n // creation of. The throw propagates and the parent fails.\n this.throwForNonCompletedChild(childRun);\n }\n }\n\n await this.pauseRunForWait({\n run: lockedRun,\n stepId,\n eventName: getInvokeChildWorkflowEventName(childRun.id),\n skipOutput: true,\n db,\n timeline: merge(lockedRun.timeline, {\n [invokeChildWorkflowTimelineKey(stepId)]: {\n invokeChildWorkflow: {\n childRunId: childRun.id,\n childWorkflowId: childRun.workflowId,\n childResourceId: childRun.resourceId,\n },\n timestamp: new Date(),\n },\n }),\n });\n },\n this.pool,\n );\n\n if (hasInvokeOutput) {\n return invokeOutput;\n }\n }\n\n private async pauseRunForWait({\n run,\n stepId,\n eventName,\n timeoutEvent,\n skipOutput,\n db,\n timeline,\n }: {\n run: WorkflowRun;\n stepId: string;\n eventName?: string;\n timeoutEvent?: string;\n skipOutput?: true;\n db?: Db;\n timeline?: Record<string, unknown>;\n }) {\n const baseTimeline = timeline ?? run.timeline;\n const waitFor: TimelineWaitForEntry['waitFor'] = {};\n if (eventName) waitFor.eventName = eventName;\n if (timeoutEvent) waitFor.timeoutEvent = timeoutEvent;\n if (skipOutput) waitFor.skipOutput = true;\n\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.PAUSED,\n currentStepId: stepId,\n pausedAt: new Date(),\n timeline: merge(baseTimeline, {\n [waitForTimelineKey(stepId)]: {\n waitFor,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n }\n\n private async runStep({\n stepId,\n run,\n handler,\n }: {\n stepId: string;\n run: WorkflowRun;\n handler: () => Promise<unknown>;\n }) {\n return withPostgresTransaction(\n this.db,\n async (db) => {\n const persistedRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n {\n exclusiveLock: true,\n db,\n },\n );\n\n if (\n persistedRun.status === WorkflowStatus.CANCELLED ||\n persistedRun.status === WorkflowStatus.PAUSED ||\n persistedRun.status === WorkflowStatus.FAILED\n ) {\n this.logger.log(`Step ${stepId} skipped, workflow run is ${persistedRun.status}`, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n return;\n }\n\n try {\n const cached = this.getCachedStepEntry(persistedRun.timeline, stepId);\n if (cached?.output !== undefined) {\n return cached.output;\n }\n\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n },\n },\n { db },\n );\n\n this.logger.log(`Running step ${stepId}...`, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n let output = await handler();\n\n if (output === undefined) {\n output = {};\n }\n\n const updated = await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n timeline: merge(persistedRun.timeline, {\n [stepId]: {\n output,\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n // Mutate in place so handleWorkflowRun's `run` (same reference)\n // — and the context.timeline getter that reads through it —\n // observes the new step entry.\n Object.assign(run, updated);\n\n return output;\n } catch (error) {\n this.logger.error(`Step ${stepId} failed:`, error as Error, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n await this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.FAILED,\n error: error instanceof Error ? `${error.message}\\n${error.stack}` : String(error),\n },\n },\n { db },\n );\n\n throw error;\n }\n },\n this.pool,\n );\n }\n\n private async waitStep({\n run,\n stepId,\n eventName,\n timeoutDate,\n }: {\n run: WorkflowRun;\n stepId: string;\n eventName?: string;\n timeoutDate?: Date;\n }): Promise<unknown> {\n const persistedRun = await this.getRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n });\n\n if (\n persistedRun.status === WorkflowStatus.CANCELLED ||\n persistedRun.status === WorkflowStatus.PAUSED ||\n persistedRun.status === WorkflowStatus.FAILED\n ) {\n return;\n }\n\n const cached = this.getCachedStepEntry(persistedRun.timeline, stepId);\n if (cached?.output !== undefined) {\n return cached.timedOut ? undefined : cached.output;\n }\n\n const timeoutEvent = timeoutDate ? `__timeout_${stepId}` : undefined;\n\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.pauseRunForWait({ run: freshRun, stepId, eventName, timeoutEvent, db });\n },\n this.pool,\n );\n\n if (timeoutDate && timeoutEvent) {\n try {\n const job: WorkflowRunJobParameters = {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n event: { name: timeoutEvent, data: { date: timeoutDate.toISOString() } },\n };\n await this.boss.send(WORKFLOW_RUN_QUEUE_NAME, job, {\n startAfter: timeoutDate.getTime() <= Date.now() ? new Date() : timeoutDate,\n expireInSeconds: defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n });\n } catch (error) {\n // Revert PAUSED status so the workflow can retry this step\n await this.updateRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: { status: WorkflowStatus.RUNNING, pausedAt: null },\n });\n throw error;\n }\n }\n\n this.logger.log(\n `Step ${stepId} waiting${eventName ? ` for event \"${eventName}\"` : ''}${timeoutDate ? ` until ${timeoutDate.toISOString()}` : ''}`,\n { runId: run.id, workflowId: run.workflowId },\n );\n }\n\n private async pollStep<T>({\n run,\n stepId,\n conditionFn,\n intervalMs,\n timeoutMs,\n }: {\n run: WorkflowRun;\n stepId: string;\n conditionFn: () => Promise<T | false>;\n intervalMs: number;\n timeoutMs?: number;\n }): Promise<{ timedOut: false; data: T } | { timedOut: true } | undefined> {\n const persistedRun = await this.getRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n });\n\n if (\n persistedRun.status === WorkflowStatus.CANCELLED ||\n persistedRun.status === WorkflowStatus.PAUSED ||\n persistedRun.status === WorkflowStatus.FAILED\n ) {\n return { timedOut: true };\n }\n\n const cached = this.getCachedStepEntry(persistedRun.timeline, stepId);\n if (cached?.output !== undefined) {\n return cached.timedOut ? { timedOut: true } : { timedOut: false, data: cached.output as T };\n }\n\n const pollStateEntry = persistedRun.timeline[`${stepId}-poll`];\n const startedAt =\n pollStateEntry && typeof pollStateEntry === 'object' && 'startedAt' in pollStateEntry\n ? new Date((pollStateEntry as { startedAt: string }).startedAt)\n : new Date();\n\n if (timeoutMs !== undefined && Date.now() >= startedAt.getTime() + timeoutMs) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n timeline: merge(freshRun.timeline, {\n [stepId]: { output: {}, timedOut: true as const, timestamp: new Date() },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n return { timedOut: true };\n }\n\n let result: T | false;\n try {\n result = await conditionFn();\n } catch (error) {\n this.logger.error(\n `Poll conditionFn for step ${stepId} threw an error, treating as non-match and continuing to poll`,\n error as Error,\n { runId: run.id, workflowId: run.workflowId },\n );\n\n // If the poll has timed out, respect the timeout even though conditionFn threw\n if (timeoutMs !== undefined && Date.now() >= startedAt.getTime() + timeoutMs) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n timeline: merge(freshRun.timeline, {\n [stepId]: { output: {}, timedOut: true as const, timestamp: new Date() },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n return { timedOut: true };\n }\n\n result = false;\n }\n\n if (result !== false) {\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n currentStepId: stepId,\n timeline: merge(freshRun.timeline, {\n [stepId]: { output: result, timestamp: new Date() },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n return { timedOut: false, data: result };\n }\n\n const pollEvent = `__poll_${stepId}`;\n await withPostgresTransaction(\n this.db,\n async (db) => {\n const freshRun = await this.getRun(\n { runId: run.id, resourceId: run.resourceId ?? undefined },\n { exclusiveLock: true, db },\n );\n return this.updateRun(\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: {\n status: WorkflowStatus.PAUSED,\n currentStepId: stepId,\n pausedAt: new Date(),\n timeline: merge(freshRun.timeline, {\n [`${stepId}-poll`]: { startedAt: startedAt.toISOString() },\n [waitForTimelineKey(stepId)]: {\n waitFor: { timeoutEvent: pollEvent, skipOutput: true },\n timestamp: new Date(),\n },\n }),\n },\n },\n { db },\n );\n },\n this.pool,\n );\n\n try {\n await this.boss.send(\n WORKFLOW_RUN_QUEUE_NAME,\n {\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n workflowId: run.workflowId,\n input: run.input,\n event: { name: pollEvent, data: {} },\n },\n {\n startAfter: new Date(Date.now() + intervalMs),\n expireInSeconds: defaultExpireInSeconds,\n ...retrySendOptions(run.maxRetries),\n },\n );\n } catch (error) {\n // Revert PAUSED status so the workflow can retry this step\n await this.updateRun({\n runId: run.id,\n resourceId: run.resourceId ?? undefined,\n data: { status: WorkflowStatus.RUNNING, pausedAt: null },\n });\n throw error;\n }\n\n this.logger.log(`Step ${stepId} polling every ${intervalMs}ms...`, {\n runId: run.id,\n workflowId: run.workflowId,\n });\n\n return { timedOut: false, data: undefined as T };\n }\n\n private async checkIfHasStarted(): Promise<void> {\n if (!this._started) {\n throw new WorkflowEngineError('Workflow engine not started');\n }\n }\n\n private buildLogger(logger: WorkflowLogger): WorkflowInternalLogger {\n return {\n log: (message: string, context?: WorkflowInternalLoggerContext) => {\n const { runId, workflowId } = context ?? {};\n const parts = [LOG_PREFIX, workflowId, runId].filter(Boolean).join(' ');\n logger.log(`${parts}: ${message}`);\n },\n error: (message: string, error: Error, context?: WorkflowInternalLoggerContext) => {\n const { runId, workflowId } = context ?? {};\n const parts = [LOG_PREFIX, workflowId, runId].filter(Boolean).join(' ');\n logger.error(`${parts}: ${message}`, error);\n },\n };\n }\n\n async getRuns({\n resourceId,\n startingAfter,\n endingBefore,\n limit = 20,\n statuses,\n workflowId,\n }: {\n resourceId?: string;\n startingAfter?: string | null;\n endingBefore?: string | null;\n limit?: number;\n statuses?: WorkflowStatus[];\n workflowId?: string;\n }): Promise<{\n items: WorkflowRun[];\n nextCursor: string | null;\n prevCursor: string | null;\n hasMore: boolean;\n hasPrev: boolean;\n }> {\n if (workflowId) validateWorkflowId(workflowId);\n validateResourceId(resourceId);\n\n return getWorkflowRuns(\n {\n resourceId,\n startingAfter,\n endingBefore,\n limit,\n statuses,\n workflowId,\n },\n this.db,\n );\n }\n}\n",
13
13
  "import * as ts from 'typescript';\nimport type { StepInternalDefinition, WorkflowContext } from './types';\nimport { StepType } from './types';\n\ntype ParseWorkflowHandlerReturnType = {\n steps: StepInternalDefinition[];\n};\n\nexport function parseWorkflowHandler(\n handler: (context: WorkflowContext) => Promise<unknown>,\n): ParseWorkflowHandlerReturnType {\n const handlerSource = handler.toString();\n const sourceFile = ts.createSourceFile('handler.ts', handlerSource, ts.ScriptTarget.Latest, true);\n\n const steps: Map<string, StepInternalDefinition> = new Map();\n\n function isInConditional(node: ts.Node): boolean {\n let current = node.parent;\n while (current) {\n if (\n ts.isIfStatement(current) ||\n ts.isConditionalExpression(current) ||\n ts.isSwitchStatement(current) ||\n ts.isCaseClause(current)\n ) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n function isInLoop(node: ts.Node): boolean {\n let current = node.parent;\n while (current) {\n if (\n ts.isForStatement(current) ||\n ts.isForInStatement(current) ||\n ts.isForOfStatement(current) ||\n ts.isWhileStatement(current) ||\n ts.isDoStatement(current)\n ) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n function extractStepId(arg: ts.Expression): {\n id: string;\n isDynamic: boolean;\n } {\n if (ts.isStringLiteral(arg) || ts.isNoSubstitutionTemplateLiteral(arg)) {\n return { id: arg.text, isDynamic: false };\n }\n\n if (ts.isTemplateExpression(arg)) {\n let templateStr = arg.head.text;\n for (const span of arg.templateSpans) {\n templateStr += `\\${...}`;\n templateStr += span.literal.text;\n }\n return { id: templateStr, isDynamic: true };\n }\n\n return { id: arg.getText(sourceFile), isDynamic: true };\n }\n\n function visit(node: ts.Node) {\n if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {\n const propertyAccess = node.expression;\n const objectName = propertyAccess.expression.getText(sourceFile);\n const methodName = propertyAccess.name.text;\n\n if (\n objectName === 'step' &&\n (methodName === 'run' ||\n methodName === 'waitFor' ||\n methodName === 'pause' ||\n methodName === 'waitUntil' ||\n methodName === 'delay' ||\n methodName === 'sleep' ||\n methodName === 'poll' ||\n methodName === 'invokeChildWorkflow')\n ) {\n const firstArg = node.arguments[0];\n if (firstArg) {\n const { id, isDynamic } = extractStepId(firstArg);\n const stepType = methodName === 'sleep' ? StepType.DELAY : (methodName as StepType);\n\n const stepDefinition: StepInternalDefinition = {\n id,\n type: stepType,\n conditional: isInConditional(node),\n loop: isInLoop(node),\n isDynamic,\n };\n\n if (steps.has(id)) {\n throw new Error(\n `Duplicate step ID detected: '${id}'. Step IDs must be unique within a workflow.`,\n );\n }\n\n steps.set(id, stepDefinition);\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n\n return { steps: Array.from(steps.values()) };\n}\n",
14
14
  "import parse from 'parse-duration';\nimport { WorkflowEngineError } from './error';\n\nexport type DurationObject = {\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n};\n\nexport type Duration = string | DurationObject;\n\nconst MS_PER_SECOND: number = 1000;\nexport const MS_PER_MINUTE: number = 60 * MS_PER_SECOND;\nexport const MS_PER_HOUR: number = 60 * MS_PER_MINUTE;\nexport const MS_PER_DAY: number = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK: number = 7 * MS_PER_DAY;\n\nexport function parseDuration(duration: Duration): number {\n if (typeof duration === 'string') {\n if (duration.trim() === '') {\n throw new WorkflowEngineError('Invalid duration: empty string');\n }\n\n const ms = parse(duration);\n\n if (ms == null || ms <= 0) {\n throw new WorkflowEngineError(`Invalid duration: \"${duration}\"`);\n }\n\n return ms;\n }\n\n const { weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0 } = duration;\n\n const ms =\n weeks * MS_PER_WEEK +\n days * MS_PER_DAY +\n hours * MS_PER_HOUR +\n minutes * MS_PER_MINUTE +\n seconds * MS_PER_SECOND;\n\n if (ms <= 0) {\n throw new WorkflowEngineError('Invalid duration: must be a positive value');\n }\n\n return ms;\n}\n",
15
15
  "import { CronExpressionParser } from 'cron-parser';\nimport { type Duration, MS_PER_DAY, MS_PER_HOUR, MS_PER_MINUTE, parseDuration } from './duration';\nimport { WorkflowEngineError } from './error';\n\nconst CRON_TOKEN = /^[0-9*/,?\\-LW#]+$/;\n\nexport type Schedule = string | Exclude<Duration, string>;\n\ntype ResolvedSchedule = {\n cron: string;\n timezone: string;\n};\n\nfunction looksLikeCronString(value: string): boolean {\n const tokens = value.trim().split(/\\s+/);\n if (tokens.length !== 5 && tokens.length !== 6) return false;\n return tokens.every((t) => CRON_TOKEN.test(t));\n}\n\nfunction validateCronExpression(expression: string, timezone: string): void {\n try {\n CronExpressionParser.parse(expression, { tz: timezone });\n } catch (e) {\n throw new WorkflowEngineError(\n `Invalid cron expression \"${expression}\" (timezone: ${timezone}): ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n}\n\nfunction durationMsToCron(ms: number, original: Duration): string {\n if (ms < MS_PER_MINUTE) {\n throw new WorkflowEngineError(\n `Schedule interval must be at least 1 minute; got ${ms}ms from ${JSON.stringify(original)}`,\n );\n }\n\n if (ms % MS_PER_DAY === 0) {\n const days = ms / MS_PER_DAY;\n if (days === 1) return '0 0 * * *';\n throw cronStepError(original, `${days} days`);\n }\n\n if (ms % MS_PER_HOUR === 0) {\n const hours = ms / MS_PER_HOUR;\n if (24 % hours === 0) return `0 */${hours} * * *`;\n throw cronStepError(original, `${hours} hours`);\n }\n\n const minutes = ms / MS_PER_MINUTE;\n if (Number.isInteger(minutes) && 60 % minutes === 0) return `*/${minutes} * * * *`;\n throw cronStepError(original, `${minutes} minutes`);\n}\n\nfunction cronStepError(original: Duration, label: string): WorkflowEngineError {\n return new WorkflowEngineError(\n `Schedule interval ${JSON.stringify(original)} (${label}) doesn't map cleanly to a recurring cron expression. Use a value that divides 60 minutes, 24 hours, or 1 day — or pass an explicit cron string.`,\n );\n}\n\n/**\n * Resolve a `schedule` option (cron string OR duration) to a cron expression\n * plus timezone. Throws with a helpful message on bad input.\n */\nexport function resolveSchedule(schedule: Schedule, timezone?: string): ResolvedSchedule {\n const tz = timezone ?? 'UTC';\n\n if (typeof schedule === 'string' && looksLikeCronString(schedule)) {\n validateCronExpression(schedule, tz);\n return { cron: schedule, timezone: tz };\n }\n\n // Duration string, DurationObject, or string that didn't match cron-charset.\n // `parseDuration` throws for empty strings and unparseable input; `durationMsToCron`\n // only ever emits cron expressions we construct ourselves, so no further validation needed.\n const ms = parseDuration(schedule);\n return { cron: durationMsToCron(ms, schedule), timezone: tz };\n}\n",
16
16
  "import {\n type AttributeValue,\n context as otelContext,\n SpanStatusCode,\n type Tracer,\n trace,\n} from '@opentelemetry/api';\nimport { invokeChildWorkflowTimelineKey } from '../constants';\nimport type { StepBaseContext, WorkflowContext, WorkflowPlugin } from '../types';\n\nexport type OtelPluginOptions = {\n /** Tracer to use. Defaults to `trace.getTracer('pg-workflows')`. */\n tracer?: Tracer;\n /** Prefix for all span names. Defaults to `pg_workflows`. */\n spanNamePrefix?: string;\n /** Extra attributes merged onto the workflow.run span. */\n attributes?: (context: WorkflowContext) => Record<string, AttributeValue>;\n};\n\nconst DEFAULT_PREFIX = 'pg_workflows';\n\ntype StepKind =\n | 'run'\n | 'waitFor'\n | 'delay'\n | 'waitUntil'\n | 'pause'\n | 'poll'\n | 'invokeChildWorkflow';\n\nexport function isCachedHit(\n timeline: Record<string, unknown>,\n stepId: string,\n kind: StepKind,\n): boolean {\n const entry = timeline[stepId];\n if (\n entry &&\n typeof entry === 'object' &&\n 'output' in entry &&\n (entry as { output: unknown }).output !== undefined\n ) {\n return true;\n }\n if (kind === 'invokeChildWorkflow' && timeline[invokeChildWorkflowTimelineKey(stepId)]) {\n return true;\n }\n return false;\n}\n\nexport function otelPlugin(\n options: OtelPluginOptions = {},\n): WorkflowPlugin<StepBaseContext, object> {\n const tracer = options.tracer ?? trace.getTracer('pg-workflows');\n const prefix = options.spanNamePrefix ?? DEFAULT_PREFIX;\n const extraAttrs = options.attributes;\n\n return {\n name: 'opentelemetry',\n\n methods: (step, context) => {\n const wrapVoidish = <Args extends unknown[], R>(\n kind: 'waitFor' | 'delay' | 'waitUntil' | 'pause',\n base: (stepId: string, ...args: Args) => Promise<R>,\n ) => {\n return async (stepId: string, ...args: Args): Promise<R> => {\n if (isCachedHit(context.timeline, stepId, kind)) {\n return base(stepId, ...args);\n }\n const capturedCtx = otelContext.active();\n const startTime = new Date();\n let result: R;\n let originalErr: unknown;\n let thrownError: Error | undefined;\n try {\n result = await base(stepId, ...args);\n } catch (err) {\n originalErr = err;\n thrownError = err instanceof Error ? err : new Error(String(err));\n }\n const span = tracer.startSpan(\n `${prefix}.step.${kind}`,\n {\n startTime,\n attributes: { 'step.id': stepId, 'step.type': kind },\n },\n capturedCtx,\n );\n if (thrownError) {\n span.recordException(thrownError);\n span.setStatus({ code: SpanStatusCode.ERROR, message: thrownError.message });\n span.end();\n throw originalErr;\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n // biome-ignore lint/style/noNonNullAssertion: result is assigned in try when not thrown\n return result!;\n };\n };\n\n return {\n run: async <T>(stepId: string, handler: () => Promise<T>) => {\n if (isCachedHit(context.timeline, stepId, 'run')) {\n return step.run(stepId, handler);\n }\n\n // Capture the active context (workflow.run span) and the start time\n // BEFORE running the step, so the emitted span has correct timing.\n // We materialise the span only if the step actually ran or threw —\n // skipped steps (engine short-circuit on paused/cancelled runs) return\n // undefined and produce no span.\n const capturedCtx = otelContext.active();\n const startTime = new Date();\n let result: T | undefined;\n let originalErr: unknown;\n let thrownError: Error | undefined;\n\n try {\n result = await step.run(stepId, handler);\n } catch (err) {\n originalErr = err;\n thrownError = err instanceof Error ? err : new Error(String(err));\n }\n\n if (result === undefined && !thrownError) {\n return undefined as T;\n }\n\n const span = tracer.startSpan(\n `${prefix}.step.run`,\n {\n startTime,\n attributes: { 'step.id': stepId, 'step.type': 'run' },\n },\n capturedCtx,\n );\n\n if (thrownError) {\n span.recordException(thrownError);\n span.setStatus({ code: SpanStatusCode.ERROR, message: thrownError.message });\n span.end();\n throw originalErr;\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result as T;\n },\n waitFor: wrapVoidish('waitFor', step.waitFor as never) as StepBaseContext['waitFor'],\n delay: wrapVoidish('delay', step.delay as never) as StepBaseContext['delay'],\n sleep: wrapVoidish('delay', step.delay as never) as StepBaseContext['sleep'],\n waitUntil: wrapVoidish(\n 'waitUntil',\n step.waitUntil as never,\n ) as StepBaseContext['waitUntil'],\n pause: wrapVoidish('pause', step.pause as never) as StepBaseContext['pause'],\n poll: (async <T>(\n stepId: string,\n conditionFn: () => Promise<T | false>,\n pollOptions?: Parameters<StepBaseContext['poll']>[2],\n ) => {\n const capturedCtx = otelContext.active();\n const startTime = new Date();\n let result: Awaited<ReturnType<StepBaseContext['poll']>> | undefined;\n let originalErr: unknown;\n let thrownError: Error | undefined;\n try {\n result = await step.poll(stepId, conditionFn, pollOptions);\n } catch (err) {\n originalErr = err;\n thrownError = err instanceof Error ? err : new Error(String(err));\n }\n const span = tracer.startSpan(\n `${prefix}.step.poll`,\n {\n startTime,\n attributes: { 'step.id': stepId, 'step.type': 'poll' },\n },\n capturedCtx,\n );\n if (thrownError) {\n span.recordException(thrownError);\n span.setStatus({ code: SpanStatusCode.ERROR, message: thrownError.message });\n span.end();\n throw originalErr;\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n // biome-ignore lint/style/noNonNullAssertion: result is assigned in try when not thrown\n return result!;\n }) as StepBaseContext['poll'],\n invokeChildWorkflow: (async (\n stepId: string,\n refOrParams: Parameters<StepBaseContext['invokeChildWorkflow']>[1],\n inputArg?: unknown,\n optionsArg?: unknown,\n ) => {\n if (isCachedHit(context.timeline, stepId, 'invokeChildWorkflow')) {\n return (step.invokeChildWorkflow as (...args: unknown[]) => Promise<unknown>)(\n stepId,\n refOrParams,\n inputArg,\n optionsArg,\n );\n }\n const capturedCtx = otelContext.active();\n const startTime = new Date();\n let result: unknown;\n let originalErr: unknown;\n let thrownError: Error | undefined;\n try {\n result = await (step.invokeChildWorkflow as (...args: unknown[]) => Promise<unknown>)(\n stepId,\n refOrParams,\n inputArg,\n optionsArg,\n );\n } catch (err) {\n originalErr = err;\n thrownError = err instanceof Error ? err : new Error(String(err));\n }\n const span = tracer.startSpan(\n `${prefix}.step.invokeChildWorkflow`,\n {\n startTime,\n attributes: { 'step.id': stepId, 'step.type': 'invokeChildWorkflow' },\n },\n capturedCtx,\n );\n if (thrownError) {\n span.recordException(thrownError);\n span.setStatus({ code: SpanStatusCode.ERROR, message: thrownError.message });\n span.end();\n throw originalErr;\n }\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n }) as StepBaseContext['invokeChildWorkflow'],\n };\n },\n\n wrap: (context, next) =>\n tracer.startActiveSpan(\n `${prefix}.workflow.run`,\n {\n attributes: {\n 'workflow.id': context.workflowId,\n 'workflow.run_id': context.runId,\n 'workflow.attempt': context.attempt,\n ...(context.resourceId ? { 'workflow.resource_id': context.resourceId } : {}),\n ...(extraAttrs ? extraAttrs(context) : {}),\n },\n },\n async (span) => {\n try {\n const result = await next();\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n span.recordException(error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n throw err;\n } finally {\n span.end();\n }\n },\n ),\n };\n}\n"
17
17
  ],
18
- "mappings": "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",
19
- "debugId": "12905C6BC12C3A1664756E2164756E21",
18
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB,IAAtB;AACe,IAAf;AACgC,IAAhC;;;ACFO,IAAM,mBAAmB;AACzB,IAAM,0BAA0B;AAChC,IAAM,8BAA8B;AAG3C,IAAM,wBAAwB;AACvB,IAAM,uBAAuB,CAAC,eACnC,GAAG,wBAAwB;AACtB,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAK/B,IAAM,wCAAwC;AAC9C,IAAM,2BAA2B;AACjC,IAAM,iCAAiC,CAAC,WAC7C,GAAG,UAAU;AACR,IAAM,qBAAqB,CAAC,WAAmB,GAAG,UAAU;AAQ5D,IAAM,qCAAqC,CAChD,UAEA,CAAC,CAAC,SAAS,OAAO,UAAU,aAAY,yBAAyB;;;AC3B5D,IAAM,oBAAoB;AAIjC,IAAM,yBAAyB;AAE/B,eAAsB,aAAa,CAAC,IAAuB;AAAA,EAGzD,IAAI,MAAM,iBAAiB,EAAE,GAAG;AAAA,IAC9B;AAAA,EACF;AAAA,EAOA,MAAM,iBAAiB,MAAM,kBAAkB,EAAE;AAAA,EAEjD,MAAM,WAAqB,CAAC;AAAA,EAE5B,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAqBb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,EACH;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK,oDAAoD;AAAA,IAClE,SAAS,KAAK,oDAAoD;AAAA,IAClE,SAAS,KACP,iFACF;AAAA,IACA,SAAS,KAAK;AAAA;AAAA,KAEb;AAAA,EACH;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK,sEAAsE;AAAA,IACpF,SAAS,KAAK,sEAAsE;AAAA,EACtF;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KAAK,8EAA8E;AAAA,IAC5F,SAAS,KAAK,gFAAgF;AAAA,IAC9F,SAAS,KACP,oFACF;AAAA,EACF;AAAA,EAEA,IAAI,iBAAiB,GAAG;AAAA,IACtB,SAAS,KACP,0FACF;AAAA,EACF;AAAA,EAGA,IAAI,mBAAmB,GAAG;AAAA,IACxB,SAAS,KACP,yDAAyD,yBAC3D;AAAA,EACF,EAAO;AAAA,IACL,SAAS,KAAK,gDAAgD,wBAAwB;AAAA;AAAA,EAGxF,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,gCAAgC;AAAA,IAChC;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF,EAAE,KAAK;AAAA,CAAK;AAAA,EAEZ,MAAM,GAAG,WAAW,KAAK,CAAC,CAAC;AAAA;AAG7B,eAAe,gBAAgB,CAAC,IAA0B;AAAA,EACxD,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,GAAG,WAAW,uDAAuD,CAAC,CAAC;AAAA,IAC5F,QACI,OAAO,KAAK,IAAwC,WAAW,MAAM;AAAA,IAEzE,MAAM;AAAA,IAEN,OAAO;AAAA;AAAA;AAIX,eAAe,iBAAiB,CAAC,IAAyB;AAAA,EACxD,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,GAAG,WAAW,uDAAuD,CAAC,CAAC;AAAA,IAC5F,OAAQ,OAAO,KAAK,IAAwC,WAAW;AAAA,IACvE,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;AC1IO,IAAlB;AAIO,SAAS,aAAa,CAAC,QAAyB;AAAA,EACrD,OAAO,GAAG,SAAS,GAAG,YAAY,KAAK,qBAAM,WAAW,EAAE;AAAA;AA6B5D,SAAS,mBAAmB,CAAC,KAAkC;AAAA,EAC7D,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,IAClC,WAAW,IAAI,KAAK,IAAI,UAAU;AAAA,IAClC,YAAY,IAAI;AAAA,IAChB,YAAY,IAAI;AAAA,IAChB,QAAQ,IAAI;AAAA,IACZ,OAAO,OAAO,IAAI,UAAU,WAAW,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,IACnE,QACE,OAAO,IAAI,WAAW,WAClB,IAAI,OAAO,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,OAAO,KAAK,EAAE,WAAW,GAAG,IACnE,KAAK,MAAM,IAAI,MAAM,IACrB,IAAI,SACL,IAAI,UAAU;AAAA,IACrB,OAAO,IAAI;AAAA,IACX,eAAe,IAAI;AAAA,IACnB,UAAU,OAAO,IAAI,aAAa,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI;AAAA,IAC5E,UAAU,IAAI,YAAY,IAAI,KAAK,IAAI,SAAS,IAAI;AAAA,IACpD,WAAW,IAAI,aAAa,IAAI,KAAK,IAAI,UAAU,IAAI;AAAA,IACvD,aAAa,IAAI,eAAe,IAAI,KAAK,IAAI,YAAY,IAAI;AAAA,IAC7D,WAAW,IAAI,aAAa,IAAI,KAAK,IAAI,UAAU,IAAI;AAAA,IACvD,YAAY,IAAI;AAAA,IAChB,YAAY,IAAI;AAAA,IAChB,OAAO,IAAI;AAAA,IACX,gBAAgB,IAAI;AAAA,IACpB,aAAa,IAAI;AAAA,IACjB,cAAc,IAAI;AAAA,IAClB,kBAAkB,IAAI;AAAA,IACtB,aAAa,IAAI,eAAe,IAAI,KAAK,IAAI,YAAY,IAAI;AAAA,EAC/D;AAAA;AAGF,eAAsB,iBAAiB;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAeF,IACiD;AAAA,EACjD,MAAM,QAAQ,cAAc,KAAK;AAAA,EACjC,MAAM,MAAM,IAAI;AAAA,EAEhB,MAAM,SAAS,MAAM,GAAG,WACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAsBA;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,eAAe;AAAA,EACjB,CACF;AAAA,EAEA,IAAI,OAAO,KAAK,IAAI;AAAA,IAClB,OAAO,EAAE,KAAK,oBAAoB,OAAO,KAAK,EAAE,GAAG,SAAS,KAAK;AAAA,EACnE;AAAA,EAGA,MAAM,WAAW,MAAM,GAAG,WAAW,0DAA0D;AAAA,IAC7F;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,IACrB,MAAM,IAAI,MAAM,yDAAyD,iBAAiB;AAAA,EAC5F;AAAA,EAEA,OAAO,EAAE,KAAK,oBAAoB,SAAS,KAAK,EAAE,GAAG,SAAS,MAAM;AAAA;AAGtE,eAAsB,cAAc;AAAA,EAEhC;AAAA,EACA;AAAA,KAKA,gBAAgB,OAAO,MACI;AAAA,EAC7B,MAAM,aAAa,gBAAgB,eAAe;AAAA,EAElD,MAAM,SAAS,aACX,MAAM,GAAG,WACP;AAAA;AAAA,UAEE,cACF,CAAC,OAAO,UAAU,CACpB,IACA,MAAM,GAAG,WACP;AAAA;AAAA,UAEE,cACF,CAAC,KAAK,CACR;AAAA,EAEJ,MAAM,MAAM,OAAO,KAAK;AAAA,EAExB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,GAAG;AAAA;AAGhC,eAAsB,kBAAkB;AAAA,EAEpC;AAAA,EACA;AAAA,GAKF,IAC6B;AAAA,EAC7B,MAAM,SAAS,aACX,MAAM,GAAG,WACP;AAAA;AAAA;AAAA,mBAIA,CAAC,YAAY,UAAU,CACzB,IACA,MAAM,GAAG,WACP;AAAA;AAAA;AAAA,mBAIA,CAAC,UAAU,CACb;AAAA,EAEJ,MAAM,MAAM,OAAO,KAAK;AAAA,EACxB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,OAAO,oBAAoB,GAAG;AAAA;AAGhC,eAAsB,iBAAiB;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAOF,IAC6B;AAAA,EAC7B,MAAM,MAAM,IAAI;AAAA,EAEhB,MAAM,UAAoB,CAAC,iBAAiB;AAAA,EAC5C,MAAM,SAAuD,CAAC,GAAG;AAAA,EACjE,IAAI,aAAa;AAAA,EAEjB,IAAI,KAAK,WAAW,WAAW;AAAA,IAC7B,QAAQ,KAAK,aAAa,YAAY;AAAA,IACtC,OAAO,KAAK,KAAK,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EACA,IAAI,KAAK,kBAAkB,WAAW;AAAA,IACpC,QAAQ,KAAK,sBAAsB,YAAY;AAAA,IAC/C,OAAO,KAAK,KAAK,aAAa;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,aAAa,WAAW;AAAA,IAC/B,QAAQ,KAAK,eAAe,YAAY;AAAA,IACxC,OAAO,KAAK,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,IACzC;AAAA,EACF;AAAA,EACA,IAAI,KAAK,aAAa,WAAW;AAAA,IAC/B,QAAQ,KAAK,gBAAgB,YAAY;AAAA,IACzC,OAAO,KAAK,KAAK,QAAQ;AAAA,IACzB;AAAA,EACF;AAAA,EACA,IAAI,KAAK,cAAc,WAAW;AAAA,IAChC,QAAQ,KAAK,iBAAiB,YAAY;AAAA,IAC1C,OAAO,KAAK,KAAK,SAAS;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,gBAAgB,WAAW;AAAA,IAClC,QAAQ,KAAK,mBAAmB,YAAY;AAAA,IAC5C,OAAO,KAAK,KAAK,WAAW;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,WAAW,WAAW;AAAA,IAC7B,QAAQ,KAAK,aAAa,YAAY;AAAA,IACtC,OAAO,KAAK,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EACA,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B,QAAQ,KAAK,YAAY,YAAY;AAAA,IACrC,OAAO,KAAK,KAAK,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EACA,IAAI,KAAK,eAAe,WAAW;AAAA,IACjC,QAAQ,KAAK,kBAAkB,YAAY;AAAA,IAC3C,OAAO,KAAK,KAAK,UAAU;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B,QAAQ,KAAK,aAAa,YAAY;AAAA,IACtC,OAAO,KAAK,KAAK,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,KAAK,KAAK;AAAA,EACjB,MAAM,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AAAA,IACd,OAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAI,oBAAoB,iBAAiB,SAAS,GAAG;AAAA,IACnD,OAAO,KAAK,gBAAgB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,IAAI,cAAc,aACd,eAAe,8BAA8B,UAAU,MACvD,eAAe;AAAA,EAEnB,IAAI,oBAAoB,iBAAiB,SAAS,GAAG;AAAA,IACnD,eAAe,sBAAsB,aAAa;AAAA,EACpD;AAAA,EAEA,MAAM,QAAQ;AAAA;AAAA,UAEN,QAAQ,KAAK,IAAI;AAAA,MACrB;AAAA;AAAA;AAAA,EAIJ,MAAM,SAAS,MAAM,GAAG,WAAW,OAAO,MAAM;AAAA,EAChD,MAAM,MAAM,OAAO,KAAK;AAAA,EAExB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,GAAG;AAAA;AAGhC,eAAsB,eAAe;AAAA,EAEjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,GASF,IAOC;AAAA,EACD,MAAM,aAAuB,CAAC;AAAA,EAC9B,MAAM,SAAgD,CAAC;AAAA,EACvD,IAAI,aAAa;AAAA,EAEjB,IAAI,YAAY;AAAA,IACd,WAAW,KAAK,kBAAkB,YAAY;AAAA,IAC9C,OAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAI,YAAY,SAAS,SAAS,GAAG;AAAA,IACnC,WAAW,KAAK,iBAAiB,aAAa;AAAA,IAC9C,OAAO,KAAK,QAAQ;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,IAAI,YAAY;AAAA,IACd,WAAW,KAAK,kBAAkB,YAAY;AAAA,IAC9C,OAAO,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,CAAC,eAAe,YAAY,EAAE,OAAO,OAAO;AAAA,EAC9D,IAAI,UAAU,SAAS,GAAG;AAAA,IACxB,MAAM,eAAe,MAAM,GAAG,WAC5B,+DACA,CAAC,SAAS,CACZ;AAAA,IACA,MAAM,YAAY,IAAI;AAAA,IACtB,WAAW,OAAO,aAAa,MAAM;AAAA,MACnC,UAAU,IACR,IAAI,IACJ,OAAO,IAAI,eAAe,WAAW,IAAI,KAAK,IAAI,UAAU,IAAI,IAAI,UACtE;AAAA,IACF;AAAA,IAEA,IAAI,eAAe;AAAA,MACjB,MAAM,SAAS,UAAU,IAAI,aAAa;AAAA,MAC1C,IAAI,QAAQ;AAAA,QACV,WAAW,KAAK,iBAAiB,YAAY;AAAA,QAC7C,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,MAAM,SAAS,UAAU,IAAI,YAAY;AAAA,MACzC,IAAI,QAAQ;AAAA,QACV,WAAW,KAAK,iBAAiB,YAAY;AAAA,QAC7C,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,WAAW,SAAS,IAAI,SAAS,WAAW,KAAK,OAAO,MAAM;AAAA,EAClF,MAAM,cAAc,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI;AAAA,EAExD,MAAM,aAAa,CAAC,CAAC,gBAAgB,CAAC;AAAA,EAEtC,MAAM,QAAQ;AAAA;AAAA,MAEV;AAAA,0BACoB,aAAa,QAAQ;AAAA,aAClC;AAAA;AAAA,EAEX,OAAO,KAAK,WAAW;AAAA,EAEvB,MAAM,SAAS,MAAM,GAAG,WAAW,OAAO,MAAM;AAAA,EAChD,MAAM,OAAO,OAAO;AAAA,EAEpB,MAAM,cAAc,KAAK,UAAU,SAAS;AAAA,EAC5C,MAAM,WAAW,cAAc,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,EAEtD,IAAI,YAAY;AAAA,IACd,SAAS,QAAQ;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ,SAAS,IAAI,CAAC,QAAQ,oBAAoB,GAAG,CAAC;AAAA,EAE5D,MAAM,UAAU,aAAa,MAAM,SAAS,IAAI;AAAA,EAChD,MAAM,UAAU,aAAa,cAAc,CAAC,CAAC,iBAAiB,MAAM,SAAS;AAAA,EAE7E,MAAM,aAAa,WAAW,MAAM,SAAS,IAAK,MAAM,MAAM,SAAS,IAAI,MAAM,OAAQ;AAAA,EACzF,MAAM,aAAa,WAAW,MAAM,SAAS,IAAK,MAAM,IAAI,MAAM,OAAQ;AAAA,EAE1E,OAAO,EAAE,OAAO,YAAY,YAAY,SAAS,QAAQ;AAAA;AAa3D,eAAsB,uBAA0B,CAC9C,IACA,UACA,MAMY;AAAA,EACZ,IAAI;AAAA,EACJ,IAAI;AAAA,EAEJ,IAAI,MAAM;AAAA,IACR,MAAM,SAAS,MAAM,KAAK,QAAQ;AAAA,IAClC,OAAO;AAAA,MACL,YAAY,CAAC,MAAc,WACzB,OAAO,MAAM,MAAM,MAAM;AAAA,IAC7B;AAAA,IACA,UAAU,MAAM,OAAO,QAAQ;AAAA,EACjC,EAAO;AAAA,IACL,OAAO;AAAA;AAAA,EAGT,IAAI;AAAA,IACF,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC;AAAA,IACjC,MAAM,SAAS,MAAM,SAAS,IAAI;AAAA,IAClC,MAAM,KAAK,WAAW,UAAU,CAAC,CAAC;AAAA,IAClC,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,MAAM,KAAK,WAAW,YAAY,CAAC,CAAC;AAAA,IACpC,MAAM;AAAA,YACN;AAAA,IACA,UAAU;AAAA;AAAA;;;AC3eP,SAAS,kBAAkB,CAAC,YAA0B;AAAA,EAC3D,IAAI,WAAW,SAAS,wBAAwB;AAAA,IAC9C,MAAM,IAAI,oBACR,wCAAwC,0CAA0C,WAAW,WAC7F,UACF;AAAA,EACF;AAAA;AAGK,SAAS,kBAAkB,CAAC,YAA6C;AAAA,EAC9E,IAAI,cAAc,QAAQ,WAAW,SAAS,wBAAwB;AAAA,IACpE,MAAM,IAAI,oBACR,wCAAwC,0CAA0C,WAAW,SAC/F;AAAA,EACF;AAAA;AAAA;AAGK,MAAM,4BAA4B,MAAM;AAAA,EAG3B;AAAA,EACA;AAAA,EACS;AAAA,EACT;AAAA,EALlB,WAAW,CACT,SACgB,YACA,OACS,QAA2B,WACpC,QAChB;AAAA,IACA,MAAM,OAAO;AAAA,IALG;AAAA,IACA;AAAA,IACS;AAAA,IACT;AAAA,IAGhB,KAAK,OAAO;AAAA,IAEZ,IAAI,MAAM,mBAAmB;AAAA,MAC3B,MAAM,kBAAkB,MAAM,mBAAmB;AAAA,IACnD;AAAA;AAEJ;AAAA;AAEO,MAAM,iCAAiC,oBAAoB;AAAA,EAChE,WAAW,CAAC,OAAgB,YAAqB;AAAA,IAC/C,MAAM,0BAA0B,YAAY,KAAK;AAAA,IACjD,KAAK,OAAO;AAAA;AAEhB;;;ACrCO,IAAK;AAAA,CAAL,CAAK,oBAAL;AAAA,EACL,6BAAU;AAAA,EACV,6BAAU;AAAA,EACV,4BAAS;AAAA,EACT,+BAAY;AAAA,EACZ,4BAAS;AAAA,EACT,+BAAY;AAAA,GANF;;;AL+BZ,IAAM,aAAa;AAwBnB,IAAM,gBAAgC;AAAA,EACpC,KAAK,CAAC,aAAqB,QAAQ,KAAK,QAAQ;AAAA,EAChD,OAAO,CAAC,SAAiB,UAAiB,QAAQ,MAAM,SAAS,KAAK;AACxE;AAEA,IAAM,yBAAyB,QAAQ,IAAI,iCACvC,OAAO,SAAS,QAAQ,IAAI,gCAAgC,EAAE,IAC9D,IAAI;AAAA;AAED,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EAER,WAAW,GAAG,QAAQ,SAAS,qBAA4C;AAAA,IACzE,KAAK,SAAS,UAAU;AAAA,IAExB,IAAI,UAAU,qBAAqB,kBAAkB,MAAM;AAAA,MACzD,KAAK,OAAO,kBAAkB;AAAA,IAChC,EAAO,SAAI,sBAAsB,qBAAqB,kBAAkB,kBAAkB;AAAA,MACxF,KAAK,OAAO,IAAI,kBAAG,KAAK,EAAE,kBAAkB,kBAAkB,iBAAiB,CAAC;AAAA,MAChF,KAAK,YAAY;AAAA,IACnB,EAAO;AAAA,MACL,MAAM,IAAI,oBAAoB,kDAAkD;AAAA;AAAA,IAGlF,MAAM,KAAS;AAAA,MACb,YAAY,CAAC,MAAc,WACzB,KAAK,KAAK,MAAM,MAAM,MAAM;AAAA,IAChC;AAAA,IAEA,IAAI,MAAM;AAAA,MACR,KAAK,OAAO;AAAA,IACd,EAAO;AAAA,MACL,KAAK,OAAO,IAAI,sBAAO,EAAE,IAAI,QAAQ,sBAAsB,CAAC;AAAA;AAAA,IAE9D,KAAK,KAAK;AAAA;AAAA,OAGN,MAAK,GAAkB;AAAA,IAC3B,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,KAAK,MAAM;AAAA,IACtB,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,IAC1B,MAAM,cAAc,KAAK,EAAE;AAAA,IAC3B,MAAM,KAAK,KAAK,YAAY,uBAAuB;AAAA,IAEnD,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO,IAAI,GAAG,2BAA2B;AAAA;AAAA,OAG1C,KAAI,GAAkB;AAAA,IAC1B,MAAM,KAAK,KAAK,KAAK;AAAA,IAErB,IAAI,KAAK,WAAW;AAAA,MAClB,MAAM,KAAK,KAAK,IAAI;AAAA,IACtB;AAAA,IAEA,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO,IAAI,GAAG,2BAA2B;AAAA;AAAA,OAiB1C,cAA6C,CACjD,aASA,UACA,YACsB;AAAA,IACtB,MAAM,KAAK,cAAc;AAAA,IAEzB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI,OAAO,gBAAgB,cAAc,QAAQ,aAAa;AAAA,MAC5D,MAAM,MAAM;AAAA,MACZ,aAAa,IAAI;AAAA,MACjB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa,YAAY;AAAA,MACzB,iBAAiB,YAAY;AAAA,MAE7B,IAAI,IAAI,aAAa;AAAA,QACnB,MAAM,SAAS,MAAM,IAAI,YAAY,aAAa,SAAS,KAAK;AAAA,QAChE,IAAI,OAAO,QAAQ;AAAA,UACjB,MAAM,IAAI,oBACR,KAAK,UAAU,OAAO,MAAM,GAC5B,YACA,WACA,WACA,OAAO,MACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,EAAO;AAAA,MACL,MAAM,SAAS;AAAA,MAOf,aAAa,OAAO;AAAA,MACpB,QAAQ,OAAO;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,MACxB,UAAU,OAAO;AAAA;AAAA,IAGnB,mBAAmB,UAAU;AAAA,IAC7B,mBAAmB,UAAU;AAAA,IAE7B,MAAM,MAAM,MAAM,wBAChB,KAAK,IACL,OAAO,QAAQ;AAAA,MACb,MAAM,YAAY,SAAS,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,OAAO,IAAI;AAAA,MAE9E,QAAQ,KAAK,aAAa,YAAY,MAAM,kBAC1C;AAAA,QACE;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA,YAAY,SAAS,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,MACF,GACA,GACF;AAAA,MAEA,IAAI,SAAS;AAAA,QACX,MAAM,MAAgC;AAAA,UACpC,OAAO,YAAY;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAMA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,UACjD,YAAY,IAAI;AAAA,UAChB,iBAAiB,SAAS,mBAAmB;AAAA,UAC7C,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AAAA,MAEA,OAAO;AAAA,OAET,KAAK,IACP;AAAA,IAEA,KAAK,OAAO,IAAI,GAAG,mCAAmC,IAAI,UAAU,YAAY;AAAA,IAEhF,OAAO;AAAA;AAAA,OAGH,aAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KAOuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,MAAM,MAAgC;AAAA,MACpC,OAAO,IAAI;AAAA,MACX,YAAY,cAAc,IAAI,cAAc;AAAA,MAC5C,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,MACjD,iBAAiB,SAAS,mBAAmB;AAAA,IAC/C,CAAC;AAAA,IAED,KAAK,OAAO,IAAI,GAAG,oBAAoB,mCAAmC,OAAO;AAAA,IACjF,OAAO;AAAA;AAAA,OAGH,cAAa;AAAA,IACjB;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,kBAChB;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA,UAAU,IAAI;AAAA,MAChB;AAAA,MACA,kBAAkB,iDAA+C;AAAA,IACnE,GACA,KAAK,EACP;AAAA,IAEA,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,KAAK,OAAO,IAAI,GAAG,kCAAkC,OAAO;AAAA,IAC5D,OAAO;AAAA;AAAA,OAGH,eAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,KAKuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,UAAU,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IACvD,IAAI,QAAQ,kCAAkC;AAAA,MAC5C,MAAM,IAAI,oBACR,kCAAkC,QAAQ,oCAC1C,QAAQ,YACR,KACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAgB,QAAQ;AAAA,IAC9B,MAAM,2BACJ,QAAQ,SAAS,+BAA+B,aAAa;AAAA,IAC/D,IAAI,mCAAmC,wBAAwB,GAAG;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,KAAK,aAAa;AAAA,MACvB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AAAA;AAAA,OAGG,oBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,KAKuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,IAAI,IAAI,kCAAkC;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,gBAAgB,IAAI;AAAA,IAC1B,MAAM,2BAA2B,IAAI,SAAS,+BAA+B,aAAa;AAAA,IAC1F,IAAI,mCAAmC,wBAAwB,GAAG;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,IAAI,SAAS,mBAAmB,aAAa;AAAA,IAClE,IAAI,CAAC,gBAAgB,OAAO,iBAAiB,YAAY,EAAE,aAAa,eAAe;AAAA,MACrF,OAAO;AAAA,IACT;AAAA,IAEA,QAAQ,WAAW,cAAc,eAC/B,aACA;AAAA,IAGF,IAAI,cAAc,kBAAkB;AAAA,MAClC,OAAO,KAAK,eAAe,EAAE,OAAO,WAAW,CAAC;AAAA,IAClD;AAAA,IAGA,IAAI,cAAc,cAAc;AAAA,MAC9B,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,QACZ,MAAM,WAAW,MAAM,eAAe,EAAE,OAAO,WAAW,GAAG,EAAE,eAAe,MAAM,GAAG,CAAC;AAAA,QACxF,IAAI,CAAC;AAAA,UAAU,MAAM,IAAI,yBAAyB,KAAK;AAAA,QACvD,OAAO,kBACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,MAAM;AAAA,YACJ,UAAU,wBAAM,SAAS,UAAU;AAAA,eAChC,gBAAgB;AAAA,gBACf,QAAQ,QAAQ,CAAC;AAAA,gBACjB,WAAW,IAAI;AAAA,cACjB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,GACA,EACF;AAAA,SAEF,KAAK,IACP;AAAA,MAEA,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,aAAa,CAAC;AAAA,IACzE;AAAA,IAGA,IAAI,WAAW;AAAA,MACb,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC7E;AAAA,IAGA,IAAI,cAAc;AAAA,MAChB,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,cAAc,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC3F;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,eAAc;AAAA,IAClB;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,kBAChB;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,MACA,kBAAkB,wEAAsE;AAAA,IAC1F,GACA,KAAK,EACP;AAAA,IAEA,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,KAAK,OAAO,IAAI,GAAG,qCAAqC,OAAO;AAAA,IAC/D,OAAO;AAAA;AAAA,OAGH,OAAM;AAAA,IACV;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,cAAc;AAAA,IAEzB,MAAM,MAAM,MAAM,eAAe,EAAE,OAAO,WAAW,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC;AAAA,IAEvE,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,cAAa;AAAA,IACjB;AAAA,IACA;AAAA,KAI+B;AAAA,IAC/B,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,MAAM,iBAAiB,OAAO,OAAO,IAAI,QAAQ,EAAE,OACjD,CAAC,UACC,OAAO,UAAU,YACjB,UAAU,SACV,YAAY,UACZ,MAAM,WAAW,SACrB,EAAE;AAAA,IAIF,MAAM,aAAa,IAAI,yCAAsC,iBAAiB;AAAA,IAC9E,MAAM,uBACJ,IAAI,yCACA,MACA,IAAI,oCAAoC,IAAI,yCAC1C,IACA;AAAA,IAER,OAAO;AAAA,SACF;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAGI,QAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,KAcC;AAAA,IACD,MAAM,KAAK,cAAc;AAAA,IAEzB,IAAI;AAAA,MAAY,mBAAmB,UAAU;AAAA,IAC7C,mBAAmB,UAAU;AAAA,IAE7B,OAAO,gBACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GACA,KAAK,EACP;AAAA;AAAA,OAGY,cAAa,GAAkB;AAAA,IAC3C,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,KAAK,MAAM;AAAA,IACnB;AAAA;AAEJ;;AM5hBO,SAAS,iBAGf,CAAC,IAAY,SAAkE;AAAA,EAC9E,MAAM,MAAO,CACX,SACA,mBACgC;AAAA,IAChC;AAAA,IACA;AAAA,IAGA,aAAa,SAAS;AAAA,IACtB,SAAS,eAAe;AAAA,IACxB,SAAS,eAAe;AAAA,IACxB,UAAU,eAAe;AAAA,IACzB,UAAU,eAAe;AAAA,EAC3B;AAAA,EAEA,OAAO,eAAe,KAAK,MAAM,EAAE,OAAO,IAAI,YAAY,KAAK,CAAC;AAAA,EAChE,OAAO,eAAe,KAAK,eAAe;AAAA,IACxC,OAAO,SAAS;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AAAA,EAED,OAAO;AAAA;AAGT,SAAS,qBAAuD,CAC9D,UAAkD,CAAC,GACxB;AAAA,EAC3B,MAAM,UAAW,CACf,IACA,WACE,aAAa,SAAS,SAAS,UAAU,aAAiC,CAAC,OAClD;AAAA,IAC3B;AAAA,IACA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,SAAS,IAAK,UAA+B;AAAA,EAChE;AAAA,EAEA,QAAQ,MAAM,CACZ,WAEA,sBAA0C;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EAEH,QAAQ,MAAM;AAAA,EAEd,OAAO;AAAA;AAGF,IAAM,WAA4B,sBAAsB;;AC5EzC,IAAtB;AACe,IAAf;AACsD,IAAtD;;;ACFoB,IAApB;AAQO,SAAS,oBAAoB,CAClC,SACgC;AAAA,EAChC,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EACvC,MAAM,aAAgB,oBAAiB,cAAc,eAAkB,gBAAa,QAAQ,IAAI;AAAA,EAEhG,MAAM,QAA6C,IAAI;AAAA,EAEvD,SAAS,eAAe,CAAC,MAAwB;AAAA,IAC/C,IAAI,UAAU,KAAK;AAAA,IACnB,OAAO,SAAS;AAAA,MACd,IACK,iBAAc,OAAO,KACrB,2BAAwB,OAAO,KAC/B,qBAAkB,OAAO,KACzB,gBAAa,OAAO,GACvB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,QAAQ,CAAC,MAAwB;AAAA,IACxC,IAAI,UAAU,KAAK;AAAA,IACnB,OAAO,SAAS;AAAA,MACd,IACK,kBAAe,OAAO,KACtB,oBAAiB,OAAO,KACxB,oBAAiB,OAAO,KACxB,oBAAiB,OAAO,KACxB,iBAAc,OAAO,GACxB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,aAAa,CAAC,KAGrB;AAAA,IACA,IAAO,mBAAgB,GAAG,KAAQ,mCAAgC,GAAG,GAAG;AAAA,MACtE,OAAO,EAAE,IAAI,IAAI,MAAM,WAAW,MAAM;AAAA,IAC1C;AAAA,IAEA,IAAO,wBAAqB,GAAG,GAAG;AAAA,MAChC,IAAI,cAAc,IAAI,KAAK;AAAA,MAC3B,WAAW,QAAQ,IAAI,eAAe;AAAA,QACpC,eAAe;AAAA,QACf,eAAe,KAAK,QAAQ;AAAA,MAC9B;AAAA,MACA,OAAO,EAAE,IAAI,aAAa,WAAW,KAAK;AAAA,IAC5C;AAAA,IAEA,OAAO,EAAE,IAAI,IAAI,QAAQ,UAAU,GAAG,WAAW,KAAK;AAAA;AAAA,EAGxD,SAAS,KAAK,CAAC,MAAe;AAAA,IAC5B,IAAO,oBAAiB,IAAI,KAAQ,8BAA2B,KAAK,UAAU,GAAG;AAAA,MAC/E,MAAM,iBAAiB,KAAK;AAAA,MAC5B,MAAM,aAAa,eAAe,WAAW,QAAQ,UAAU;AAAA,MAC/D,MAAM,aAAa,eAAe,KAAK;AAAA,MAEvC,IACE,eAAe,WACd,eAAe,SACd,eAAe,aACf,eAAe,WACf,eAAe,eACf,eAAe,WACf,eAAe,WACf,eAAe,UACf,eAAe,wBACjB;AAAA,QACA,MAAM,WAAW,KAAK,UAAU;AAAA,QAChC,IAAI,UAAU;AAAA,UACZ,QAAQ,IAAI,cAAc,cAAc,QAAQ;AAAA,UAChD,MAAM,WAAW,eAAe,gCAA4B;AAAA,UAE5D,MAAM,iBAAyC;AAAA,YAC7C;AAAA,YACA,MAAM;AAAA,YACN,aAAa,gBAAgB,IAAI;AAAA,YACjC,MAAM,SAAS,IAAI;AAAA,YACnB;AAAA,UACF;AAAA,UAEA,IAAI,MAAM,IAAI,EAAE,GAAG;AAAA,YACjB,MAAM,IAAI,MACR,gCAAgC,iDAClC;AAAA,UACF;AAAA,UAEA,MAAM,IAAI,IAAI,cAAc;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IAEG,gBAAa,MAAM,KAAK;AAAA;AAAA,EAG7B,MAAM,UAAU;AAAA,EAEhB,OAAO,EAAE,OAAO,MAAM,KAAK,MAAM,OAAO,CAAC,EAAE;AAAA;;;ACnH3B,IAAlB;AAaA,IAAM,gBAAwB;AACvB,IAAM,gBAAwB,KAAK;AACnC,IAAM,cAAsB,KAAK;AACjC,IAAM,aAAqB,KAAK;AACvC,IAAM,cAAsB,IAAI;AAEzB,SAAS,aAAa,CAAC,UAA4B;AAAA,EACxD,IAAI,OAAO,aAAa,UAAU;AAAA,IAChC,IAAI,SAAS,KAAK,MAAM,IAAI;AAAA,MAC1B,MAAM,IAAI,oBAAoB,gCAAgC;AAAA,IAChE;AAAA,IAEA,MAAM,MAAK,8BAAM,QAAQ;AAAA,IAEzB,IAAI,OAAM,QAAQ,OAAM,GAAG;AAAA,MACzB,MAAM,IAAI,oBAAoB,sBAAsB,WAAW;AAAA,IACjE;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,MAAM;AAAA,EAErE,MAAM,KACJ,QAAQ,cACR,OAAO,aACP,QAAQ,cACR,UAAU,gBACV,UAAU;AAAA,EAEZ,IAAI,MAAM,GAAG;AAAA,IACX,MAAM,IAAI,oBAAoB,4CAA4C;AAAA,EAC5E;AAAA,EAEA,OAAO;AAAA;;;AC/C4B,IAArC;AAIA,IAAM,aAAa;AASnB,SAAS,mBAAmB,CAAC,OAAwB;AAAA,EACnD,MAAM,SAAS,MAAM,KAAK,EAAE,MAAM,KAAK;AAAA,EACvC,IAAI,OAAO,WAAW,KAAK,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EACvD,OAAO,OAAO,MAAM,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAG/C,SAAS,sBAAsB,CAAC,YAAoB,UAAwB;AAAA,EAC1E,IAAI;AAAA,IACF,wCAAqB,MAAM,YAAY,EAAE,IAAI,SAAS,CAAC;AAAA,IACvD,OAAO,GAAG;AAAA,IACV,MAAM,IAAI,oBACR,4BAA4B,0BAA0B,cAAc,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,GAC/G;AAAA;AAAA;AAIJ,SAAS,gBAAgB,CAAC,IAAY,UAA4B;AAAA,EAChE,IAAI,KAAK,eAAe;AAAA,IACtB,MAAM,IAAI,oBACR,oDAAoD,aAAa,KAAK,UAAU,QAAQ,GAC1F;AAAA,EACF;AAAA,EAEA,IAAI,KAAK,eAAe,GAAG;AAAA,IACzB,MAAM,OAAO,KAAK;AAAA,IAClB,IAAI,SAAS;AAAA,MAAG,OAAO;AAAA,IACvB,MAAM,cAAc,UAAU,GAAG,WAAW;AAAA,EAC9C;AAAA,EAEA,IAAI,KAAK,gBAAgB,GAAG;AAAA,IAC1B,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,KAAK,UAAU;AAAA,MAAG,OAAO,OAAO;AAAA,IACpC,MAAM,cAAc,UAAU,GAAG,aAAa;AAAA,EAChD;AAAA,EAEA,MAAM,UAAU,KAAK;AAAA,EACrB,IAAI,OAAO,UAAU,OAAO,KAAK,KAAK,YAAY;AAAA,IAAG,OAAO,KAAK;AAAA,EACjE,MAAM,cAAc,UAAU,GAAG,iBAAiB;AAAA;AAGpD,SAAS,aAAa,CAAC,UAAoB,OAAoC;AAAA,EAC7E,OAAO,IAAI,oBACT,qBAAqB,KAAK,UAAU,QAAQ,MAAM,uJACpD;AAAA;AAOK,SAAS,eAAe,CAAC,UAAoB,UAAqC;AAAA,EACvF,MAAM,KAAK,YAAY;AAAA,EAEvB,IAAI,OAAO,aAAa,YAAY,oBAAoB,QAAQ,GAAG;AAAA,IACjE,uBAAuB,UAAU,EAAE;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,UAAU,GAAG;AAAA,EACxC;AAAA,EAKA,MAAM,KAAK,cAAc,QAAQ;AAAA,EACjC,OAAO,EAAE,MAAM,iBAAiB,IAAI,QAAQ,GAAG,UAAU,GAAG;AAAA;;;AH1B9D,IAAM,cAAa;AAgBnB,IAAM,iBAAiB;AAAA,qBACL;AAAA,8BACK;AAAA,yBACH;AAAA,kCACK;AAAA,yBACL;AAAA,uBACD;AAAA,uDACiB;AACpC;AAsCA,IAAM,iBAAgC;AAAA,EACpC,KAAK,CAAC,aAAqB,QAAQ,KAAK,QAAQ;AAAA,EAChD,OAAO,CAAC,SAAiB,UAAiB,QAAQ,MAAM,SAAS,KAAK;AACxE;AAEA,IAAM,0BAAyB,QAAQ,IAAI,iCACvC,OAAO,SAAS,QAAQ,IAAI,gCAAgC,EAAE,IAC9D,IAAI;AAKR,IAAM,mBAAmB,CAAC,gBAAwB;AAAA,EAChD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,kCAAkC,CAAC,eACvC,qCAAqC;AAKvC,IAAM,0BAA0B,QAAQ,IAAI,iCACxC,OAAO,SAAS,QAAQ,IAAI,gCAAgC,EAAE,IAC9D;AAAA;AAEG,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,wBAAwB,IAAI;AAAA,EAC5B,WAAW;AAAA,EAEZ,YAAqD,IAAI;AAAA,EAIxD;AAAA,EAER,WAAW,GAAG,WAAW,QAAQ,SAAS,qBAA4C;AAAA,IACpF,KAAK,SAAS,KAAK,YAAY,UAAU,cAAa;AAAA,IAEtD,IAAI,UAAU,qBAAqB,kBAAkB,MAAM;AAAA,MACzD,KAAK,OAAO,kBAAkB;AAAA,IAChC,EAAO,SAAI,sBAAsB,qBAAqB,kBAAkB,kBAAkB;AAAA,MACxF,KAAK,OAAO,IAAI,mBAAG,KAAK,EAAE,kBAAkB,kBAAkB,iBAAiB,CAAC;AAAA,MAChF,KAAK,YAAY;AAAA,IACnB,EAAO;AAAA,MACL,MAAM,IAAI,oBAAoB,kDAAkD;AAAA;AAAA,IAGlF,IAAI,WAAW;AAAA,MACb,KAAK,wBAAwB,IAAI,IAAI,UAAU,IAAI,CAAC,cAAa,CAAC,UAAS,IAAI,SAAQ,CAAC,CAAC;AAAA,IAC3F;AAAA,IAEA,MAAM,KAAS;AAAA,MACb,YAAY,CAAC,MAAc,WACzB,KAAK,KAAK,MAAM,MAAM,MAAM;AAAA,IAChC;AAAA,IAEA,IAAI,MAAM;AAAA,MACR,KAAK,OAAO;AAAA,IACd,EAAO;AAAA,MACL,KAAK,OAAO,IAAI,uBAAO,EAAE,IAAI,QAAQ,sBAAsB,CAAC;AAAA;AAAA,IAE9D,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA;AAAA,OAGtB,MAAK,CACT,WAAW;AAAA,IAET,YAAY;AAAA,IACZ,mBAAmB;AAAA,MACkC,CAAC,GACzC;AAAA,IACf,IAAI,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,IAGA,MAAM,KAAK,KAAK,MAAM;AAAA,IAEtB,MAAM,cAAc,KAAK,KAAK,MAAM,CAAC;AAAA,IAErC,IAAI,KAAK,sBAAsB,OAAO,GAAG;AAAA,MACvC,WAAW,aAAY,KAAK,sBAAsB,OAAO,GAAG;AAAA,QAC1D,MAAM,KAAK,iBAAiB,SAAQ;AAAA,MACtC;AAAA,MAEA,KAAK,sBAAsB,MAAM;AAAA,IACnC;AAAA,IASA,MAAM,mBAAmB;AAAA,MACvB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,IACA,MAAM,KAAK,KAAK,YAAY,6BAA6B,EAAE,YAAY,EAAE,CAAC;AAAA,IAC1E,MAAM,KAAK,KAAK,YAAY,yBAAyB,gBAAgB;AAAA,IAGrE,MAAM,KAAK,KAAK,YAAY,yBAAyB,gBAAgB;AAAA,IAErE,MAAM,aAAqB,EAAE,QAAQ,IAAI,wBAAwB;AAAA,IAEjE,IAAI,UAAU;AAAA,MAGZ,MAAM,QAAQ,IACZ,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,MACrC,KAAK,KACF,KACC,yBACA,EAAE,wBAAwB,KAAK,WAAW,iBAAiB,KAAK,GAChE,CAAC,SAAS,KAAK,kBAAkB,IAAI,CACvC,EACC,KAAK,MAAM;AAAA,QACV,KAAK,OAAO,IACV,UAAU,IAAI,KAAK,gCAAgC,yBACrD;AAAA,OACD,CACL,CACF;AAAA,MAEA,MAAM,KAAK,KAAK,KACd,6BACA,EAAE,wBAAwB,KAAK,WAAW,EAAE,GAC5C,CAAC,SAAS,KAAK,qBAAqB,IAAI,CAC1C;AAAA,MACA,KAAK,OAAO,IAAI,4BAA4B,6BAA6B;AAAA,IAC3E;AAAA,IAEA,IAAI,UAAU;AAAA,MACZ,MAAM,YAAY,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,QAAQ,CAAC,OAC7D,GAAG,YAAY,OACX,CAAC,IACD,CAAC,EAAE,IAAI,GAAG,IAAI,UAAU,gBAAgB,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC,CACzE;AAAA,MACA,MAAM,QAAQ,WACZ,UAAU,IAAI,GAAG,IAAI,eACnB,KAAK,yBAAyB,IAAI,QAAQ,EAAE,MAAM,CAAC,UAAmB;AAAA,QACpE,KAAK,OAAO,MACV,oCAAoC,iBACpC,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,GACxD,EAAE,YAAY,GAAG,CACnB;AAAA,OACD,CACH,CACF;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AAAA,IAEhB,KAAK,OAAO,IAAI,0BAA0B;AAAA;AAAA,OAG9B,yBAAwB,CACpC,YACA,kBACe;AAAA,IACf,MAAM,oBAAoB,qBAAqB,UAAU;AAAA,IACzD,MAAM,KAAK,KAAK,YAAY,iBAAiB;AAAA,IAC7C,MAAM,KAAK,KAAK,SAAS,mBAAmB,iBAAiB,MAAM,MAAM;AAAA,MACvE,IAAI,iBAAiB;AAAA,IACvB,CAAC;AAAA,IACD,MAAM,KAAK,KAAK,KACd,mBACA,EAAE,WAAW,GAAG,iBAAiB,KAAK,GACtC,OAAO,SAAqC;AAAA,MAC1C,MAAM,cAAc,KAAK,IAAI,cAAc,IAAI;AAAA,MAC/C,IAAI;AAAA,QACF,MAAM,KAAK,kBAAkB,EAAE,YAAY,OAAO,CAAC,GAAG,YAAY,CAAC;AAAA,QACnE,OAAO,OAAO;AAAA,QACd,KAAK,OAAO,MACV,qDAAqD,eACrD,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,GACxD,EAAE,WAAW,CACf;AAAA,QACA,MAAM;AAAA;AAAA,KAGZ;AAAA,IACA,KAAK,OAAO,IACV,qCAAqC,gBAAgB,iBAAiB,SAAS,iBAAiB,aAChG,EAAE,WAAW,CACf;AAAA;AAAA,OAGY,mBAAkB,CAAC,YAAmC;AAAA,IAClE,IAAI;AAAA,MACF,MAAM,KAAK,KAAK,WAAW,qBAAqB,UAAU,CAAC;AAAA,MAC3D,OAAO,OAAO;AAAA,MACd,KAAK,OAAO,MACV,yBAAyB,eACzB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,GACxD,EAAE,WAAW,CACf;AAAA;AAAA;AAAA,OAIE,KAAI,GAAkB;AAAA,IAC1B,MAAM,QAAQ,WACZ,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAC/B,OAAO,CAAC,OAAO,GAAG,YAAY,IAAI,EAClC,IAAI,CAAC,OAAO,KAAK,mBAAmB,GAAG,EAAE,CAAC,CAC/C;AAAA,IAEA,MAAM,KAAK,KAAK,KAAK;AAAA,IAErB,IAAI,KAAK,WAAW;AAAA,MAClB,MAAM,KAAK,KAAK,IAAI;AAAA,IACtB;AAAA,IAEA,KAAK,WAAW;AAAA,IAEhB,KAAK,OAAO,IAAI,yBAAyB;AAAA;AAAA,OAGrC,iBAAgB,CAAC,YAA0E;AAAA,IAC/F,IAAI,KAAK,UAAU,IAAI,WAAW,EAAE,GAAG;AAAA,MACrC,MAAM,IAAI,oBACR,YAAY,WAAW,4BACvB,WAAW,EACb;AAAA,IACF;AAAA,IAEA,QAAQ,UAAU,qBAChB,WAAW,OACb;AAAA,IAGA,MAAM,mBAAmB,WAAW,WAChC,gBAAgB,WAAW,UAAU,WAAW,QAAQ,IACxD;AAAA,IAEJ,KAAK,UAAU,IAAI,WAAW,IAAI;AAAA,SAC7B;AAAA,MACH;AAAA,IACF,CAA+B;AAAA,IAE/B,IAAI,KAAK,YAAY,kBAAkB;AAAA,MACrC,MAAM,KAAK,yBAAyB,WAAW,IAAI,gBAAgB;AAAA,IACrE;AAAA,IAEA,KAAK,OAAO,IAAI,wBAAwB,WAAW,iBAAiB;AAAA,IACpE,WAAW,QAAQ,MAAM,OAAO,GAAG;AAAA,MACjC,MAAM,OAAO,CAAC;AAAA,MACd,IAAI,KAAK;AAAA,QAAa,KAAK,KAAK,eAAe;AAAA,MAC/C,IAAI,KAAK;AAAA,QAAM,KAAK,KAAK,QAAQ;AAAA,MACjC,IAAI,KAAK;AAAA,QAAW,KAAK,KAAK,WAAW;AAAA,MACzC,KAAK,OAAO,IAAI,SAAQ,eAAe,KAAK,UAAU,KAAK,MAAM,KAAK,KAAK,GAAG,GAAG;AAAA,IACnF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,mBAAkB,CAAC,YAA6C;AAAA,IACpE,MAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAAA,IAC9C,IAAI,UAAU,YAAY,QAAQ,KAAK,UAAU;AAAA,MAC/C,MAAM,KAAK,mBAAmB,UAAU;AAAA,IAC1C;AAAA,IACA,KAAK,UAAU,OAAO,UAAU;AAAA,IAChC,OAAO;AAAA;AAAA,OAGH,uBAAsB,GAA4B;AAAA,IACtD,IAAI,KAAK,UAAU;AAAA,MACjB,MAAM,QAAQ,WACZ,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAC/B,OAAO,CAAC,OAAO,GAAG,YAAY,IAAI,EAClC,IAAI,CAAC,OAAO,KAAK,mBAAmB,GAAG,EAAE,CAAC,CAC/C;AAAA,IACF;AAAA,IACA,KAAK,UAAU,MAAM;AAAA,IACrB,OAAO;AAAA;AAAA,EAGD,4BAGP,CACC,aASA,UACA,YACyC;AAAA,IACzC,IAAI,OAAO,gBAAgB,cAAc,QAAQ,aAAa;AAAA,MAC5D,OAAO;AAAA,QACL,YAAY,YAAY;AAAA,QACxB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY,YAAY;AAAA,QACxB,gBAAgB,YAAY;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,MAAM,SAAS;AAAA,IAQf,OAAO;AAAA,MACL,YAAY,OAAO;AAAA,MACnB,OAAO,OAAO;AAAA,MACd,YAAY,OAAO,cAAc,OAAO,SAAS;AAAA,MACjD,gBAAgB,OAAO,kBAAkB,OAAO,SAAS;AAAA,MACzD,SAAS,OAAO;AAAA,IAClB;AAAA;AAAA,OAiBI,cAA6C,CACjD,aASA,UACA,YACsB;AAAA,IACtB,QAAQ,YAAY,OAAO,YAAY,gBAAgB,YACrD,KAAK,6BAA6B,aAAa,UAAU,UAAU;AAAA,IAErE,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,KAAK,MAAM,KAAK;AAAA,IACxB;AAAA,IAEA,QAAQ,QAAQ,MAAM,KAAK,kBAAkB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IAED,KAAK,OAAO,IAAI,wBAAwB;AAAA,MACtC,OAAO,IAAI;AAAA,MACX;AAAA,IACF,CAAC;AAAA,IAED,OAAO;AAAA;AAAA,OAGK,kBAAiB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,KAakD;AAAA,IAClD,mBAAmB,UAAU;AAAA,IAC7B,mBAAmB,UAAU;AAAA,IAE7B,MAAM,YAAW,KAAK,UAAU,IAAI,UAAU;AAAA,IAC9C,IAAI,CAAC,WAAU;AAAA,MACb,MAAM,IAAI,oBAAoB,oBAAoB,YAAY;AAAA,IAChE;AAAA,IAEA,MAAM,WAAW,UAAS,MAAM,SAAS,KAAK,UAAS,MAAM;AAAA,IAC7D,MAAM,cAAc,UAAS,SAAS,UAAU,KAAK;AAAA,IACrD,IAAI,CAAC,YAAY,CAAC,YAAY;AAAA,MAC5B,MAAM,IAAI,oBAAoB,YAAY,2BAA2B,UAAU;AAAA,IACjF;AAAA,IACA,IAAI,UAAS,aAAa;AAAA,MACxB,MAAM,SAAS,MAAM,UAAS,YAAY,aAAa,SAAS,KAAK;AAAA,MACrE,IAAI,OAAO,QAAQ;AAAA,QACjB,MAAM,IAAI,oBACR,KAAK,UAAU,OAAO,MAAM,GAC5B,YACA,WACA,WACA,OAAO,MACT;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAgB,UAAS,MAAM,IAAI,MAAM;AAAA,IAC/C,MAAM,YAAY,SAAS,UACvB,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,OAAO,IACrC,UAAS,UACP,IAAI,KAAK,KAAK,IAAI,IAAI,UAAS,OAAO,IACtC;AAAA,IAEN,MAAM,YAAY,OAAO,aACvB,MAAM,kBACJ;AAAA,MACE;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA,YAAY,SAAS,WAAW,UAAS,WAAW;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GACA,QACF;AAAA,IAOF,MAAM,mBAAmB,OAAO,aAAiB;AAAA,MAC/C,MAAM,SAAS,MAAM,UAAU,QAAQ;AAAA,MACvC,IAAI,WAAW,OAAO,SAAS;AAAA,QAC7B,MAAM,KAAK,mBAAmB,OAAO,KAAK,SAAS,QAAQ;AAAA,MAC7D;AAAA,MACA,OAAO;AAAA;AAAA,IAGT,QAAQ,KAAK,YAAY,KACrB,MAAM,iBAAiB,EAAE,IACzB,MAAM,wBAAwB,KAAK,KAAK,MAAM,GAAG,kBAAkB,KAAK,IAAI;AAAA,IAEhF,OAAO,EAAE,KAAK,QAAQ;AAAA;AAAA,OAGV,mBAAkB,CAC9B,KACA,SACA,IACA;AAAA,IACA,MAAM,MAAgC;AAAA,MACpC,OAAO,IAAI;AAAA,MACX,YAAY,IAAI,cAAc;AAAA,MAC9B,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,IACb;AAAA,IAEA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,MACjD,YAAY,IAAI;AAAA,MAChB,iBAAiB,SAAS,mBAAmB;AAAA,SAC1C,iBAAiB,IAAI,UAAU;AAAA,SAC9B,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,IACrB,CAAC;AAAA;AAAA,OAGW,+BAA8B,CAAC,UAAuB;AAAA,IAClE,IAAI,CAAC,SAAS,eAAe,CAAC,SAAS,cAAc;AAAA,MACnD;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,MAAM,eACtB;AAAA,MACE,OAAO,SAAS;AAAA,MAChB,YAAY,SAAS,oBAAoB;AAAA,IAC3C,GACA,EAAE,IAAI,KAAK,GAAG,CAChB;AAAA,IACA,IACE,CAAC,aACD,UAAU,0CACV,UAAU,oCACV,UAAU,wCACV;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,aAAa;AAAA,MACtB,OAAO,UAAU;AAAA,MACjB,YAAY,UAAU,cAAc;AAAA,MACpC,WAAW,gCAAgC,SAAS,EAAE;AAAA,IACxD,CAAC;AAAA;AAAA,OAGG,cAAa;AAAA,IACjB;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,kBAAkB;AAAA,IAG7B,MAAM,MAAM,MAAM,KAAK,UAAU;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA,UAAU,IAAI;AAAA,MAChB;AAAA,MACA,kBAAkB,iDAA+C;AAAA,IACnE,CAAC;AAAA,IAED,KAAK,OAAO,IAAI,uBAAuB;AAAA,MACrC;AAAA,MACA,YAAY,IAAI;AAAA,IAClB,CAAC;AAAA,IAED,OAAO;AAAA;AAAA,OAGH,eAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,KAKuB;AAAA,IACvB,MAAM,KAAK,kBAAkB;AAAA,IAE7B,MAAM,UAAU,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IACvD,IAAI,QAAQ,kCAAkC;AAAA,MAC5C,MAAM,IAAI,oBACR,kCAAkC,QAAQ,oCAC1C,QAAQ,YACR,KACF;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,gCAAgC,QAAQ,UAAU,QAAQ,aAAa,GAAG;AAAA,MACjF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,KAAK,aAAa;AAAA,MACvB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AAAA;AAAA,OAGG,oBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,KAKuB;AAAA,IACvB,MAAM,KAAK,kBAAkB;AAAA,IAE7B,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,IAAI,IAAI,kCAAkC;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,SAAS,IAAI;AAAA,IACnB,IAAI,KAAK,gCAAgC,IAAI,UAAU,MAAM,GAAG;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,cAAc,KAAK,oBAAoB,IAAI,UAAU,MAAM;AAAA,IAEjE,IAAI,CAAC,aAAa;AAAA,MAChB,OAAO;AAAA,IACT;AAAA,IAEA,QAAQ,WAAW,cAAc,eAAe,YAAY;AAAA,IAG5D,IAAI,cAAc,kBAAkB;AAAA,MAClC,OAAO,KAAK,eAAe,EAAE,OAAO,WAAW,CAAC;AAAA,IAClD;AAAA,IAGA,IAAI,cAAc,cAAc;AAAA,MAC9B,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,QACZ,MAAM,WAAW,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,GAAG,EAAE,eAAe,MAAM,GAAG,CAAC;AAAA,QACrF,OAAO,KAAK,UACV;AAAA,UACE;AAAA,UACA;AAAA,UACA,MAAM;AAAA,YACJ,UAAU,yBAAM,SAAS,UAAU;AAAA,eAChC,SAAS;AAAA,gBACR,QAAQ,QAAQ,CAAC;AAAA,gBACjB,WAAW,IAAI;AAAA,cACjB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,GACA,EAAE,GAAG,CACP;AAAA,SAEF,KAAK,IACP;AAAA,MAEA,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,aAAa,CAAC;AAAA,IACzE;AAAA,IAGA,IAAI,WAAW;AAAA,MACb,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC7E;AAAA,IAGA,IAAI,cAAc;AAAA,MAChB,OAAO,KAAK,aAAa,EAAE,OAAO,YAAY,WAAW,cAAc,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC3F;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,eAAc;AAAA,IAClB;AAAA,IACA;AAAA,KAIuB;AAAA,IACvB,MAAM,KAAK,kBAAkB;AAAA,IAE7B,MAAM,MAAM,MAAM,KAAK,UAAU;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,MACA,kBAAkB,wEAAsE;AAAA,IAC1F,CAAC;AAAA,IAED,KAAK,OAAO,IAAI,kCAAkC,OAAO;AAAA,IAEzD,MAAM,KAAK,+BAA+B,GAAG;AAAA,IAE7C,OAAO;AAAA;AAAA,OAGH,aAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KASuB;AAAA,IACvB,MAAM,KAAK,kBAAkB;AAAA,IAE7B,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IAEnD,MAAM,gBAAgB,cAAc,IAAI,cAAc;AAAA,IAEtD,MAAM,MAAgC;AAAA,MACpC,OAAO,IAAI;AAAA,MACX,YAAY;AAAA,MACZ,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,MACjD,iBAAiB,SAAS,mBAAmB;AAAA,SAC1C,iBAAiB,IAAI,UAAU;AAAA,IACpC,CAAC;AAAA,IAED,KAAK,OAAO,IAAI,SAAS,2CAA2C,OAAO;AAAA,IAC3E,OAAO;AAAA;AAAA,OAGH,OAAM,GACR,OAAO,gBACP,gBAAgB,OAAO,OAA6C,CAAC,GACjD;AAAA,IACtB,MAAM,MAAM,MAAM,eAAe,EAAE,OAAO,WAAW,GAAG,EAAE,eAAe,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,IAE5F,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,OAAO;AAAA;AAAA,OAQH,mBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,KAI8B;AAAA,IAC9B,mBAAmB,UAAU;AAAA,IAC7B,mBAAmB,UAAU;AAAA,IAC7B,OAAO,mBAAmB,EAAE,YAAY,WAAW,GAAG,KAAK,EAAE;AAAA;AAAA,OAGzD,UAAS;AAAA,IAEX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,OAOA,OAAoB,CAAC,GACD;AAAA,IACtB,MAAM,MAAM,MAAM,kBAChB,EAAE,OAAO,YAAY,MAAM,iBAAiB,GAC5C,MAAM,KAAK,EACb;AAAA,IAEA,IAAI,CAAC,KAAK;AAAA,MACR,IAAI,kBAAkB;AAAA,QACpB,MAAM,UAAU,MAAM,eAAe,EAAE,OAAO,WAAW,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,QACjF,IAAI,SAAS;AAAA,UACX,MAAM,IAAI,oBACR,kCAAkC,QAAQ,6BAA6B,iBAAiB,KAAK,IAAI,KACjG,QAAQ,YACR,KACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,IAAI,yBAAyB,KAAK;AAAA,IAC1C;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,cAAa;AAAA,IACjB;AAAA,IACA;AAAA,KAI+B;AAAA,IAC/B,MAAM,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,WAAW,CAAC;AAAA,IACnD,MAAM,YAAW,KAAK,UAAU,IAAI,IAAI,UAAU;AAAA,IAElD,IAAI,CAAC,WAAU;AAAA,MACb,MAAM,IAAI,oBAAoB,YAAY,IAAI,wBAAwB,IAAI,YAAY,KAAK;AAAA,IAC7F;AAAA,IACA,MAAM,QAAQ,WAAU,SAAS,CAAC;AAAA,IAElC,IAAI,uBAAuB;AAAA,IAC3B,IAAI,iBAAiB;AAAA,IAErB,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,iBAAiB,OAAO,OAAO,IAAI,QAAQ,EAAE,OAC3C,CAAC,SACC,OAAO,SAAS,YAChB,SAAS,SACT,YAAY,SACZ,KAAK,WAAW,SACpB,EAAE;AAAA,MAEF,IAAI,IAAI,wCAAqC;AAAA,QAC3C,uBAAuB;AAAA,MACzB,EAAO,SAAI,IAAI,oCAAoC,IAAI,wCAAqC;AAAA,QAC1F,uBAAuB,KAAK,IAAK,iBAAiB,MAAM,SAAU,KAAK,GAAG;AAAA,MAC5E,EAAO;AAAA,QACL,MAAM,mBAAmB,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,IAAI,aAAa;AAAA,QAChF,IAAI,oBAAoB,GAAG;AAAA,UACzB,uBAAwB,mBAAmB,MAAM,SAAU;AAAA,QAC7D,EAAO;AAAA,UACL,MAAM,kBAAiB,OAAO,KAAK,IAAI,QAAQ,EAAE;AAAA,UAEjD,uBAAuB,KAAK,IAAK,kBAAiB,MAAM,SAAU,KAAK,GAAG;AAAA;AAAA;AAAA,IAGhF;AAAA,IAEA,OAAO;AAAA,SACF;AAAA,MACH;AAAA,MACA,sBAAsB,KAAK,MAAM,uBAAuB,GAAG,IAAI;AAAA,MAC/D,YAAY,MAAM;AAAA,IACpB;AAAA;AAAA,EASM,uBAAuB,CAC7B,eACA,KACoB;AAAA,IACpB,MAAM,sBACJ,kBAAkB,aAAa,kBAAkB,QAAQ,kBAAkB;AAAA,IAE7E,IAAI,qBAAqB;AAAA,MACvB,IAAI,IAAI,eAAe,MAAM;AAAA,QAC3B,MAAM,IAAI,yBAAyB,IAAI,EAAE;AAAA,MAC3C;AAAA,MACA,IAAI,IAAI,eAAe,eAAe;AAAA,QACpC,MAAM,IAAI,yBAAyB,IAAI,EAAE;AAAA,MAC3C;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,IAAI,cAAc;AAAA;AAAA,OAGb,kBAAiB,EAAE,MAAmD;AAAA,IAClF,QAAQ,QAAQ,IAAI,YAAY,aAAa,IAAI,UAAU,KAAK,QAAQ,CAAC;AAAA,IAEzE,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,IAAI,CAAC,OAAO;AAAA,QACV,MAAM,IAAI,oBAAoB,2CAA2C,UAAU;AAAA,MACrF;AAAA,MAEA,IAAI,CAAC,YAAY;AAAA,QACf,MAAM,IAAI,oBACR,gDACA,WACA,KACF;AAAA,MACF;AAAA,MAEA,MAAM,YAAW,KAAK,UAAU,IAAI,UAAU;AAAA,MAC9C,IAAI,CAAC,WAAU;AAAA,QACb,MAAM,IAAI,oBAAoB,YAAY,wBAAwB,YAAY,KAAK;AAAA,MACrF;AAAA,MAEA,KAAK,OAAO,IAAI,8BAA8B;AAAA,QAC5C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MAED,MAAM,MAAM,KAAK,OAAO,EAAE,MAAM,CAAC;AAAA,MAEjC,IAAI,IAAI,eAAe,YAAY;AAAA,QACjC,MAAM,IAAI,oBACR,gBAAgB,uCAAuC,cACvD,YACA,KACF;AAAA,MACF;AAAA,MAEA,mBAAmB,KAAK,wBAAwB,YAAY,GAAG;AAAA,MAI/D,IAAI,KAAK,eAAe,aAAa,IAAI,eAAe,IAAI,YAAY;AAAA,QACtE,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,YAAY;AAAA,UACZ,MAAM,EAAE,YAAY,IAAI,WAAW;AAAA,QACrC,CAAC;AAAA,QACD,MAAM,KAAK,KAAK,YAAY,IAAI,WAAW;AAAA,MAC7C;AAAA,MAEA,IAAI,IAAI,wCAAqC;AAAA,QAC3C,KAAK,OAAO,IAAI,gBAAgB,8BAA8B;AAAA,QAC9D;AAAA,MACF;AAAA,MAEA,IAAI,CAAC,IAAI,eAAe;AAAA,QACtB,MAAM,IAAI,oBAAoB,2BAA2B,YAAY,KAAK;AAAA,MAC5E;AAAA,MAEA,IAAI,IAAI,kCAAkC;AAAA,QACxC,MAAM,MAAM,wBACV,KAAK,IACL,OAAO,OAAO;AAAA,UACZ,MAAM,YAAY,MAAM,KAAK,OAC3B,EAAE,OAAO,YAAY,iBAAiB,GACtC,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,UACA,IAAI,UAAU,kCAAkC;AAAA,YAC9C,OAAO;AAAA,UACT;AAAA,UAEA,MAAM,cAAc,KAAK,oBACvB,UAAU,UACV,UAAU,aACZ;AAAA,UACA,MAAM,cAAc,KAAK,mBACvB,UAAU,UACV,UAAU,aACZ;AAAA,UACA,MAAM,UAAU,aAAa;AAAA,UAC7B,MAAM,uBAAuB,aAAa,WAAW;AAAA,UAErD,MAAM,eACJ,WACA,OAAO,SACN,MAAM,SAAS,QAAQ,aAAa,MAAM,SAAS,QAAQ,iBAC5D,CAAC;AAAA,UAEH,IAAI,cAAc;AAAA,YAChB,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,YAC3C,MAAM,aAAa,SAAS;AAAA,YAC5B,OAAO,KAAK,UACV;AAAA,cACE;AAAA,cACA,YAAY;AAAA,cACZ,MAAM;AAAA,gBACJ;AAAA,gBACA,UAAU;AAAA,gBACV,WAAW,IAAI;AAAA,gBACf,OAAO,KAAK;AAAA,mBACR,aACA,CAAC,IACD;AAAA,kBACE,UAAU,yBAAM,UAAU,UAAU;AAAA,qBACjC,UAAU,gBAAgB;AAAA,sBACzB,QAAQ,OAAO,QAAQ,CAAC;AAAA,yBACpB,YAAY,EAAE,UAAU,KAAc,IAAI,CAAC;AAAA,sBAC/C,WAAW,IAAI;AAAA,oBACjB;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA,cACN;AAAA,YACF,GACA,EAAE,GAAG,CACP;AAAA,UACF;AAAA,UAEA,OAAO,KAAK,UACV;AAAA,YACE;AAAA,YACA,YAAY;AAAA,YACZ,MAAM;AAAA,cACJ;AAAA,cACA,UAAU;AAAA,cACV,WAAW,IAAI;AAAA,cACf,OAAO,KAAK;AAAA,YACd;AAAA,UACF,GACA,EAAE,GAAG,CACP;AAAA,WAEF,KAAK,IACP;AAAA,MACF;AAAA,MAEA,MAAM,WAAW;AAAA,QACf,KAAK,OAAU,QAAgB,YAA8B;AAAA,UAC3D,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UACA,OAAO,KAAK,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA;AAAA,QAE9C,SAAS,OACP,UACE,WAAW,cACV;AAAA,UACH,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UACA,MAAM,cAAc,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI;AAAA,UAC/D,OAAO,KAAK,SAAS,EAAE,KAAK,QAAQ,WAAW,YAAY,CAAC;AAAA;AAAA,QAI9D,WAAW,OACT,QACA,kBACG;AAAA,UACH,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UACA,MAAM,OACJ,yBAAyB,OACrB,gBACA,OAAO,kBAAkB,WACvB,IAAI,KAAK,aAAa,IACtB,cAAc,gBAAgB,OAC5B,cAAc,OACd,IAAI,KAAK,cAAc,IAAI;AAAA,UACrC,MAAM,KAAK,SAAS,EAAE,KAAK,QAAQ,aAAa,KAAK,CAAC;AAAA;AAAA,QAExD,OAAO,OAAO,WAAmB;AAAA,UAC/B,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UACA,MAAM,KAAK,SAAS,EAAE,KAAK,QAAQ,WAAW,iBAAiB,CAAC;AAAA;AAAA,QAElE,OAAO,OAAO,QAAgB,aAAuB;AAAA,UACnD,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UACA,MAAM,KAAK,SAAS;AAAA,YAClB;AAAA,YACA;AAAA,YACA,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,cAAc,QAAQ,CAAC;AAAA,UAC5D,CAAC;AAAA;AAAA,YAEC,KAAK,GAAG;AAAA,UACV,OAAO,KAAK;AAAA;AAAA,QAEd,MAAM,OACJ,QACA,aACA,YACG;AAAA,UACH,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UACA,MAAM,aAAa,cAAc,SAAS,YAAY,KAAK;AAAA,UAC3D,IAAI,aAAa,OAAQ;AAAA,YACvB,MAAM,IAAI,oBACR,gDAAgD,iBAChD,YACA,KACF;AAAA,UACF;AAAA,UACA,MAAM,YAAY,SAAS,UAAU,cAAc,QAAQ,OAAO,IAAI;AAAA,UACtE,OAAO,KAAK,SAAS,EAAE,KAAK,QAAQ,aAAa,YAAY,UAAU,CAAC;AAAA;AAAA,QAI1E,qBAAqB,OACnB,QACA,aASA,UACA,eACG;AAAA,UACH,IAAI,CAAC,KAAK;AAAA,YACR,MAAM,IAAI,oBAAoB,wBAAwB,YAAY,KAAK;AAAA,UACzE;AAAA,UAIA,MAAM,oBAAoB,KAAK,6BAC7B,aACA,UACA,UACF;AAAA,UACA,MAAM,0BAA0B;AAAA,YAC9B;AAAA,YACA;AAAA,YACA,YAAY,kBAAkB;AAAA,YAC9B,OAAO,kBAAkB;AAAA,YACzB,SAAS,kBAAkB;AAAA,YAC3B,YAAY,kBAAkB;AAAA,YAC9B,gBAAgB,kBAAkB;AAAA,UACpC;AAAA,UACA,OAAO,KAAK,wBAAwB,uBAAuB;AAAA;AAAA,MAE/D;AAAA,MAEA,IAAI,OAAO,KAAK,SAAS;AAAA,MACzB,MAAM,UAAU,UAAS,WAAW,CAAC;AAAA,MAErC,MAAM,UAA2B;AAAA,QAC/B,OAAO,IAAI;AAAA,QACX,YAAY,IAAI;AAAA,QAChB,OAAO,IAAI;AAAA,QACX,YAAY,IAAI,cAAc;AAAA,QAC9B,SAAS,IAAI;AAAA,YACT,QAAQ,GAAG;AAAA,UAGb,OAAO,KAAK,YAAY,CAAC;AAAA;AAAA,QAE3B,QAAQ,KAAK;AAAA,QACb;AAAA,QACA,UAAU,IAAI,cAAc,EAAE,WAAW,IAAI,YAAY,IAAI;AAAA,MAC/D;AAAA,MAEA,WAAW,UAAU,SAAS;AAAA,QAC5B,MAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAAA,QAC1C,OAAO,KAAK,SAAS,MAAM;AAAA,QAC3B,QAAQ,OAAO;AAAA,MACjB;AAAA,MAEA,IAAI,OAA+B,MAAM,UAAS,QAAQ,OAAO;AAAA,MACjE,WAAW,UAAU,CAAC,GAAG,OAAO,EAAE,QAAQ,GAAG;AAAA,QAC3C,IAAI,OAAO,MAAM;AAAA,UACf,MAAM,QAAQ;AAAA,UACd,MAAM,OAAO,OAAO;AAAA,UACpB,OAAO,MAAM,KAAK,SAAS,KAAK;AAAA,QAClC;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,MAAM,KAAK;AAAA,MAE1B,MAAM,MAAM,KAAK,OAAO,EAAE,OAAO,YAAY,iBAAiB,CAAC;AAAA,MAE/D,MAAM,mBAAmB,IAAI,kBAAkB,UAAS,MAAM,UAAS,MAAM,SAAS,IAAI;AAAA,MAC1F,MAAM,kBAAkB,UAAS,SAAS,UAAU,KAAK;AAAA,MACzD,MAAM,gBAAgB,UAAS,MAAM,WAAW;AAAA,MAChD,MAAM,iBACJ,IAAI,uCACH,iBAAiB,oBAAqB,kBAAkB,WAAW;AAAA,MACtE,IAAI,gBAAgB;AAAA,QAClB,MAAM,mBAAmB,WAAW,YAAY,CAAC,IAAI;AAAA,QACrD,MAAM,eAAe,MAAM,KAAK,UAAU;AAAA,UACxC;AAAA,UACA,YAAY;AAAA,UACZ,MAAM;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR,aAAa,IAAI;AAAA,YACjB,OAAO,KAAK;AAAA,UACd;AAAA,QACF,CAAC;AAAA,QACD,MAAM,KAAK,+BAA+B,YAAY;AAAA,QAEtD,KAAK,OAAO,IAAI,2BAA2B;AAAA,UACzC;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO,OAAO;AAAA,MAId,IAAI,OAAO;AAAA,QACT,MAAM,aAAa,MAAM,KAAK,UAAU;AAAA,UACtC;AAAA,UACA,YAAY;AAAA,UACZ,MAAM;AAAA,YACJ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC5D,OAAO,KAAK;AAAA,UACd;AAAA,QACF,CAAC;AAAA,QACD,IACE,WAAW,0CACX,WAAW,oCACX,WAAW,wCACX;AAAA,UACA,MAAM,KAAK,+BAA+B,UAAU;AAAA,QACtD;AAAA,MACF;AAAA,MAEA,MAAM;AAAA;AAAA;AAAA,OAWI,qBAAoB,EAAE,MAA6C;AAAA,IAC/E,QAAQ,UAAU,KAAK,QAAQ,CAAC;AAAA,IAChC,IAAI,CAAC;AAAA,MAAO;AAAA,IAEZ,MAAM,MAAM,MAAM,eAAe,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC;AAAA,IAC3D,IAAI,CAAC,OAAO,IAAI;AAAA,MAAmC;AAAA,IAEnD,MAAM,YAAY,MAAM,KAAK,UAAU;AAAA,MACrC;AAAA,MACA,YAAY,IAAI,cAAc;AAAA,MAC9B,MAAM;AAAA,QACJ;AAAA,QACA,OAAO,IAAI,SAAS;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,IACD,MAAM,KAAK,+BAA+B,SAAS;AAAA,IAEnD,KAAK,OAAO,IAAI,uCAAuC;AAAA,MACrD;AAAA,MACA,YAAY,IAAI;AAAA,IAClB,CAAC;AAAA;AAAA,EAGK,kBAAkB,CACxB,UACA,QAC0B;AAAA,IAC1B,MAAM,YAAY,SAAS;AAAA,IAC3B,OAAO,aAAa,OAAO,cAAc,YAAY,YAAY,YAC5D,YACD;AAAA;AAAA,EAGE,mBAAmB,CACzB,UACA,QAC6B;AAAA,IAC7B,MAAM,QAAQ,SAAS,mBAAmB,MAAM;AAAA,IAChD,OAAO,SAAS,OAAO,UAAU,YAAY,aAAa,QACrD,QACD;AAAA;AAAA,EAGE,+BAA+B,CACrC,UACA,QACyC;AAAA,IACzC,MAAM,QAAQ,SAAS,+BAA+B,MAAM;AAAA,IAC5D,OAAO,mCAAmC,KAAK,IAC1C,QACD;AAAA;AAAA,EAQE,uBAAuB,CAAC,UAAgC;AAAA,IAC9D,OAAO,SAAS,WAAW,YAAY,CAAC,IAAI,SAAS;AAAA;AAAA,EAU/C,yBAAyB,CAAC,UAA8B;AAAA,IAC9D,MAAM,IAAI,oBACR,kBAAkB,SAAS,cAAc,SAAS,SAAS,SAAS,QAAQ,KAAK,SAAS,UAAU,MACpG,SAAS,YACT,SAAS,EACX;AAAA;AAAA,EAGM,sCAAsC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KAMC;AAAA,IACD,MAAM,2BAA2B,UAAU,cAAc;AAAA,IACzD,MAAM,UACJ,SAAS,eAAe,cACxB,SAAS,gBAAgB,UAAU,MACnC,SAAS,iBAAiB,UAC1B,SAAS,qBAAqB;AAAA,IAEhC,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAI,oBACR,4CAA4C,SAAS,0DAA0D,WAC/G,YACA,UAAU,EACZ;AAAA,IACF;AAAA;AAAA,OAaY,wBAAuB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KASmB;AAAA,IACnB,IAAI;AAAA,IACJ,IAAI,kBAAkB;AAAA,IACtB,MAAM,kBAAkB,cAAc,IAAI,cAAc;AAAA,IACxD,MAAM,sBAAsB;AAAA,IAE5B,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,MACZ,MAAM,YAAY,MAAM,KAAK,OAC3B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,MAOA,IACE,UAAU,0CACV,UAAU,oCACV,UAAU,kCACV;AAAA,QACA;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,KAAK,mBAAmB,UAAU,UAAU,MAAM;AAAA,MACvE,IAAI,cAAc,WAAW,WAAW;AAAA,QACtC,eAAe,aAAa;AAAA,QAC5B,kBAAkB;AAAA,QAClB;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,KAAK,gCAAgC,UAAU,UAAU,MAAM;AAAA,MACpF,IAAI,cAAc;AAAA,QAChB,MAAM,0BACJ,qBAAqB,aAAa,sBAC7B,aAAa,oBAAoB,mBAAmB,YACrD;AAAA,QACN,MAAM,mBAAmB,MAAM,KAAK,OAAO;AAAA,UACzC,OAAO,aAAa,oBAAoB;AAAA,UACxC,YAAY;AAAA,QACd,CAAC;AAAA,QACD,IAAI,iBAAiB,wCAAqC;AAAA,UACxD,eAAe,KAAK,wBAAwB,gBAAgB;AAAA,UAC5D,kBAAkB;AAAA,UAClB,MAAM,KAAK,UACT;AAAA,YACE,OAAO,IAAI;AAAA,YACX,YAAY,IAAI,cAAc;AAAA,YAC9B,MAAM;AAAA,cACJ,UAAU,yBAAM,UAAU,UAAU;AAAA,iBACjC,SAAS;AAAA,kBACR,QAAQ;AAAA,kBACR,WAAW,IAAI;AAAA,gBACjB;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,GACA,EAAE,GAAG,CACP;AAAA,UACA;AAAA,QACF;AAAA,QACA,IACE,iBAAiB,oCACjB,iBAAiB,wCACjB;AAAA,UAIA,KAAK,0BAA0B,gBAAgB;AAAA,QACjD;AAAA,QAMA,MAAM,KAAK,gBAAgB;AAAA,UACzB,KAAK;AAAA,UACL;AAAA,UACA,WAAW,gCAAgC,iBAAiB,EAAE;AAAA,UAC9D,YAAY;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,MAAM,KAAK,kBAAkB;AAAA,QAC1C;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB;AAAA,QACA,aAAa,IAAI;AAAA,QACjB,cAAc;AAAA,QACd,kBAAkB,IAAI,cAAc;AAAA,QACpC,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD,MAAM,WAAW,OAAO;AAAA,MAExB,IAAI,CAAC,OAAO,SAAS;AAAA,QACnB,KAAK,uCAAuC;AAAA,UAC1C;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAED,IAAI,SAAS,wCAAqC;AAAA,UAChD,eAAe,KAAK,wBAAwB,QAAQ;AAAA,UACpD,kBAAkB;AAAA,UAClB,MAAM,KAAK,UACT;AAAA,YACE,OAAO,IAAI;AAAA,YACX,YAAY,IAAI,cAAc;AAAA,YAC9B,MAAM;AAAA,cACJ,UAAU,yBAAM,UAAU,UAAU;AAAA,iBACjC,+BAA+B,MAAM,IAAI;AAAA,kBACxC,qBAAqB;AAAA,oBACnB,YAAY,SAAS;AAAA,oBACrB,iBAAiB,SAAS;AAAA,oBAC1B,iBAAiB,SAAS;AAAA,kBAC5B;AAAA,kBACA,WAAW,IAAI;AAAA,gBACjB;AAAA,iBACC,SAAS;AAAA,kBACR,QAAQ;AAAA,kBACR,WAAW,IAAI;AAAA,gBACjB;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,GACA,EAAE,GAAG,CACP;AAAA,UACA;AAAA,QACF;AAAA,QACA,IACE,SAAS,oCACT,SAAS,wCACT;AAAA,UAKA,KAAK,0BAA0B,QAAQ;AAAA,QACzC;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,gBAAgB;AAAA,QACzB,KAAK;AAAA,QACL;AAAA,QACA,WAAW,gCAAgC,SAAS,EAAE;AAAA,QACtD,YAAY;AAAA,QACZ;AAAA,QACA,UAAU,yBAAM,UAAU,UAAU;AAAA,WACjC,+BAA+B,MAAM,IAAI;AAAA,YACxC,qBAAqB;AAAA,cACnB,YAAY,SAAS;AAAA,cACrB,iBAAiB,SAAS;AAAA,cAC1B,iBAAiB,SAAS;AAAA,YAC5B;AAAA,YACA,WAAW,IAAI;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,OAEH,KAAK,IACP;AAAA,IAEA,IAAI,iBAAiB;AAAA,MACnB,OAAO;AAAA,IACT;AAAA;AAAA,OAGY,gBAAe;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KASC;AAAA,IACD,MAAM,eAAe,YAAY,IAAI;AAAA,IACrC,MAAM,UAA2C,CAAC;AAAA,IAClD,IAAI;AAAA,MAAW,QAAQ,YAAY;AAAA,IACnC,IAAI;AAAA,MAAc,QAAQ,eAAe;AAAA,IACzC,IAAI;AAAA,MAAY,QAAQ,aAAa;AAAA,IAErC,MAAM,KAAK,UACT;AAAA,MACE,OAAO,IAAI;AAAA,MACX,YAAY,IAAI,cAAc;AAAA,MAC9B,MAAM;AAAA,QACJ;AAAA,QACA,eAAe;AAAA,QACf,UAAU,IAAI;AAAA,QACd,UAAU,yBAAM,cAAc;AAAA,WAC3B,mBAAmB,MAAM,IAAI;AAAA,YAC5B;AAAA,YACA,WAAW,IAAI;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,GACA,EAAE,GAAG,CACP;AAAA;AAAA,OAGY,QAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,KAKC;AAAA,IACD,OAAO,wBACL,KAAK,IACL,OAAO,OAAO;AAAA,MACZ,MAAM,eAAe,MAAM,KAAK,OAC9B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD;AAAA,QACE,eAAe;AAAA,QACf;AAAA,MACF,CACF;AAAA,MAEA,IACE,aAAa,0CACb,aAAa,oCACb,aAAa,kCACb;AAAA,QACA,KAAK,OAAO,IAAI,QAAQ,mCAAmC,aAAa,UAAU;AAAA,UAChF,OAAO,IAAI;AAAA,UACX,YAAY,IAAI;AAAA,QAClB,CAAC;AAAA,QAED;AAAA,MACF;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,SAAS,KAAK,mBAAmB,aAAa,UAAU,MAAM;AAAA,QACpE,IAAI,QAAQ,WAAW,WAAW;AAAA,UAChC,OAAO,OAAO;AAAA,QAChB;AAAA,QAEA,MAAM,KAAK,UACT;AAAA,UACE,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,MAAM;AAAA,YACJ,eAAe;AAAA,UACjB;AAAA,QACF,GACA,EAAE,GAAG,CACP;AAAA,QAEA,KAAK,OAAO,IAAI,gBAAgB,aAAa;AAAA,UAC3C,OAAO,IAAI;AAAA,UACX,YAAY,IAAI;AAAA,QAClB,CAAC;AAAA,QAED,IAAI,SAAS,MAAM,QAAQ;AAAA,QAE3B,IAAI,WAAW,WAAW;AAAA,UACxB,SAAS,CAAC;AAAA,QACZ;AAAA,QAEA,MAAM,UAAU,MAAM,KAAK,UACzB;AAAA,UACE,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,MAAM;AAAA,YACJ,UAAU,yBAAM,aAAa,UAAU;AAAA,eACpC,SAAS;AAAA,gBACR;AAAA,gBACA,WAAW,IAAI;AAAA,cACjB;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,GACA,EAAE,GAAG,CACP;AAAA,QAIA,OAAO,OAAO,KAAK,OAAO;AAAA,QAE1B,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,KAAK,OAAO,MAAM,QAAQ,kBAAkB,OAAgB;AAAA,UAC1D,OAAO,IAAI;AAAA,UACX,YAAY,IAAI;AAAA,QAClB,CAAC;AAAA,QAED,MAAM,KAAK,UACT;AAAA,UACE,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,MAAM;AAAA,YACJ;AAAA,YACA,OAAO,iBAAiB,QAAQ,GAAG,MAAM;AAAA,EAAY,MAAM,UAAU,OAAO,KAAK;AAAA,UACnF;AAAA,QACF,GACA,EAAE,GAAG,CACP;AAAA,QAEA,MAAM;AAAA;AAAA,OAGV,KAAK,IACP;AAAA;AAAA,OAGY,SAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KAMmB;AAAA,IACnB,MAAM,eAAe,MAAM,KAAK,OAAO;AAAA,MACrC,OAAO,IAAI;AAAA,MACX,YAAY,IAAI,cAAc;AAAA,IAChC,CAAC;AAAA,IAED,IACE,aAAa,0CACb,aAAa,oCACb,aAAa,kCACb;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,KAAK,mBAAmB,aAAa,UAAU,MAAM;AAAA,IACpE,IAAI,QAAQ,WAAW,WAAW;AAAA,MAChC,OAAO,OAAO,WAAW,YAAY,OAAO;AAAA,IAC9C;AAAA,IAEA,MAAM,eAAe,cAAc,aAAa,WAAW;AAAA,IAE3D,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,MACZ,MAAM,WAAW,MAAM,KAAK,OAC1B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,MACA,OAAO,KAAK,gBAAgB,EAAE,KAAK,UAAU,QAAQ,WAAW,cAAc,GAAG,CAAC;AAAA,OAEpF,KAAK,IACP;AAAA,IAEA,IAAI,eAAe,cAAc;AAAA,MAC/B,IAAI;AAAA,QACF,MAAM,MAAgC;AAAA,UACpC,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,YAAY,IAAI;AAAA,UAChB,OAAO,IAAI;AAAA,UACX,OAAO,EAAE,MAAM,cAAc,MAAM,EAAE,MAAM,YAAY,YAAY,EAAE,EAAE;AAAA,QACzE;AAAA,QACA,MAAM,KAAK,KAAK,KAAK,yBAAyB,KAAK;AAAA,UACjD,YAAY,YAAY,QAAQ,KAAK,KAAK,IAAI,IAAI,IAAI,OAAS;AAAA,UAC/D,iBAAiB;AAAA,aACd,iBAAiB,IAAI,UAAU;AAAA,QACpC,CAAC;AAAA,QACD,OAAO,OAAO;AAAA,QAEd,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,MAAM,EAAE,iCAAgC,UAAU,KAAK;AAAA,QACzD,CAAC;AAAA,QACD,MAAM;AAAA;AAAA,IAEV;AAAA,IAEA,KAAK,OAAO,IACV,QAAQ,iBAAiB,YAAY,eAAe,eAAe,KAAK,cAAc,UAAU,YAAY,YAAY,MAAM,MAC9H,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,WAAW,CAC9C;AAAA;AAAA,OAGY,SAAW;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,KAOyE;AAAA,IACzE,MAAM,eAAe,MAAM,KAAK,OAAO;AAAA,MACrC,OAAO,IAAI;AAAA,MACX,YAAY,IAAI,cAAc;AAAA,IAChC,CAAC;AAAA,IAED,IACE,aAAa,0CACb,aAAa,oCACb,aAAa,kCACb;AAAA,MACA,OAAO,EAAE,UAAU,KAAK;AAAA,IAC1B;AAAA,IAEA,MAAM,SAAS,KAAK,mBAAmB,aAAa,UAAU,MAAM;AAAA,IACpE,IAAI,QAAQ,WAAW,WAAW;AAAA,MAChC,OAAO,OAAO,WAAW,EAAE,UAAU,KAAK,IAAI,EAAE,UAAU,OAAO,MAAM,OAAO,OAAY;AAAA,IAC5F;AAAA,IAEA,MAAM,iBAAiB,aAAa,SAAS,GAAG;AAAA,IAChD,MAAM,YACJ,kBAAkB,OAAO,mBAAmB,YAAY,eAAe,iBACnE,IAAI,KAAM,eAAyC,SAAS,IAC5D,IAAI;AAAA,IAEV,IAAI,cAAc,aAAa,KAAK,IAAI,KAAK,UAAU,QAAQ,IAAI,WAAW;AAAA,MAC5E,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,QACZ,MAAM,WAAW,MAAM,KAAK,OAC1B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,QACA,OAAO,KAAK,UACV;AAAA,UACE,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,MAAM;AAAA,YACJ,eAAe;AAAA,YACf,UAAU,yBAAM,SAAS,UAAU;AAAA,eAChC,SAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAe,WAAW,IAAI,KAAO;AAAA,YACzE,CAAC;AAAA,UACH;AAAA,QACF,GACA,EAAE,GAAG,CACP;AAAA,SAEF,KAAK,IACP;AAAA,MACA,OAAO,EAAE,UAAU,KAAK;AAAA,IAC1B;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,MAAM,YAAY;AAAA,MAC3B,OAAO,OAAO;AAAA,MACd,KAAK,OAAO,MACV,6BAA6B,uEAC7B,OACA,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,WAAW,CAC9C;AAAA,MAGA,IAAI,cAAc,aAAa,KAAK,IAAI,KAAK,UAAU,QAAQ,IAAI,WAAW;AAAA,QAC5E,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,UACZ,MAAM,WAAW,MAAM,KAAK,OAC1B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,UACA,OAAO,KAAK,UACV;AAAA,YACE,OAAO,IAAI;AAAA,YACX,YAAY,IAAI,cAAc;AAAA,YAC9B,MAAM;AAAA,cACJ,eAAe;AAAA,cACf,UAAU,yBAAM,SAAS,UAAU;AAAA,iBAChC,SAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAe,WAAW,IAAI,KAAO;AAAA,cACzE,CAAC;AAAA,YACH;AAAA,UACF,GACA,EAAE,GAAG,CACP;AAAA,WAEF,KAAK,IACP;AAAA,QACA,OAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AAAA,MAEA,SAAS;AAAA;AAAA,IAGX,IAAI,WAAW,OAAO;AAAA,MACpB,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,QACZ,MAAM,WAAW,MAAM,KAAK,OAC1B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,QACA,OAAO,KAAK,UACV;AAAA,UACE,OAAO,IAAI;AAAA,UACX,YAAY,IAAI,cAAc;AAAA,UAC9B,MAAM;AAAA,YACJ,eAAe;AAAA,YACf,UAAU,yBAAM,SAAS,UAAU;AAAA,eAChC,SAAS,EAAE,QAAQ,QAAQ,WAAW,IAAI,KAAO;AAAA,YACpD,CAAC;AAAA,UACH;AAAA,QACF,GACA,EAAE,GAAG,CACP;AAAA,SAEF,KAAK,IACP;AAAA,MACA,OAAO,EAAE,UAAU,OAAO,MAAM,OAAO;AAAA,IACzC;AAAA,IAEA,MAAM,YAAY,UAAU;AAAA,IAC5B,MAAM,wBACJ,KAAK,IACL,OAAO,OAAO;AAAA,MACZ,MAAM,WAAW,MAAM,KAAK,OAC1B,EAAE,OAAO,IAAI,IAAI,YAAY,IAAI,cAAc,UAAU,GACzD,EAAE,eAAe,MAAM,GAAG,CAC5B;AAAA,MACA,OAAO,KAAK,UACV;AAAA,QACE,OAAO,IAAI;AAAA,QACX,YAAY,IAAI,cAAc;AAAA,QAC9B,MAAM;AAAA,UACJ;AAAA,UACA,eAAe;AAAA,UACf,UAAU,IAAI;AAAA,UACd,UAAU,yBAAM,SAAS,UAAU;AAAA,aAChC,GAAG,gBAAgB,EAAE,WAAW,UAAU,YAAY,EAAE;AAAA,aACxD,mBAAmB,MAAM,IAAI;AAAA,cAC5B,SAAS,EAAE,cAAc,WAAW,YAAY,KAAK;AAAA,cACrD,WAAW,IAAI;AAAA,YACjB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,GACA,EAAE,GAAG,CACP;AAAA,OAEF,KAAK,IACP;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,KAAK,KAAK,KACd,yBACA;AAAA,QACE,OAAO,IAAI;AAAA,QACX,YAAY,IAAI,cAAc;AAAA,QAC9B,YAAY,IAAI;AAAA,QAChB,OAAO,IAAI;AAAA,QACX,OAAO,EAAE,MAAM,WAAW,MAAM,CAAC,EAAE;AAAA,MACrC,GACA;AAAA,QACE,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,UAAU;AAAA,QAC5C,iBAAiB;AAAA,WACd,iBAAiB,IAAI,UAAU;AAAA,MACpC,CACF;AAAA,MACA,OAAO,OAAO;AAAA,MAEd,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO,IAAI;AAAA,QACX,YAAY,IAAI,cAAc;AAAA,QAC9B,MAAM,EAAE,iCAAgC,UAAU,KAAK;AAAA,MACzD,CAAC;AAAA,MACD,MAAM;AAAA;AAAA,IAGR,KAAK,OAAO,IAAI,QAAQ,wBAAwB,mBAAmB;AAAA,MACjE,OAAO,IAAI;AAAA,MACX,YAAY,IAAI;AAAA,IAClB,CAAC;AAAA,IAED,OAAO,EAAE,UAAU,OAAO,MAAM,UAAe;AAAA;AAAA,OAGnC,kBAAiB,GAAkB;AAAA,IAC/C,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,IAAI,oBAAoB,6BAA6B;AAAA,IAC7D;AAAA;AAAA,EAGM,WAAW,CAAC,QAAgD;AAAA,IAClE,OAAO;AAAA,MACL,KAAK,CAAC,SAAiB,YAA4C;AAAA,QACjE,QAAQ,OAAO,eAAe,WAAW,CAAC;AAAA,QAC1C,MAAM,QAAQ,CAAC,aAAY,YAAY,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACtE,OAAO,IAAI,GAAG,UAAU,SAAS;AAAA;AAAA,MAEnC,OAAO,CAAC,SAAiB,OAAc,YAA4C;AAAA,QACjF,QAAQ,OAAO,eAAe,WAAW,CAAC;AAAA,QAC1C,MAAM,QAAQ,CAAC,aAAY,YAAY,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACtE,OAAO,MAAM,GAAG,UAAU,WAAW,KAAK;AAAA;AAAA,IAE9C;AAAA;AAAA,OAGI,QAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,KAcC;AAAA,IACD,IAAI;AAAA,MAAY,mBAAmB,UAAU;AAAA,IAC7C,mBAAmB,UAAU;AAAA,IAE7B,OAAO,gBACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GACA,KAAK,EACP;AAAA;AAEJ;;AI3jEO,IANP;AAmBA,IAAM,iBAAiB;AAWhB,SAAS,WAAW,CACzB,UACA,QACA,MACS;AAAA,EACT,MAAM,QAAQ,SAAS;AAAA,EACvB,IACE,SACA,OAAO,UAAU,YACjB,YAAY,SACX,MAA8B,WAAW,WAC1C;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAS,yBAAyB,SAAS,+BAA+B,MAAM,IAAI;AAAA,IACtF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,UAAU,CACxB,UAA6B,CAAC,GACW;AAAA,EACzC,MAAM,SAAS,QAAQ,UAAU,iBAAM,UAAU,cAAc;AAAA,EAC/D,MAAM,SAAS,QAAQ,kBAAkB;AAAA,EACzC,MAAM,aAAa,QAAQ;AAAA,EAE3B,OAAO;AAAA,IACL,MAAM;AAAA,IAEN,SAAS,CAAC,MAAM,YAAY;AAAA,MAC1B,MAAM,cAAc,CAClB,MACA,SACG;AAAA,QACH,OAAO,OAAO,WAAmB,SAA2B;AAAA,UAC1D,IAAI,YAAY,QAAQ,UAAU,QAAQ,IAAI,GAAG;AAAA,YAC/C,OAAO,KAAK,QAAQ,GAAG,IAAI;AAAA,UAC7B;AAAA,UACA,MAAM,cAAc,mBAAY,OAAO;AAAA,UACvC,MAAM,YAAY,IAAI;AAAA,UACtB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,YACF,SAAS,MAAM,KAAK,QAAQ,GAAG,IAAI;AAAA,YACnC,OAAO,KAAK;AAAA,YACZ,cAAc;AAAA,YACd,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA;AAAA,UAElE,MAAM,OAAO,OAAO,UAClB,GAAG,eAAe,QAClB;AAAA,YACE;AAAA,YACA,YAAY,EAAE,WAAW,QAAQ,aAAa,KAAK;AAAA,UACrD,GACA,WACF;AAAA,UACA,IAAI,aAAa;AAAA,YACf,KAAK,gBAAgB,WAAW;AAAA,YAChC,KAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,YAAY,QAAQ,CAAC;AAAA,YAC3E,KAAK,IAAI;AAAA,YACT,MAAM;AAAA,UACR;AAAA,UACA,KAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,UAC1C,KAAK,IAAI;AAAA,UAET,OAAO;AAAA;AAAA;AAAA,MAIX,OAAO;AAAA,QACL,KAAK,OAAU,QAAgB,YAA8B;AAAA,UAC3D,IAAI,YAAY,QAAQ,UAAU,QAAQ,KAAK,GAAG;AAAA,YAChD,OAAO,KAAK,IAAI,QAAQ,OAAO;AAAA,UACjC;AAAA,UAOA,MAAM,cAAc,mBAAY,OAAO;AAAA,UACvC,MAAM,YAAY,IAAI;AAAA,UACtB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UAEJ,IAAI;AAAA,YACF,SAAS,MAAM,KAAK,IAAI,QAAQ,OAAO;AAAA,YACvC,OAAO,KAAK;AAAA,YACZ,cAAc;AAAA,YACd,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA;AAAA,UAGlE,IAAI,WAAW,aAAa,CAAC,aAAa;AAAA,YACxC;AAAA,UACF;AAAA,UAEA,MAAM,OAAO,OAAO,UAClB,GAAG,mBACH;AAAA,YACE;AAAA,YACA,YAAY,EAAE,WAAW,QAAQ,aAAa,MAAM;AAAA,UACtD,GACA,WACF;AAAA,UAEA,IAAI,aAAa;AAAA,YACf,KAAK,gBAAgB,WAAW;AAAA,YAChC,KAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,YAAY,QAAQ,CAAC;AAAA,YAC3E,KAAK,IAAI;AAAA,YACT,MAAM;AAAA,UACR;AAAA,UAEA,KAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,UAC1C,KAAK,IAAI;AAAA,UACT,OAAO;AAAA;AAAA,QAET,SAAS,YAAY,WAAW,KAAK,OAAgB;AAAA,QACrD,OAAO,YAAY,SAAS,KAAK,KAAc;AAAA,QAC/C,OAAO,YAAY,SAAS,KAAK,KAAc;AAAA,QAC/C,WAAW,YACT,aACA,KAAK,SACP;AAAA,QACA,OAAO,YAAY,SAAS,KAAK,KAAc;AAAA,QAC/C,MAAO,OACL,QACA,aACA,gBACG;AAAA,UACH,MAAM,cAAc,mBAAY,OAAO;AAAA,UACvC,MAAM,YAAY,IAAI;AAAA,UACtB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,YACF,SAAS,MAAM,KAAK,KAAK,QAAQ,aAAa,WAAW;AAAA,YACzD,OAAO,KAAK;AAAA,YACZ,cAAc;AAAA,YACd,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA;AAAA,UAElE,MAAM,OAAO,OAAO,UAClB,GAAG,oBACH;AAAA,YACE;AAAA,YACA,YAAY,EAAE,WAAW,QAAQ,aAAa,OAAO;AAAA,UACvD,GACA,WACF;AAAA,UACA,IAAI,aAAa;AAAA,YACf,KAAK,gBAAgB,WAAW;AAAA,YAChC,KAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,YAAY,QAAQ,CAAC;AAAA,YAC3E,KAAK,IAAI;AAAA,YACT,MAAM;AAAA,UACR;AAAA,UACA,KAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,UAC1C,KAAK,IAAI;AAAA,UAET,OAAO;AAAA;AAAA,QAET,qBAAsB,OACpB,QACA,aACA,UACA,eACG;AAAA,UACH,IAAI,YAAY,QAAQ,UAAU,QAAQ,qBAAqB,GAAG;AAAA,YAChE,OAAQ,KAAK,oBACX,QACA,aACA,UACA,UACF;AAAA,UACF;AAAA,UACA,MAAM,cAAc,mBAAY,OAAO;AAAA,UACvC,MAAM,YAAY,IAAI;AAAA,UACtB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,YACF,SAAS,MAAO,KAAK,oBACnB,QACA,aACA,UACA,UACF;AAAA,YACA,OAAO,KAAK;AAAA,YACZ,cAAc;AAAA,YACd,cAAc,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA;AAAA,UAElE,MAAM,OAAO,OAAO,UAClB,GAAG,mCACH;AAAA,YACE;AAAA,YACA,YAAY,EAAE,WAAW,QAAQ,aAAa,sBAAsB;AAAA,UACtE,GACA,WACF;AAAA,UACA,IAAI,aAAa;AAAA,YACf,KAAK,gBAAgB,WAAW;AAAA,YAChC,KAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,YAAY,QAAQ,CAAC;AAAA,YAC3E,KAAK,IAAI;AAAA,YACT,MAAM;AAAA,UACR;AAAA,UACA,KAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,UAC1C,KAAK,IAAI;AAAA,UACT,OAAO;AAAA;AAAA,MAEX;AAAA;AAAA,IAGF,MAAM,CAAC,SAAS,SACd,OAAO,gBACL,GAAG,uBACH;AAAA,MACE,YAAY;AAAA,QACV,eAAe,QAAQ;AAAA,QACvB,mBAAmB,QAAQ;AAAA,QAC3B,oBAAoB,QAAQ;AAAA,WACxB,QAAQ,aAAa,EAAE,wBAAwB,QAAQ,WAAW,IAAI,CAAC;AAAA,WACvE,aAAa,WAAW,OAAO,IAAI,CAAC;AAAA,MAC1C;AAAA,IACF,GACA,OAAO,SAAS;AAAA,MACd,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK;AAAA,QAC1B,KAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,QAC1C,OAAO;AAAA,QACP,OAAO,KAAK;AAAA,QACZ,MAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,QAChE,KAAK,gBAAgB,KAAK;AAAA,QAC1B,KAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AAAA,QACrE,MAAM;AAAA,gBACN;AAAA,QACA,KAAK,IAAI;AAAA;AAAA,KAGf;AAAA,EACJ;AAAA;",
19
+ "debugId": "5C1D7E8675006E9B64756E2164756E21",
20
20
  "names": []
21
21
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pg-workflows",
3
3
  "description": "The simplest Postgres workflow engine for TypeScript - durable execution, event-driven orchestration, and automatic retries powered entirely by PostgreSQL",
4
- "version": "0.13.0",
4
+ "version": "0.13.1",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist"